网络请求签名系统的作用与原理(以HTTPS POST请求为例)
一、签名系统的作用
签名系统就像快递包裹的“封条”。当你在网上点外卖时,商家会在包装袋贴上一个封条。如果封条破损,你就知道包裹可能被打开过。签名系统在HTTP请求中的作用类似,主要解决以下问题:
- 防篡改:确保请求参数(如金额、用户ID)在传输过程中未被修改 。
- 身份验证:证明请求来自合法用户(比如证明你是外卖平台的注册商家)。
- 防重放攻击:避免黑客截获请求后重复发送(比如多次扣款)。
二、核心概念:AK、SK、Sign
-
AK(Access Key)
- 作用:类似“用户名”,用于标识请求方的身份。
- 特点:公开的,会直接放在请求中(如URL参数或请求头)。
- 例子:外卖平台给每个商家分配一个唯一的AK,如
AK=12345
。
-
SK(Secret Key)
- 作用:类似“密码”,用于生成签名。
- 特点:严格保密,只在客户端和服务端存储,绝不传输。
- 例子:商家收到SK
SK=abcde
,但请求中不会出现这个值。
-
Sign(签名)
- 作用:由SK和请求内容生成的“指纹”,用于验证请求的合法性。
- 生成方法:将请求参数、时间戳、AK等数据按规则拼接,再用SK加密(如HMAC-SHA256算法)。
- 例子:请求参数拼接成
user=小明&price=100
,用SK加密后得到sign=xyz987
。
三、签名系统的原理(以网购为例)
假设你在APP下单购买100元的商品:
- 客户端生成签名
- 步骤1:收集请求参数(商品ID、价格、时间戳等),按字母顺序排序并拼接,如
amount=100&item=phone&time=202503121200
。 - 步骤2:将SK(如
SK=abcde
)作为密钥,用加密算法(如HMAC-SHA256)对拼接后的字符串生成签名。 - 步骤3:将AK和签名附加到请求中,如:
- 步骤1:收集请求参数(商品ID、价格、时间戳等),按字母顺序排序并拼接,如
POST /api/order
AK=12345&amount=100&sign=xyz987
- 服务端验证签名
- 步骤1:根据AK找到对应的SK(如数据库查询
AK=12345
对应SK=abcde
)。 - 步骤2:用同样的规则拼接请求参数,并用SK生成签名。
- 步骤3:对比客户端传来的签名和服务端计算的签名。如果一致,说明请求合法;否则拒绝。
- 步骤1:根据AK找到对应的SK(如数据库查询
四、AK/SK和Sign的产生方法
-
AK和SK的分配
- 服务端(如支付宝)为每个用户生成一对AK/SK,通过安全渠道(如加密邮件)分发给客户端。
- AK示例:
AK=8adc3f9d
(随机字符串)。 - SK示例:
SK=5a7e2b8c
(更复杂的随机字符串)。
-
Sign的生成规则
- 规则1:参数排序(如按字母顺序)。
例如:原始参数timestamp=123&user=小明
→ 排序后timestamp=123&user=小明
。 - 规则2:拼接后加密。
例如:拼接字符串amount=100×tamp=123
+ SK → 通过HMAC-SHA256生成sign=xyz987
。 - 规则3:加入时间戳和随机数,防止重放攻击(如1分钟内有效)。
- 规则1:参数排序(如按字母顺序)。
五、类比帮助理解
-
信封类比
- AK像信封上的“寄件人姓名”(公开可见)。
- SK像信封的“火漆印章秘钥”(只有你和收件人有)。
- Sign像火漆印章的图案(用秘钥生成,他人无法伪造)。
-
网购订单类比
- 你填写订单(请求参数)后,用SK生成一个“防伪码”(Sign)。
- 平台收到订单后,用同样的SK重新计算防伪码。如果一致,说明订单未被篡改。
六、总结
- 签名系统是网络请求的“安全卫士”,通过AK/SK和Sign的组合,解决了身份验证、防篡改、防重放三大问题。
- AK用于“你是谁”,SK用于“证明你是你”,Sign是“证明过程”的结果。
- 实际开发中,只需按照接口文档的规则生成Sign即可,加密算法由服务端实现。