s3 authorization v4
参数传递
通过Authorization
请求头
eg:
1 | Authorization: AWS4-HMAC-SHA256 Credential=ziw5dp1alvty9n47qksu/20160830/us-east-1/s3/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7 |
Credential
由AccessKey,请求的日期,region,服务名,aws4_request五部分组成,各部分之间用斜线分隔SignedHeaders
表示那些头参与了签名的计算,未包含在这里的头不会影响到签名的生成Signature
计算得到的签名
通过请求参数
eg:
1 | GET /yourbucket/test.mp4??X-Amz-Algorithm=AWS4-HMAC-SHA256&&X-Amz-Credential=ziw5dp1alvty9n47qksu/20160830/us-east-1/s3/aws4_request&X-Amz-Date=20160830T201207Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7 |
X-Amz-Algorithm
计算签名时使用的Hash算法,指定为AWS4-HMAC-SHA256
X-Amz-Credential
包含了AccessKey,日期,region,服务名的信息X-Amz-Date
请求的时间X-Amz-Expires
指定签名在多长时间内有效X-Amz-SignedHeaders
计算签名时用到的头X-Amz-Signature
计算得的到签名
签名计算
1 | signature = HexEncode(HMAC-SHA256(kSigning, StringToSign)) |
kSigning
1 | kSecret = YourSecretKey |
- YourSecretKey 你的
SecretKey
- Date 8位数的日期,应与Credentail中的Date部分一样
- Region 应与Credential中的region部分一样
- Service 应与Credential中的服务名部分一样
- kSigning 为用于计算签名的signing key
StringToSign
1 | StringToSign = |
- Algorithm 指定为
AWS4-HMAC-SHA256
- RequestDate ISO8601 basic 格式的请求时间,如:
20160830T123600Z
- CredentialScope 日期,region,服务名等组成的字符串, 如:
20160830/us-east-1/s3/aws4_request
- HashedCanonicalRequest Hex(SHA256Hash(CanonicalRequest)),即CanonicalRequest的hash的16进制编码
CanonicalRequest
1 | CanonicalRequest = |
- HTTPRequestMethod 如:
PUT
,GET
,DELETE
,POST
- CanonicalURI 请求的uri
- CanonicalQueryString 请求参数排序后组成的字符串
- CanonicalHeaders 需要加入签名计算的头排序后组成的字符串
- SignedHeaders 加入到签名计算的头的名字的列表,各个名字之间用逗号分隔
- HexEncode(Hash(RequestPayload)) 请求body的hash的16进制编码,如果通过请求参数携带签名,此处应由字符串
UNSIGNED-PAYLOAD
代替