Api接口签名验证(Flask)

 开发  签名  python   2017-11-21 11:38   评论0次 
正文区

前文

    在使用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. 请求参数是否被篡改;

  2. 请求来源是否合法;

  3. 请求是否具有唯一性。

二、经过

1. 前提准备

    接口提供方生成用户密钥,包含:

    1.1 accesskey_id, 标识用户

    1.2 accesskey_secret, 用户加密串(严格保管,仅用于加密不参与通信)

2. 公共参数

    2.1 accesskey_id, 标识用户

    2.2 version, 后端接口版本号

    2.3 timestamp, 10位时间戳(客户端生成时间戳可以适当减几秒)

    2.4 signature, uri请求参数签名(除signature外所有)

    # 另可以定义其他参数,比如signMethod

3. 签名过程

    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. 验证请求:

    4.1 验证版本(非必要)

    4.2 验证时间戳是否有效(小于等于服务器时间戳且在30s之内请求有效)

    4.3 验证accesskey_id是否有效

    4.4 验证签名

四、参考

  1. API接口签名验证(详细描述主流签名方式)
  2. Api:签名验证机制(提及关于POST签名说明)