接口签名与防重放怎么设计?一次讲清时间戳、nonce、签名串与安全校验链路
接口签名与防重放怎么设计一次讲清时间戳、nonce、签名串与安全校验链路大家好我是一名有 4 年工作经验的 Java 后端开发。很多对外接口、开放平台接口真正的难点不只是 token 校验还包括请求有没有被篡改、有没有被重放。这篇文章我想系统聊一聊接口签名与防重放到底怎么设计。个人主页文章目录接口签名与防重放怎么设计一次讲清时间戳、nonce、签名串与安全校验链路一、为什么 token 不够二、典型签名字段有哪些三、防重放怎么做3.1 时间戳校验3.2 nonce 去重3.3 签名串校验四、推荐校验顺序五、最容易踩的坑5.1 nonce 不落库 / 不落缓存5.2 签名串规则不统一5.3 请求体太大直接参与签名5.4 只验签不验时间戳六、面试中怎么回答七、总结八、结尾一、为什么 token 不够很多人会觉得有 token 就够安全了但 token 解决的更多是你是谁它不完全解决请求体有没有被篡改这个请求是不是旧请求重放所以开放接口和高价值接口通常还会做签名时间戳校验nonce 防重放二、典型签名字段有哪些常见会带这些appKeytimestampnoncesign有时还会加请求路径请求方法请求体摘要签名的核心目标是保证请求没被改保证请求不是旧包重放三、防重放怎么做3.1 时间戳校验例如只允许前后 5 分钟内的请求3.2 nonce 去重同一个appKey nonce在有效窗口内只能用一次。通常可以放 Redissign:nonce:{appKey}:{nonce}3.3 签名串校验后端按同样规则重新计算签名和传入的sign比较。四、推荐校验顺序我更建议按这个顺序做校验 appKey 是否合法校验 timestamp 是否过期校验 nonce 是否重复重新生成签名并比对通过后再进入业务逻辑这个顺序比较稳也更容易排查。五、最容易踩的坑5.1 nonce 不落库 / 不落缓存那就无法真正防重放。5.2 签名串规则不统一前后端一旦理解不同很容易验签失败。5.3 请求体太大直接参与签名要考虑稳定的摘要方式而不是直接拼接大文本。5.4 只验签不验时间戳那旧请求依然可能被重放。六、面试中怎么回答如果面试官问你接口签名和防重放一般怎么做你可以这样回答第一token 更多解决身份识别问题而签名和防重放主要解决请求是否被篡改、是否被恶意重复发送的问题所以对开放平台接口或高价值接口我通常会补充时间戳、nonce 和签名机制。第二常见做法是请求里带appKey、timestamp、nonce和sign后端先校验时间戳是否在有效窗口内再用 Redis 等方式确保同一个 nonce 只使用一次最后重新计算签名并比对。第三真正落地时我会特别注意签名串规则统一、请求体摘要稳定和错误码可排查性否则验签问题会很难定位。七、总结接口签名真正难的不是“加个 sign 字段”而是如何把身份识别参数防篡改请求防重放真正串成一套稳定的校验链路。如果只记一句结论我觉得可以记住这句对外高价值接口最稳的安全思路通常不是只靠 token而是“token timestamp nonce sign”组合校验。八、结尾如果你觉得这篇文章对你有帮助欢迎点赞、收藏、关注。后面我会继续整理一些更偏实战的 Java 后端和开放平台设计文章尽量少写空泛概念多写真实项目里会踩到的坑。