防重放怎么做:时间窗 + Nonce + HMAC 签名
2026-02-25
防重放 HMAC 签名 安全 接入指南
用最少的状态与最清晰的错误语义,把重放攻击成本抬高到不可接受。

重放攻击为什么危险

如果一次合法的“卡密校验请求”能被复制并多次发送,就会出现:

  • 次数型权益被刷爆
  • 付费功能被绕过
  • 风控策略失效(因为看起来都是“合法请求”)

最小可用方案

1) 时间戳(Timestamp)

客户端每次请求带时间戳,服务端限制一个接受窗口(例如 5 分钟)。

服务端校验:

  • timestamp 是否在窗口内
  • 客户端时间偏差过大时给出可理解的错误提示

2) 随机数(Nonce)

客户端每次生成随机 nonce。服务端在时间窗内记住最近见过的 nonce:

  • 已出现过:判定为重放
  • 未出现:写入 nonce 存储并继续处理

3) HMAC 签名

签名把 timestamp 与 nonce “绑死”在请求里,避免被改写。一个常见签名串结构:

METHOD\nPATH\nTIMESTAMP\nNONCE\nSHA256(BODY)

然后对该字符串做 HMAC-SHA256(secret_key, message) 得到十六进制签名。

错误语义要清晰

建议把失败原因区分开:

  • 签名不匹配
  • timestamp 过期
  • nonce 重复(重放)
  • 密钥不存在/禁用

这样线上排查会非常快,也能减少“看起来像网络问题”的误判。

结论

时间窗控制成本,nonce 阻断复制,签名阻断篡改。三者组合才是工程上真正可用的防重放方案。