3、接口签名sign原理
(1)什么是接口签名?
是使用用户名
,密码
,时间戳
和所有的排过序之后的参数,拼接组合起来成为一个串,再把该串加密得到的字符串,这就是一个签名。
该签名字符串是唯一的有权访问第三方接口的鉴权码。
(2)为什么需要做接口签名
- 防伪装攻击。
- 防篡改攻击。
- 防重放攻击。
- 防数据泄露 。
在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题。其中我认为最终要的还是数据是否被篡改。
(3)接口签名的实践方案
1)、明确请求身份
为开发者分配AccessKey
(开发者标识,确保唯一)和SecretKey
(用于接口加密,确保不易被穷举,生成算法不易被猜测)。
也有的人叫appid
和appsecret
,针对不同的调用方分配不同的appid
和appsecret
。
(一般16-32
位长,字母和数字组成,由开发提供。)
2)、生成signature(签名)
-
步骤1:对所有请求参数按key的
ASCII
码做升序排列。例如:
{"c":"3","b":"2","a":"1"}
排序之后:
{"a":"1","b":"2","c":"3"}
-
步骤2:把请求参数拼接组合成串。
把所有排好序的请求参数,使用URL键值对的格式,即
key1=value1&key2=value2…
的格式,拼接成字符串,设位sign_temp。 -
步骤3:把
AccessKey
和SecretKey
码加入上面拼接好的字符串。可以灵活添加,可以把两个参数都加在字符串sign_temp前面。
也可以把两个参数都加在字符串sign_temp后面,或者一前一后。
例如:
AccessKey=admin&SecretKey=123456&a=1&b=2&c=3
(这个规则都是开发定义好的。)
-
步骤4:用时间戳连接到字符串的尾部。
例如:
AccessKey=admin&SecretKey=123456&a=1&b=2&c=3×tamp=3424234....
-
步骤5:然后再把这个字符串进行MD5加密,加密后再转化成大写。
7CB6DFDCB3BAED652BF6A09D2ACDE34F
这串字符串就是signature(签名)
说明:
这里使用了MD5的算法进行签名,也可以自行选择其他签名方式,例如RSA,SHA等。
-
在请求中带上时间戳,并且把时间戳也作为签名的一部分,在接口提供方对时间戳进行验证,只允许一定时间范围内的请求,例如10分钟。
因为请求方和接口提供方的服务器可能存在一定的时间误差,建议时间戳误差在5分钟内比较合适。
允许的时间误差越大,链接的有效期就越长,请求唯一性的保证就越弱。所以需要在两者之间衡量。
3)、接口的请求参数
已登陆接口为例:
请求参数:
{
"username":"Jerry",
"password":"Test123456",
"signature":"7CB6DFDCB3BAED652BF6A09D2ACDE34F",
"timestamp":"时间戳 "
}
# 提示:
# signature和timestamp参数是提供实现接口加密,
# 但是不参与接口业务逻辑。
服务端收到请求的参数之后,接口会对signature进行解密和判断,是否符合请求标准。
符合标准之后就处理请求返回结果。
4)、编写测试用例
- 获得
AccessKey
和SecretKey
码。 - 通过算法获得signature(签名)。
- 把签名放入请求参数中。
- 剩余步骤与测试普通接口相同。
总结:
我们只要了解接口签名sign原理即可,关于实现代码,可以网上搜索,然后结合自己业务需求进行编码。
这里就不展示实际代码了。