s3 authorization v4

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
2
3
4
5
kSecret = YourSecretKey
kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")
  • YourSecretKey 你的SecretKey
  • Date 8位数的日期,应与Credentail中的Date部分一样
  • Region 应与Credential中的region部分一样
  • Service 应与Credential中的服务名部分一样
  • kSigning 为用于计算签名的signing key

StringToSign

1
2
3
4
5
StringToSign  =
Algorithm + '\n' +
RequestDate + '\n' +
CredentialScope + '\n' +
HashedCanonicalRequest
  • 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
2
3
4
5
6
7
CanonicalRequest =
HTTPRequestMethod + '\n' +
CanonicalURI + '\n' +
CanonicalQueryString + '\n' +
CanonicalHeaders + '\n' +
SignedHeaders + '\n' +
HexEncode(Hash(RequestPayload))
  • HTTPRequestMethod 如: PUT, GET, DELETE, POST
  • CanonicalURI 请求的uri
  • CanonicalQueryString 请求参数排序后组成的字符串
  • CanonicalHeaders 需要加入签名计算的头排序后组成的字符串
  • SignedHeaders 加入到签名计算的头的名字的列表,各个名字之间用逗号分隔
  • HexEncode(Hash(RequestPayload)) 请求body的hash的16进制编码,如果通过请求参数携带签名,此处应由字符串UNSIGNED-PAYLOAD代替

参考&鸣谢