为什么要参数签名
- 保证接口的数据不会被篡改和重复调用
原理
- 调用端对参数进行加密,服务端也对参数后加密后与调用端加密结果对比
- 加密算法:两端约定好加密算法,加密算法需加盐,通过参数排序、拼接秘钥、MD5等方式进行加密
- 秘钥对:服务端对每个调用端生成appKey和appSecret,appSecret为隐秘信息,调用端本地存储。
调用端
- 预先获取:appKey、appSecret
- 调用:
传参:appKey、timestamp(毫秒时间戳,5秒过期, 防止dos攻击)、业务参数、签名
签名算法:
1. 对参数按照ASCII码表进行排序,得到结果:num: 10, nickName: 小泡芙, username:张三
2. 拼接排序后的字段进行拼接,得到结果:s1 = num10nickName小泡芙username张三
3. 在拼接好的字符串后加上appSecret,得到结果:s2 = secret + s1 + secret
4. 最后使用md5算法:md5(s2)
请求参数示例, 注意:没有传appSecret:
{
"nickName": "小泡芙",
"username": "张三",
"num": 10,
"appKey": "App-3782917398173123-32223",
"timestamp": "2022-10-14 15:53:23",
"sign": "ajhkd123dh8902381273823"
}
-
流程图
image.png
接收端
- 接收参数:
- 验签:
1. 校验时间戳(防止抓取数据后恶意高频访问),判断时间戳是否过期
2. 校验appSecret:获取appSecret,判断是否过期
3. 校验签名:走签名算法生成签名(需要把签名先从参数表移出来),与接收签名对比。 -
流程图:
image.png
网友评论