You need to enable JavaScript to run this app.
文档中心
对象存储

对象存储

复制全文
下载 pdf
Header 中包含签名
多分块上传的签名机制
复制全文
下载 pdf
多分块上传的签名机制
本文介绍使用多分块上传时的签名计算过程、以及签名示例。​
签名所需函数​
​
函数名称​
描述​
UriEncode()​
对字符串进行编码,编码限制如下:​
  • 除了 A~Z、a ~ z、0~9、-、.、_、~ 字符,其他字符都需要编码。​
  • 空格需要编码为 %20(不支持编码为 +)。​
  • 每个 URI 编码字节由 % 和两位十六进制数组成。十六进制值必须是大写。​
  • 除了对象名中的 / 无需编码,其他情况下 / 都需要编码。​
Lowercase()​
将字符串转换成小写。​
Hex()​
16 进制编码。​
SHA256Hash()​
SHA256 算法。​
HMAC-SHA256()​
HmacSHA256 算法。​
Trim()​
删除字符串开头和结尾的空白符。​
​
签名 Header​
​
Header 名称​
描述​
x-tos-content-sha256​
用于指定客户端上传文件的格式,以及使用的签名方式,取值说明如下:​
  • STREAMING-TOS4-HMAC-SHA256-PAYLOAD:表示 Header 中包含 TOS V4 基础签名,数据中包含基于 HMAC-SHA256 计算的链式签名,数据末尾不包含 Trailing Header。​
  • STREAMING-TOS4-HMAC-SHA256-PAYLOAD-TRAILER:表示 Header 中包含 TOS V4 基础签名,数据中包含基于 HMAC-SHA256 计算的链式签名,数据末尾包含 Trailing Header。​
  • STREAMING-UNSIGNED-PAYLOAD-TRAILER:表示 Header 中包含 TOS V4 基础签名,数据中不包含链式签名,数据末尾包含 Trailing Header。​
  • STREAMING-UNSIGNED-PAYLOAD:表示 Header 中包含 TOS V4 基础签名,数据中不包含链式签名,数据末尾不包含 Trailing Header。​
Content-Encoding​
本场景下,Content-Encoding 值建议包含 tos-chunked 时,表示允许使用多分块的方式上传数据,需要配合 x-tos-content-sha256 使用。​
说明​
在保存对象时,TOS 不会将 tos-chunked 属性作为用户数据保存,下载对象时也不会在 Content-Encoding 返回 tos-chunked 属性。​
x-tos-decoded-content-length​
用于服务端校验接收到的有效数据长度是否正确。可选,设置为原始文件大小。​
说明​
设置 x-tos-decoded-content-length 值时,不包含由多分块编码引入的格式数据、签名数据、Trailing Header 数据的长度。例如:要上传一个 4GB的文件,将值设置为 4294967296。​
Content-Length​
可选,HTTP 请求体的长度。​
说明​
  • 设置 Content-Length 值时,需要包含由多分块编码引入的格式数据、签名数据、Trailing Header 数据的长度。​
  • Transfer-Encoding: chunked 传输方式下,需要缺省。​
​
签名计算过程​
说明​
  • Hash 代指 SHA256 算法。​
  • HexEncode 代指转 16 进制编码。​
  • TOS 兼容 S3 Multiple Chunks 签名的访问请求,您也可以使用 S3 Multiple Chunks 签名的方式上传对象到 TOS。​
