2026-02-25
防重放怎么做:时间窗 + Nonce + 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 阻断复制,签名阻断篡改。三者组合才是工程上真正可用的防重放方案。