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. 【收藏】每天更新!全网热门公共BT种子 BitTorrent Tracker 列表合集

    每天更新!全网热门公共 BitTorrent Tracker 列表合集. 该项目仅将全网热门的公共 Tracker 列表制作成合集方便大家使用,无需再一个个导入了~. 「English」(tracke ...

  2. PHP 5.3 新特性

    1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...

  3. 使用 try-with-resources 优雅关闭资源

    桂林SEO:我们知道,在 Java 编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等.redis),我们必须在这些外部资源使用完毕后,手动关闭它们. 因为外部资源不由 JVM 管理,无法享 ...

  4. 蓝桥杯练习Day 2

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  5. Different Gene Frequencies in the Two Sexes

    I.7 Different Gene Frequencies in the Two Sexes 假设存在一种基因仅在第一代亲代的不同性别之间的概率有区别,比如,A 在male中频率是Pm,a是(1-P ...

  6. mysql常用方法案例

    SELECTms.id,ms.name,ms.address,ms.mobile AS phone,ms.UUID,(case when ce.score is null then 0 else ce ...

  7. elasticsearch ik中文分词器的使用详解

    (基于es5.4)先喵几眼github,按照步骤安装好分词器 link:https://github.com/medcl/elasticsearch-analysis-ik 复习一下常用的操作 .查看 ...

  8. python关于文件操作

    今日所得 文件操作模式的补充 文件光标的移动控制 截断文件 修改文件 函数的简单介绍 文件操作模式的补充 """ r w a 将上面的三个模式称为纯净模式 r+ w+ a ...

  9. android适配全机型悬浮框、视频APP项目、手势操作、Kotlin妹子App、相机图片处理等源码

    Android精选源码 图片滤镜处理,相机滤镜实时处理,相机拍照录制 android仿爱壁纸App更换壁纸效果源码 基于Kotlin+MVP+Retrofit+RxJava+Glide 等架构实现短视 ...

  10. StartDT AI Lab | 视觉智能引擎——从Face ID说起,浅析顾客数字化

    “顾客就是上帝”,这句西谚揭示了顾客占据着商业活动中心地位这一客观规律.为了能更好地服务顾客,优化商家自身的服务与产品,对顾客的分析与需求调研一直是商业经营分析中的重中之重. 在商业互联网化.社会数字 ...