如果一次合法的“卡密校验请求”能被复制并多次发送,就会出现:
客户端每次请求带时间戳,服务端限制一个接受窗口(例如 5 分钟)。
服务端校验:
客户端每次生成随机 nonce。服务端在时间窗内记住最近见过的 nonce:
签名把 timestamp 与 nonce “绑死”在请求里,避免被改写。一个常见签名串结构:
METHOD\nPATH\nTIMESTAMP\nNONCE\nSHA256(BODY)
然后对该字符串做 HMAC-SHA256(secret_key, message) 得到十六进制签名。
建议把失败原因区分开:
这样线上排查会非常快,也能减少“看起来像网络问题”的误判。
时间窗控制成本,nonce 阻断复制,签名阻断篡改。三者组合才是工程上真正可用的防重放方案。