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 + "\n"

+ Path + "\n"

+ Body-MD5 + "\n"

+ Date + "\n"

+ 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("\n", $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

api安全规范的更多相关文章

  1. RESTful API 编写规范

    RESTful API 编写规范 在一个RESTful系统里,客户端向服务端发起索取资源的操作只能通过HTTP协议语义来进行交互.最常用的HTTP协议语义有以下5个: GET GET:发送一条或者多条 ...

  2. API说明书规范

    目录 1       前言 1.1         编写目的 1.2        预期读者 1.3         关于API设计开发 2       API公共说明 3       文档API索引 ...

  3. 分布式事务(二)Java事务API(JTA)规范

    一.引子 既然出现了分布式场景(DTP模型), 大java也及时制定出一套规范来给各大应用服务器.数据库/mq等厂商使用,以方便管理互通--->JTA闪亮登场.JTA(Java Transact ...

  4. restful api编写规范

    Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由.进行认证和测试等话题,内容摘要如下 ...

  5. Restful架构API编码规范

    Restful API 目前比较成熟的一套互联网应用程序的API设计理论 一.协议 API与用户的通信协议,总是使用HTTPs协议. 二.域名 应该尽量将API部署在专用域名之下. https://a ...

  6. RESTful API接口文档规范小坑

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...

  7. 后端api规范说明文档

    我们此次后端api的实现主要是按照RESTful api规范来设计的,就是符合REST架构下设计api的规范.简单的来说REST结构就是:利用URL定位资源,用HTTP动词(GET,POST,PUT, ...

  8. 或许是 WebGIS 下一代的数据规范 - OGC API 系列

    目录 1. 前言 1.1. 经典的 OGC 标准回顾 1.2. 共同特点与时代变化 1.3. 免责声明 2. 什么是 OGC API 2.1. OGC API 是一个开放.动态的规范族 2.2. OG ...

  9. 如何写出安全的API接口?接口参数加密签名设计思路

    开发中经常用到接口,尤其是在面向服务的soa架构中,数据交互全是用的接口. 几年以前我认为,我写个接口,不向任何人告知我的接口地址,我的接口就是安全的,现在回想真是too young,too simp ...

随机推荐

  1. 浙江省赛 ZOJ - 4033

    题意: 第一行给出T代表有几个测试样例, 第二行给出n代表有几个人, 第三行给出一个由0和1组成的字符串,0代表女生,1代表男生. 并且第i个人有i个宝石. 现在要把这些人分为四组,G1 G2 两组是 ...

  2. Pytorch基础——使用 RNN 生成简单序列

    一.介绍 内容 使用 RNN 进行序列预测 今天我们就从一个基本的使用 RNN 生成简单序列的例子中,来窥探神经网络生成符号序列的秘密. 我们首先让神经网络模型学习形如 0^n 1^n 形式的上下文无 ...

  3. Rails render collection 的魔法

    都知道的, 在 Rails 的 View 里边渲染集合的时候, 会用到 render 方法参数的 collection 选项 1 <%= render partial: "produc ...

  4. IOC&AOP

  5. java package 包 学习笔记

    编译命令示例: javac -d . Main.java 注:带参数-d自动建立文件目录, 只使用javac 则需要手工创建目录 把 class文件打包 jar命令 jar cvf T.jar *; ...

  6. day49-线程-事件

    #1.Event里面有一个标志flag,当e = Event()刚创建的时候,flag=False,阻塞,这个时候,e.is_set()也是等于False,阻塞. #e.set()让flag变成非阻塞 ...

  7. soupUI解决md5加密签名,cookie传递

    问题详情: 1.接口调用需要前提状态:登录状态(cookie) 2.接口请求需要签名,签名规则为:MD5(TokenKey+apikey+timestamp+nonc) 其中 1.TokenKey.a ...

  8. inotify+rsync实时同步

    主服务器上安装inotify和rsync,备用服务器上安装rsync 主服务器上修改/etc/rsyncd.conf配置文件 三. 创建密码文件,防火墙设置,客户端和服务器端都要做如下操作 echo ...

  9. iOS补位动画、沙漏效果、移动UITableViewCell、模拟贪吃蛇、拖拽进度等源码

    iOS精选源码 JHAlertView - 一款黑白配色的HUD之沙漏效果 继承UIButton的自定义按钮SPButton 用递归算法实现iOS补位动画 iOS 长按移动UITableViewCel ...

  10. 47)PHP,数据库多表连接

    https://www.w3cschool.cn/mysql/56ik1sqv.html