所谓“重放攻击”,就是攻击者把你某次真实、合法的请求完整复制下来(URL、参数、Header、Body 都一样),在有效期内再次发给服务器,从而导致重复扣款、重复下单、重复转账等。
一个好的开放 API 通常会把“防重放”拆成三层来做:
下面给你一个可落地的“行业常用”方案:Timestamp + Nonce + Body Hash + HMAC/RSA Signature + Replay Cache + Idempotency-Key。
建议统一放在 Header:
X-Api-Key: 调用方标识(公开,用来定位密钥)X-Timestamp: 请求发起时间(毫秒或秒都行,建议毫秒)X-Nonce: 每次请求随机字符串(至少 96bit 随机性,常用 16~32 字节 base64/hex)X-Content-SHA256: 请求体的 SHA-256(空 body 用空字符串 hash)Authorization: 签名信息(比如 HMAC-SHA256 的签名或 RSA 的签名)此外,为“业务幂等”再加:
Idempotency-Key: 业务幂等键(建议 UUID;只对有副作用的接口强制)签名一定要覆盖: