API 接口签名方案实战:防篡改+防重放+防泄漏,三合一设计
引言 去年我们开放了一组 API 给合作方调用。上线两周,安全团队做了一次渗透测试,结果三连暴击: 篡改:合作方调"创建订单"接口,金额参数被中间人从 amount=9900 改成 amount=1,9900 的货一块钱拿走。HTTPS?用的是自建代理抓包改的,HTTPS 只防链路嗅探,不防应用层改包 重放:攻击者抓到一条"发放优惠券"的成功请求,原封不动重放了 873 次,券池被薅干 泄漏:合作方把 secretKey 明文写在前端 JS 里,被 F12 一秒扒走,拿着 key 想签什么签什么 三个问题,一个比一个疼。我们的修复方案叫 timestamp + nonce + sign 三合一签名:时间戳防重放窗口、随机数防重放、HMAC-SHA256 签名防篡改和防 key 泄漏。上线后渗透复测三项全部通过。 这篇文章把整套方案从需求拆解到代码实现完整讲一遍,覆盖: 三合一设计的底层逻辑:每个字段为什么必须有、HTTPS 为什么不够 客户端签名算法:参数排序 → 拼接 → HMAC-SHA256 → Base64 服务端校验全流程:时间窗口 → nonce 去重 → 重算签名比....