yangtao309 / yangtao309.github.com

https://yangtao309-github-com.vercel.app
13 stars 1 forks source link

API签名规范 #11

Open yangtao309 opened 5 years ago

yangtao309 commented 5 years ago

API签名规范

请求样例

Authorization: XYXY-HMAC-SHA256 Credential=1FihRrMitxji/20120525/
zh-cn-shanghai/xyxy-service/xyxy_request, SignedHeaders=host;x-xy-date, 
Signature=79b5ab08173ad52554d3ffaa60ded9fc832d357835a9eb8748a9e08580bdab74

Authorization HTTP请求Header头标识

XYXY-HMAC-SHA256 XYXY签名算法-特定标识

Credential 认证路径串,组成是ACCESS_KEY/X-Xy-Date HTTP头的值/服务区域/服务名称/XYXY服务请求标识

SignedHeaders 参与签名计算的Header

Signature 签名值

规范请求

CanonicalRequest =

HTTPRequestMethod + '\n' +

CanonicalURI + '\n' +

CanonicalQueryString + '\n' +

CanonicalHeaders + '\n' +

SignedHeaders + '\n' +

HexEncode(Hash(RequestPayload))

HTTPRequestMethod 约定成大写的Request method,例如 GET POST。

CannonicalURI 规范 URI 是 URI 的绝对路径部分的 URI 编码版本,该版本是 URI 中的一切 - 从 HTTP 主机到开始查询字符串参数(如果有)的问号字符(“?”)。 对请求url(补上http://前缀)encode处理,java写法 new URI("http://" + encoded).normalize().getRawPath()。

CannonicalQueryString 添加规范查询字符串,后跟换行符。如果请求不包括查询字符串,请使用空字符串(实际上是空白行)。

要构建规范查询字符串,请完成以下步骤:

CannonicalHeaders 规范标头包括您要包含在签名请求中的所有 HTTP 标头的列表。

SignedHeaders 要创建已签名标头列表,请将所有标头名称转换为小写形式,按字符代码对其进行排序,并使用分号来分隔这些标头名称。

RequestPayload 应用SHA-256来对body的值进行hash计算,比如

// POST
String contentForPOST = "{\"ke_id\":120933,\"iss\":\"Tao-Yang\"}";
String contentHashForPOST = Sha256.get(contentForPOST, Charset.forName("UTF8"));

待签字符串结构

StringToSign =

Algorithm + \n +

RequestDateTime + \n +

CredentialScope + \n +

HashedCanonicalRequest

Algorithm 签名算法 XYXY-HMAC-SHA256

RequestDateTime 追加请求日期值。该日期是使用 ISO8601 基本格式以 YYYYMMDD'T'HHMMSS'Z' 格式在 x-xy-date 标头中指定的。

CredentialScope 追加凭证范围值。此值是一个字符串,包含日期、目标区域、所请求的服务和小写字符形式的终止字符串(“xyxy_request”)。区域和服务名称字符串必须采用 UTF-8 编码。

组成规则 date的 YYYYMMDD/region/service/xyxy_request

20120525/zh-cn-shanghai/xyxy-service/xyxy_request

HashedCanonicalRequest 应用SHA-256来对上一步CanonicalRequest进行hash计算。

样例,待签字符串

XYXY-HMAC-SHA256
20150830T123600Z
20150830/us-east-1/service/xyxy_request
da61028f9d164f47170b70dae4b6c08fab4457bc8c01a58d3778c69a6fe11eb0

派生签名秘钥

kSecret = your secret access key

kDate = HMAC("XYXY" + kSecret, Date)

kRegion = HMAC(kDate, Region)

kService = HMAC(kRegion, Service)

kSigning = HMAC(kService, "xyxy_request")

请注意,哈希过程中所使用的日期的格式为 YYYYMMDD(例如,20150830),不包括时间。

将签名信息添加到 Authorization 标头

也就是文章开头的部分。

Authorization: XYXY-HMAC-SHA256 Credential=1FihRrMitxji/20120525/zh-cn-shanghai/xyxy-service/xyxy_request, SignedHeaders=host;x-xy-date, Signature=79b5ab08173ad52554d3ffaa60ded9fc832d357835a9eb8748a9e08580bdab74

参考

aws v4

yangtao309 commented 5 years ago

pdf下载,API签名规范