对象存储会对每个访问的请求进行身份验证,因此您需要在请求中包含签名信息。本文介绍对象存储的 API 签名机制。
通过 AK/SK 对请求进行签名时,TOS 通过验证签名的方式,识别请求的发送者身份。
说明
查看 AKSK 信息的具体步骤,请参见查看 AKSK 信息。
当您想以个人身份向 TOS 发送请求时,首先需要按照 TOS 格式生成签名字符串,再使用 SK 对字符串进行加密。 TOS 收到请求后,以同样的方式进行计算签名。如果计算出来的签名和请求的签名一致,则请求有效,否则 TOS 返回 HTTP 403 错误。
签名可以包含在请求的 Header 中,也可以包含在 URL 的 Query 参数中,您可以根据具体应用场景,使用不同的签名方式。
函数名 | 功能描述 |
---|---|
UriEncode() | 对字符串进行编码,该功能存在以下约束:
|
Lowercase() | 将字符串转换成小写。 |
Hex() | 16 进制编码。 |
SHA256Hash() | SHA256 算法。 |
HMAC-SHA256() | HmacSHA256 算法。 |
Trim() | 删除字符串开头和结尾的空白符。 |
您可以在 HTTP 请求中增加 Authorization 的 Header 来包含签名信息。
Authorization 的计算过程如下:
说明
CanonicalRequest = HTTPMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HashedPayload
参数说明如下。
参数 | 描述 |
---|---|
HTTPMethod | HTTP 请求的 Method,如 PUT、GET、HEAD、DELETE 等。 |
CanonicalURI | UriEncode(
|
CanonicalQueryString | 请求中 Query 参数的编码格式: 说明
|
CanonicalHeaders | 请求中 Header 的编码格式: 说明
|
SignedHeaders | 指明参与签名的 Header 有哪些: 说明
|
HashedPayload | Hex(SHA256Hash( 说明
|
签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
参数说明如下。
参数 | 说明 |
---|---|
Algorithm | 指代签名的算法,目前仅支持 HMAC-SHA256 的签名算法。 |
RequestDate | 指代请求 UTC 时间,请使用如下格式: |
CredentialScope | 指代凭证范围值,格式为: |
CanonicalRequest | 指代上一小节正规化请求的结果。 |
在计算签名前,首先从私有访问密钥(Secret AccessKey)派生出签名密钥(SigningKey),而不是直接使用私有访问密钥。具体计算过程如下:
kSecret = *Your Secret Access Key* kDate = HMAC-SHA256(kSecret, Date) kRegion = HMAC-SHA256(kDate, Region) kService = HMAC-SHA256(kRegion, "tos") kSigning = HMAC-SHA256(kService, "request")
Signature = HexEncode(HMAC-SHA256(kSigning, StringToSign))
然后构建 Header:
Authorization: TOS4-HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
表达式中{}
部分表示上文计算的中间过程。
以下载对象为例,相关信息如下。
参数 | 值 |
---|---|
桶名 | examplebucket |
对象名 | exampleobject |
区域 | cn-beijing |
时间 | Sat, 1 Jan 2022 00:00:00 GMT |
AccessKeyId | testAK |
SecretAccessKey | testSK |
GET /exampleobject host:examplebucket.tos-cn-beijing.volces.com x-tos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-tos-date:20220101T000000Z host;x-tos-content-sha256;x-tos-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
TOS4-HMAC-SHA256 20220101T000000Z 20220101/cn-beijing/tos/request c5b4f2fac36f0a3351d91753998bd811d1c446c186a2b3fb2b9e420630f13534
HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("testSK", "20220101"), "cn-beijing"), "tos"), "request")
d40b66cf0054d1642843670d10fa095e1609c7896f25df217770b0abe717693b
TOS4-HMAC-SHA256 Credential=testAK/20220101/cn-beijing/tos/request, SignedHeaders=host;x-tos-content-sha256;x-tos-date, Signature=d40b66cf0054d1642843670d10fa095e1609c7896f25df217770b0abe717693b