计算种子签名​
步骤 1:构造规范化请求 (CanonicalRequest)​
​
CanonicalRequest = ​
HTTPMethod + '\n' + ​
CanonicalURI + '\n' + ​
CanonicalQueryString + '\n' + ​
CanonicalHeaders + '\n' + ​
SignedHeaders + '\n' + ​
HashedPayload​
​
参数说明如下。​
​
参数​
描述​
HTTPMethod​
HTTP 请求的 Method,如 PUT、GET、HEAD、DELETE 等。​
CanonicalURI​
UriEncode(<PATH>)​
  • 如果 URL 中的 PATH 为空,则 CanonicalURI为/。​
  • 如果完整路径为 [https://bucketname.tos-cn-beijing.volces.com/object](https://bucketname.tos-cn-beijing.volces.com/object),则 CanonicalURI 为 /object。​
CanonicalQueryString​
请求中 Query 参数的编码格式:​
UriEncode(<QueryParam1>) + '=' + UriEncode(<value>) + '&' + UriEncode(<QueryParam2>) + '=' + UriEncode(<value>) + '&' +​
...​
UriEncode(<QueryParamN>) + '=' + UriEncode(<value>)​
说明​
  • 请求中的 Query 参数编码后按照 ASCII 字节顺序进行上述格式处理。​
  • 所有 Query 参数必须参与计算。​
  • 如果没有 Query 参数,则 CanonicalQueryString 为空字符串。​
CanonicalHeaders​
请求中 Header 的编码格式:​
Lowercase(<HeaderName1>) + ':' + Trim(<value>) + '\n'​
Lowercase(<HeaderName2>) + ':' + Trim(<value>) + '\n'​
...​
Lowercase(<HeaderNameN>) +':' + Trim(<value>) + '\n'​
说明​
  • HeaderName 按字典序排列。​
  • CanonicalHeaders 不需要包含全部头域。​
  • 如果请求中存在 Content-Type 头域,则 CanonicalHeaders 必须包含该头域。​
  • CanonicalHeaders 必须包含 host 头域。​
  • 使用临时 AK/SK 鉴权时,必须携带 x-tos-security-token,CanonicalHeaders 必须包含该头域。​
  • CanonicalHeaders 必须包含所有 x-tos-* 的头域。​
SignedHeaders​
指定参与签名的 Header :​
Lowercase(<HeaderName1>) + ';' + Lowercase(<HeaderName2>) + ... + Lowercase(<HeaderNameN>)​
说明​
  • CanonicalHeaders 中的 HeaderName 按字典序排列。​
  • SignedHeaders 中的 HeaderName 必须在请求的头域中。​
HashedPayload​
常量:STREAMING-TOS4-HMAC-SHA256-PAYLOAD​
​
步骤 2:创建签名字符串 (StringToSign)​
签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:​
​
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))​
​
参数说明如下。​
​
参数​
说明​
Algorithm​
签名的算法,目前仅支持 HMAC-SHA256 的签名算法。​
RequestDate​
请求 UTC 时间,请使用如下格式:yyyyMMddTHHmmssZ。​
CredentialScope​
凭证范围值,格式为:yyyyMMdd/region/tos/request。​
CanonicalRequest​
上一小节正规化请求的结果。​
​
步骤 3:计算签名秘钥(SigningKey)​
在计算签名前,首先从私有访问密钥(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")​
​
步骤 4:计算种子签名​
​
Signature = HexEncode(HMAC-SHA256(kSigning, StringToSign))​
​
步骤 5:构建 Authorization Header​
​
Authorization: TOS4-HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope},SignedHeaders={SignedHeaders}, Signature={Signature}​
​
计算链式签名​
计算每个分块的签名​
步骤 1 :创建待签名字符串 (StringToSign)​
签名字符串由签名算法、请求日期、信任状、前一个签名字符串、空行哈希值、分块内容哈希值组成,伪代码如下:​
​
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + PreviousSignature + '\n' + Hash("") + '\n' + Hash(ChunkData)​
​
说明​
  • PreviousSignature 指前一个分块的签名。如果当前分块是第一个分块,那么 PreviousSignature 指步骤 4:计算种子签名获得的 SeedSignature。​
  • Hash("") 为固定值:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855。​
步骤 2:计算签名字符串​
本步骤计算过程与计算种子签名的步骤 3 和步骤 4 类似,具体计算过程,请参见步骤 3:计算签名秘钥(SigningKey)和步骤 4:计算种子签名,执行完成后,将获得 ChunkSignature。​
步骤 3:构建分块的负载​
将签名内容拼接到有效数据前方,格式如下:​
​
string(IntHexBase(ChunkSize)) + ";chunk-signature=" + ChunkSignature + \r\n + ChunkData + \r\n​
​
  • IntHexBase() :将整数转化为十六进制数的函数。例如,若分块大小为 65536,则十六进制字符串为 10000。​
  • ChunkSize:分块有效数据大小,不包含签名和格式数据。​
  • ChunkData:分块有效数据。​
