一个“防止重放”的开放 API 设计长什么样

所谓“重放攻击”,就是攻击者把你某次真实、合法的请求完整复制下来(URL、参数、Header、Body 都一样),在有效期内再次发给服务器,从而导致重复扣款、重复下单、重复转账等。

一个好的开放 API 通常会把“防重放”拆成三层来做:

  1. 传输层:全程 HTTPS(这是底线,不是防重放本体,但能避免被动窃听更容易拿到可重放的请求)
  2. 请求鉴权层:请求必须带时间戳 + 随机数(nonce)+ 签名,服务器做“窗口校验 + nonce 去重 + 签名校验”
  3. 业务层幂等:对于会产生副作用的接口(POST/PUT 付款/创建),再加一个Idempotency-Key,确保“同一业务请求重复提交也只生效一次”

下面给你一个可落地的“行业常用”方案:Timestamp + Nonce + Body Hash + HMAC/RSA Signature + Replay Cache + Idempotency-Key


1) 请求协议(你对外给调用方的规范)

1.1 必要 Header(防重放核心)

建议统一放在 Header:

此外,为“业务幂等”再加:

1.2 签名覆盖范围(非常关键)

签名一定要覆盖: