前文
在使用Api场景的系统交互时,使用API签名,即保证请求的数据正确性和接口安全,又能识别API调用者的身份。
以下以一种常见方式演示:
公共参数加请求参数排序后,再加上密钥,最后使用诸如md5、hmac等加密生成signature值,作为请求参数。
这种签名方式:
牵一发而动全身,公共参数包含时间戳参数亦可防止拦截URL多次请求,包含accesskey\_id以识别调用者,较有通用性。
更多介绍参考:
简书:<http://www.jianshu.com/p/d47da77b6419>
阿里云:<https://help.aliyun.com/document_detail/54229.html>
示例
GitHub flask-apiSign-demo:https://github.com/staugur/flask-apiSign-demo
使用
cd server;pip install \-r requirements.txt
python main.py
客户端
Python、Shell
JavaScript(HTML)
签名描述
一、起因
为了实现基本的防抓取机制,对绝大多数采用了 Api 签名验证,在保证签名秘钥不泄露的前提下,具有一定的数据抓取防御能力。
请求参数是否被篡改;
请求来源是否合法;
请求是否具有唯一性。
二、经过
前提准备
接口提供方生成用户密钥,包含:
1.1 accesskey_id, 标识用户
1.2 accesskey_secret, 用户加密串(严格保管,仅用于加密不参与通信)
公共参数
2.1 accesskey_id, 标识用户
2.2 version, 后端接口版本号
2.3 timestamp, 10位时间戳(客户端生成时间戳可以适当减几秒)
2.4 signature, uri请求参数签名(除signature外所有)
另可以定义其他参数,比如signMethod
签名过程
3.1.对除签名外的所有请求参数按key做的升序排列。
例如:有b=2一个私有参数,另加上公共参数后,按key排序后为:accesskey_id、b、timestamp、version
3.2 把排序后的参数以"参数名=参数值&“的形式连接,末尾再加上"accesskey_secret"值,得到拼装字符串。
例如:accesskey_id=test&b=2×tamp=1511232761&version=v1&accesskey_secret
3.3 将上一步得到的字符串MD5加密并转化为大写。
例如:signature=F833B331E572FD9D3D64A8D0737490B0
3.4 最终请求示例。
timestamp=1511232761&b=2&version=v1&accesskey_id=test&signature=F833B331E572FD9D3D64A8D0737490B0
验证请求:
4.1 验证版本(非必要)
4.2 验证时间戳是否有效(小于等于服务器时间戳且在30s之内请求有效)
4.3 验证accesskey_id是否有效
4.4 验证签名