计算最后一个分块的签名​
在最后一个有效分块后,添加空分块的签名。具体计算过程,请参见计算每个分块的签名的步骤1 ~ 步骤 3,区别在于 ChunkData 为空。​
签名示例​
以下载对象为例,相关信息如下。​
​
参数​
值​
桶名​
examplebucket​
对象名​
exampleobject​
区域​
cn-beijing​
时间​
Sat, 1 Jan 2022 00:00:00 GMT​
AccessKeyId​
testAK​
SecretAccessKey​
testSK​
​
计算种子签名​
步骤 1:构造规范化请求 (CanonicalRequest)​
​
PUT​
/exampleobject​
​
host:examplebucket.tos-cn-beijing.volces.com​
x-tos-date:20220101T000000Z​
Content-Encoding: tos-chunked​
x-tos-content-sha256:STREAMING-TOS4-HMAC-SHA256-PAYLOAD-TRAILER​
​
host;x-tos-content-sha256;x-tos-date​
STREAMING-TOS4-HMAC-SHA256-PAYLOAD​
​
步骤 2:创建签名字符串 (StringToSign)​
​
TOS4-HMAC-SHA256​
20220101T000000Z​
20220101/cn-beijing/tos/request​
c5b4f2fac36f0a3351d91753998bd811d1c446c186a2b3fb2b9e420630f13534​
​
步骤 3:计算签名秘钥(SigningKey)​
​
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855​
​
步骤 4:计算种子签名​
​
d40b66cf0054d1642843670d10fa095e1609c7896f25df217770b0abe717693b​
​
步骤 5:构建 Authorization Header​
​
TOS4-HMAC-SHA256 Credential=testAK/20220101/cn-beijing/tos/request,SignedHeaders=host;x-tos-content-sha256;x-tos-date,Signature=d40b66cf0054d1642843670d10fa095e1609c7896f25df217770b0abe717693b​
​
计算链式签名​
步骤 1:计算并添加第一个分块签名​
​
示例​
值​
签名字符串 (StringToSign)​
TOS4-HMAC-SHA256-PAYLOAD​
20220101T000000Z​
20220101/cn-beijing/tos/request​
d40b66cf0054d1642843670d10fa095e1609c7896f25df217770b0abe717693b​
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855​
bf718b6f653bebc184e1479f1935b8da974d701b893afcf49e701f3e2f9f9c5a​
签名​
b474d8862b1487a5145d686f57f013e54db672cee1c953b3010fb58501ef5aa2​
分块数据​
10000;chunk-signature=b474d8862b1487a5145d686f57f013e54db672cee1c953b3010fb58501ef5aa2​
<65536-bytes>​
​
步骤 2:计算并添加第二个分块签名​
​
示例​
值​
签名字符串 (StringToSign)​
TOS4-HMAC-SHA256-PAYLOAD​
20220101T000000Z​
20220101/cn-beijing/tos/request​
b474d8862b1487a5145d686f57f013e54db672cee1c953b3010fb58501ef5aa2​
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855​
41edece42d63e8d9bf515a9ba6932e1c20cbc9f5a5d134645adb5db1b9737ea3​
签名​
041169d545f3f4a02fe2e3d066bfb1798dd5f3417ae8cecd0e43690aafbe79d1​
数据​
400;chunk-signature=041169d545f3f4a02fe2e3d066bfb1798dd5f3417ae8cecd0e43690aafbe79d1​
<1024 bytes>​
​
步骤 3:计算并添加最后一个分块签名​
​
示例​
值​
StringToSign​
TOS4-HMAC-SHA256-PAYLOAD​
20220101T000000Z​
20220101/cn-beijing/tos/request​
041169d545f3f4a02fe2e3d066bfb1798dd5f3417ae8cecd0e43690aafbe79d1​
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855​
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855​
签名​
e05ab64fe1dfdbf0b5870abbaabdb063c371d4e96f2767e6934d90529c5ae850​
数据​
0;chunk-signature=e05ab64fe1dfdbf0b5870abbaabdb063c371d4e96f2767e6934d90529c5ae850​
​
签名方式​
​
最近更新时间:2025.07.24 11:29:00
这个页面对您有帮助吗?
有用
有用
无用
无用