zoukankan      html  css  js  c++  java
  • api安全规范

    1. API签名的目的


        校验API调用者的身份,是否有权访问
        校验请求的数据完整性,防止被中间人篡改
        防止重放攻击


    2.基本概念


    AccessKey: API使用者向API提供方申请的Access Key(或AppId), 用于标识API使用者的身份。

    SecretKey:由API服务提供方分配,API使用方自己保存,用来做签名时的密钥。

    Signature:根据Key和用户请求计算出的数字签名,用于验证用户身份。


    3.基于签名的认证过程

    客户端

        构建HTTP请求,填写必要的Date等HTTP首部信息
        按签名算法计算出Signature
        将AccessKey和Signature置于“Authorization”首部中。格式"Authorization: LETV  AccessKey Signature"
        发送HTTP请求

    服务端

        收到请求,从Authorization中得到AccessKey和签名
        根据AccessKey取得此应用对应的SecretKey
        用SecretKey和请求内容进行签名,得到服务端签名
        对比服务端签名和用户请求解析出来签名,如果一致则认证通过,否则认证不通过

    4.签名算法

    签名计算:

    Signature = Hmac-Sha1(SecretKey, StringToSign)

    签名字符串(StringToSign)的构造:

    StringToSign =

    HttpMethod + " "

     + Path + " "

     + Body-MD5 + " "

     + Date + " "

     + param-string

        HttpMethod:HTTP请求方法,如GET、POST、PUT、DELETE,需大写。
        Path:URI path,如/api/v1/message
        Body-MD5:HTTP Body的MD5摘要,小写。如果body为空,Body-MD5为空字符串
        Date:HTTP首部字段,请求的当前时间。格式遵循rfc822,如Mon, 24 Nov 2014 12:11:17 GMT
        param string:
        将所有参数(包括GET或POST的参数,忽略值为空的参数)格式化为“key=value”格式,如“k1=v1”、“k2=v2”、“k3=v3” 包括url参数和POST请求的表单方式,当参数为json的情况下不参与,将格式化好的参数键值对以字典序升序排列后,拼接在一起,如  "k1=v1&k2=v2&k3=v3",根据HTTP协议要求,传递参数都需要对参数值做URL Encoding,这样请求接受方才能接受到正确的参数值。这种情况下,做签名时使用的应该是原生值而不是encoding之后的值。

    签名PHP代码

    签名代码-PHP
    <?php
    $key = 'appsec_ckeasUHYFkAvEitqagAr';
    $body = '{"content":"just a test","msg_type":1,"push_type":1}';
    $date = 'Tue, 25 Nov 2014 14:00:52 CST';
    echo _getSign($key, $body, $date);
    //时间的生成
    //echo date('D, d M Y H:i:s T');
     function _getSign($key, $body, $date){
         $md5_body = md5($body);
         $sign=array("POST", "/api/v1/message",$md5_body,$date,"");
         $sign=implode("
    ", $sign);
            
        return hash_hmac('sha1',$sign, $key);;
    }

    示例
    调用接口推送消息。假设用户已经创建过App,服务端分配了AppId和AppSec。

    AppId为:appid_b515357337f7415ab9275df7a3f92d94

    AppSec为:appsec_ckeasUHYFkAvEitqagAr

    此接口的HttpMethod为:POST

    Path为:/api/v1/message

    推送的参数以json格式通过body传递,body内容为:{"content":"just a test","msg_type":1,"push_type":1}

    计算出的Body-MD5为:7eb8c78f1834ac82d0203a5a0a35ce80

    取得当前时间Date为:Tue, 25 Nov 2014 14:00:52 CST

    推送消息没有URL参数,所以param string为空。

    StringToSign为:
    "POST
    /api/v1/message
    7eb8c78f1834ac82d0203a5a0a35ce80
    Tue, 25 Nov 2014 14:00:52 CST
    "

    对StringToSign进行Hmac-Sha1签名,得到Signature:3b635f825d3c34eb6497b636e35e81777ef3c659

    将Date和Authorization加入HTTP报文首部

    最终发送的HTTP报文如下:
    POST /api/v1/message HTTP/1.1
    Host: push.scloud.letv.com
    Authorization: LETV appid_b515357337f7415ab9275df7a3f92d94 3b635f825d3c34eb6497b636e35e81777ef3c659
    Date: Tue, 25 Nov 2014 14:00:52 CST
     
    {"content":"just a test","msg_type":1,"push_type":1}

    参考资料

    《HTTP权威指南》

    List of HTTP header fields

    http://dev.xiaomi.com/doc/p=4933/index.html

  • 相关阅读:
    用WinForm写的员工考勤项目!!!!!!
    洛谷P1892《[BOI2003]团伙》
    洛谷P1821《[USACO07FEB]银牛派对Silver Cow Party》
    洛谷P1149《火柴棒等式》
    2017 国庆清北刷题冲刺班《角谷猜想》
    洛谷P2330《[SCOI2005]繁忙的都市》
    洛谷P1955《[NOI2015]程序自动分析》
    洛谷P1536《村村通》
    Windows 10 体验记
    洛谷P1102《A-B数对》
  • 原文地址:https://www.cnblogs.com/phpfans/p/4617471.html
Copyright © 2011-2022 走看看