HTTP Sign - RESTful API 签名认证框架


Apache
跨平台
Java

软件简介

HTTP Sign 是一个RESTful API 签名认证项目。
该项目将解决HTTP通信中的如下问题:

  • 防止重放攻击

  • 防止中途篡改数据

  • 保证请求服务幂等

从而,尽可能地让 HTTP 通信接近安全。

HTTP Sign 的设计

字面约定

字面格式 含义
< > 变量
[ ] 可选项
{ } 必选项
| 互斥关系
标点符号 本文一律采用英文标点符号

请求参数名,命名规则

  1. 首字母小写,如果名称由多个单词组成,每个单词的首字母要大写

  2. 英文缩写词一律小写

  3. 只能由 [A~Z]、[a~z]、[0~9] 以及字符”-“、”_”、”.” 组成参数名

  4. 不能以数字开头

  5. 不允许出现中文及拼音命名

术语表

术语 全称 中文 说明
RS RESTful Web Services WEB REST服务 REST 架构风格的Web服务
SecurityGroup Security Group 安全组 安全组制定安全策略
GMT Greenwich Mean Time 格林尼治标准时间 指位于英国伦敦郊区的皇家格林尼治天文台的标准时间
URIPath Uniform Resource Identifier Path 统一资源标识符的路径 用于标识某一互联网资源路径
RFC Request For Comments 一系列以编号排定的文件 几乎所有的互联网标准都有收录在RFC文件之中

相关名词解释

  1. 字典升序排列
    如同在字典中排列单词一样排序,按照字母表递增顺序排列,参与比较的两个单词,若它们的第一个字母相同,就比较第二个字母,依此类推.
    例如: zhong zhang zheng zhen, 做字典升序排列后的结果是 zhang zhen zheng zhong.

  2. 幂等性
    接口在设计上可以被完全相同的URL重复调用多次,而最终得到的结果是一致的.

使用限制

请求端的当前时间与服务器的当前时间之差的绝对值不能大于10分钟,否则拒绝处理.
也就是说,请求端的时间不能比服务器时间快10分钟或慢10分钟,否则,服务器不受理.

请求结构

  1. 服务地址
    接口按照功能划分成了不同的功能模块,每个模块使用不同的域名或上下文访问,具体域名或上下文请参考各个接口的文档.

  2. 通信协议
    所有接口均采用HTTPS通信.

  3. 请求方法
    支持 [GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS].

  4. 字符编码
    在无特别说明情况下,均使用UTF-8编码.

  5. API请求结构

名称 描述 备注
API入口 API调用的RS服务的入口 `https:///path/hi`
公共header 每个接口都包含的通用请求头 详见 [公共参数](https://gitee.com/xixifeng.com/httpsign#%E5%85%AC%E5%85%B1%E8%AF%B7%E6%B1%82%E5%A4%B4common- request-headers)
公共参数 每个接口都包含的通用参数 详见 [公共参数](https://gitee.com/xixifeng.com/httpsign#%E5%85%AC%E5%85%B1%E8%AF%B7%E6%B1%82%E5%A4%B4common- request-headers)

公共参数

公共请求头(Common Request Headers)

名称 是否必选 描述
Authorization 用于验证请求合法性的认证信息
Accept 默认:"application/json",表示发送端(客户端)希望从服务端接受到的数据类型
Content-Length [RFC2616](https://tools.ietf.org/html/rfc2616)中定义的HTTP请求内容长度(一般的http客户端工具都会自动带上这个请求头)
Date HTTP 1.1协议中规定的GMT时间,例如:Wed, 28 Mar 2018 09:09:19 GMT
Host 访问Host值(一般的http客户端工具都会自动带上这个请求头)

公共请求参数(Common Http Request Parameters)

名称 是否必选 类型 描述
version `String` API 版本号,当前值为1
action `String` 接口的指令名称,如:action=myInfo
nonce `String` 随机数,长度范围[8,36]
accessKeyId `String` 在云API密钥上申请的标识身份的 accessKeyId,一个 accessKeyId 对应唯一的 accessKeySecret , 而 accessKeySecret 会用来生成请求签名 Signature
signatureMethod `String` 签名算法,目前支持HMACSHA256和HMACSHA1.默认采用:HMACSHA1验证签名
token `String` 临时证书所用的Token,需要结合临时密钥一起使用

服务端将从 QueryString 获得这些参数。

签名机制

用户在HTTP请求中增加Authorization的Header来包含签名(Signature)信息,表明这个消息已被签名,认证是否通过,服务端说了算。