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 + "\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安全规范的更多相关文章
- RESTful API 编写规范
RESTful API 编写规范 在一个RESTful系统里,客户端向服务端发起索取资源的操作只能通过HTTP协议语义来进行交互.最常用的HTTP协议语义有以下5个: GET GET:发送一条或者多条 ...
- API说明书规范
目录 1 前言 1.1 编写目的 1.2 预期读者 1.3 关于API设计开发 2 API公共说明 3 文档API索引 ...
- 分布式事务(二)Java事务API(JTA)规范
一.引子 既然出现了分布式场景(DTP模型), 大java也及时制定出一套规范来给各大应用服务器.数据库/mq等厂商使用,以方便管理互通--->JTA闪亮登场.JTA(Java Transact ...
- restful api编写规范
Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由.进行认证和测试等话题,内容摘要如下 ...
- Restful架构API编码规范
Restful API 目前比较成熟的一套互联网应用程序的API设计理论 一.协议 API与用户的通信协议,总是使用HTTPs协议. 二.域名 应该尽量将API部署在专用域名之下. https://a ...
- RESTful API接口文档规范小坑
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...
- 后端api规范说明文档
我们此次后端api的实现主要是按照RESTful api规范来设计的,就是符合REST架构下设计api的规范.简单的来说REST结构就是:利用URL定位资源,用HTTP动词(GET,POST,PUT, ...
- 或许是 WebGIS 下一代的数据规范 - OGC API 系列
目录 1. 前言 1.1. 经典的 OGC 标准回顾 1.2. 共同特点与时代变化 1.3. 免责声明 2. 什么是 OGC API 2.1. OGC API 是一个开放.动态的规范族 2.2. OG ...
- 如何写出安全的API接口?接口参数加密签名设计思路
开发中经常用到接口,尤其是在面向服务的soa架构中,数据交互全是用的接口. 几年以前我认为,我写个接口,不向任何人告知我的接口地址,我的接口就是安全的,现在回想真是too young,too simp ...
随机推荐
- POJ-2349 Arctic Network(最小生成树+减免路径)
http://poj.org/problem?id=2349 Description The Department of National Defence (DND) wishes to connec ...
- vim下看C++代码
看C++代码, 缺少合适的编辑器,捣鼓vim. 安装Vundle, 用于插件管理 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vi ...
- 表查询语句及使用-连表(inner join-left join)-子查询
一.表的基本查询语句及方法 from. where. group by(分组).having(分组后的筛选).distinct(去重).order by(排序). limit(限制) 1.单表查询: ...
- 十三、linux-mysql的mysql的核心优化思想
一.数据库运维管理思想核心 1.未雨绸缪,不要停留在制度上,而是要实际做出来 2.亡羊补牢,举一反三,不要好了伤疤忘了疼 3.完善的框架设计及备份.恢复策略 4.定期思考,并实战模拟以上策略演练 二. ...
- plsql中文显示问号
1. select userenv('language') from dual 2. 复制查询的值配置系统环境变量 NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 3.配置系统环 ...
- easyui 表单提交前的 confirm 处理
最近学习用 easyui,异步提交表单是遇到一个小问题 $('#fModiDetail').form('submit',{ url:'...', onSubmit:function(){ if($(t ...
- 忘记mysql root用户密码的解决办法(skip-grant-tables)
skip-grant-tables顾名思义,数据库启动的时候 跳跃权限表的限制,不用验证密码,直接登录. 注意: 这种情况只有在忘记root密码 不得已重启数据库的情况下使用的.现网环境慎用,需要重启 ...
- spring cache问题记录
1.是否可以设置过期时间 timeout ttl 对于单个key设置过期时间 需要自定义CacheManager, 见3中的问题 spring boot 1版本可以重写RedisCacheManage ...
- css样式表----------样式属性(背景与前景、边界和边框、列表与方块、格式与布局)
一.背景与前景 (1).背景 line-height: 1.5 !important;">90; /*背景色(以样式表为主,样式表优先.)*/ background-image:url ...
- UTF虚拟对象
虚拟对象: 虚拟对象是为了让UFT识别某些不能识别的控件,把这些控件的范围定义为虚拟对象. 新建虚拟对象 管理虚拟对象 创建虚拟对象之后可通过菜单tools-Virutal Objects-Virut ...