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. c#为什么要用事物

    一.事务的定义 所谓事务,它是一个操作集合,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.典型的例子就像从网上银行系统的帐户A转帐到帐户B,它经过两个阶段:1.从帐户A取出款项.2.把 ...

  2. TPO5-1 Minerals and plants

    Only recently have investigators considered using these plants to clean up soil and waste sites that ...

  3. 爬虫—文件存储—CSV存储

    一,简介 CSV,全称Comma—Separated Values,可以称为逗号分隔或者字符分隔值,其文件以纯文本形式存储表格数据.该文件是一个字符序列,可以有任意的数目记录组成,记录间已某种换行符分 ...

  4. sockaddr_in 转成string

    string strAcceptIp = inet_ntoa(remoteAddr.sin_addr);

  5. dw通过iis运行asp网站总结

    ASP站点主要是结合iis和dw软件运行和浏览的 1.首先在本地先建立一个测试文件夹webs 2.打开iis管理器 3.建立创建网站 这里有个 4.dw中创建站点,并导入asp项目 下边的url是根据 ...

  6. HDU-4578 Transformation(线段树的多种区间操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others)    Memory Lim ...

  7. redis簡單命令

  8. 《C 程序设计语言》练习1-4

    #include<stdio.h> /*当celsius=0,1,...,100时,打印摄氏温度与华氏温度对照表; 浮点数版本*/ main () { float fahr,celsius ...

  9. Date类与SimpleDateFormat类中parse()方法和format()方法

    package ppt11util类; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  10. iOS传感器集锦、飞机大战、开发调试工具、强制更新、Swift仿QQ空间头部等源码

    iOS精选源码 飞机大作战 MUPhotoPreview -简单易用的图片浏览器 LLDebugTool是一款针对开发者和测试者的调试工具,它可以帮... 多个UIScrollView.UITable ...