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 ...
随机推荐
- java常用工具类(二)
1.FtpUtil package com.itjh.javaUtil; import java.io.File; import java.io.FileOutputStream; import ja ...
- 吴裕雄--天生自然 PYTHON3开发学习:网络编程
# 导入 socket.sys 模块 import socket import sys # 创建 socket 对象 serversocket = socket.socket( socket.AF_I ...
- kotlin 单例模式
class Single{ companion object { val instance:Single by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZE ...
- visual studio code快捷键(mac)
常用快捷键 命令 命令描述 备注 ctl+j 多行文字变成一行 打开首选项->键盘快捷方式->搜索 joinLines: 然后设置你的快捷键再回车即可.
- 【Java杂货铺】JVM#Class类结构
代码编译的结果从本地机器码转为字节码,是储存格式发展的一小步,却是编程语言的一大步.--<深入理解Java虚拟机> 计算机只认识0和1.所以我们写的编程语言只有转义成二进制本地机器码才能让 ...
- 【网络流+贪心】Homework
题目描述 Taro is a student of Ibaraki College of Prominent Computing. In this semester, he takes two cou ...
- 24)PHP,数据库的基本知识
(1)数据库操作的基本流程: • 建立连接(认证身份) • 客户端向服务器端发送sql命令 • 服务器端执行命令,并返回执行的结果 • 客户端接收结果(并显示) • 断开连接 (2)php中操作数据库 ...
- hdu2876 Connections between cities(LCA倍增)
图不一定联通,所以用并查集找各个联通块的祖先分别建图,之后就和LCA的步骤差不多了 #include<iostream> #include<cstring> #include& ...
- day10-time模块
import time print(time.time()) #时间戳1553070877.0166008 print(time.strftime('%Y-%m-%d %H %M %S')) #201 ...
- reviewer回信
收到reviewer回信之后的情况 Peer review其实是一个CA(质检)过程.文章投稿后的几种状态:Reject.resubmit和revise-and-resubmit. 收到回信之后,re ...