- 文档首页
对象存储
API 参考
签名机制
Header 中包含签名
Header 签名概述
Header 签名概述
在 Header 中携带签名时,签名的算法依赖于您上传对象时使用的传输方式。在对象存储 TOS 中,上传文件的传输方式主要分为单分块上传和多分块上传,适用于不同场景下的文件传输需求。
单分块上传指使用单个分块传输全部有效数据的方式。
在使用 TOS V4 基础签名进行单分块上传时,支持两种签名计算方式:带校验和的签名和不带校验和的签名。具体说明如下:
- 您可以将有效数据的校验和纳入到 V4 基础签名计算中,如果数据传输过程中内容或者校验和发生改变,签名校验将失败,从而保证数据传输过程中的安全。
- 但是为了提前获取有效数据的校验和,客户端通常需要先将全部数据读入内存以计算校验和,随后,还需要基于校验和进行签名计算,然后在发送数据时,第二次将数据读入内存进行传输,所以这可能会导致客户端性能降低。
- 若希望在确保数据完整性的同时避免客户端一次性加载所有数据进行校验和计算,推荐使用多分块上传方式。
- 计算 TOS V4 基础签名时,不包含有效数据的校验和。这种方式在非 HTTPS 的场景下无法保证数据完整性,不推荐使用。
多分块上传指将有效数据拆分为多个固定长度或者可变长度的分块,然后分别进行上传的方式。
单个分块的数据组织形式如下:
- IntHexBase():用于将整数转化为 16 进制数的函数。例如,若分块大小为 65536,则十六进制字符串为 10000。
- ChunkSize:分块有效数据大小(不包含签名和格式数据)。例如,若上传一个 65KB 的对象,并且使用 64 KB 的固定分块大小,那么数据会被分割为三个分块:第一块为 64KB ,第二块为 1KB ,最后一个块为 0 字节。
- Signature:分块的签名数据,当使用链式签名时才需设置。
在最后一个有效数据的分块后,需要再写一个包含 0 字节数据的分块,表示结束。基础的多分块数据格式如下:
在对多分块上传进行签名时,TOS 支持以下签名计算方式:
- 和单分块上传类似,在对多分块上传计算签名时,也可以选择是否在签名中携带校验和。如果选择带校验和的签名,客户端仍需要一次性读取所有数据计算校验和,存在额外的性能损耗。
- TOS V4 基础签名不携带校验和信息,但是在每个分块数据的开头,会包含分块的签名信息,签名内容包括请求参数、本分块有效数据的校验和以及上一个分块的签名信息。通过边传输边计算的方式,可以有效避免客户端一次性读取所有数据后再计算校验和导致的性能下降,也适用于未知长度的数据上传时,客户端无法提前计算全部数据的校验和,同时又需要保证数据传输安全性的场景。
多分块上传还支持使用 Trailing Header 的形式,在最后一个分块数据后,携带一份全部有效数据的校验和,用于服务端的数据完整性校验。Trailing Header 和链式签名作为两种不同的方式,都能有效保障传输过程中的安全性,建议用户上传时至少选择其中一种方式,或者两者同时使用。
在多分块上传时,需要指定 x-tos-content-sha256,用于标识上传格式,以及使用的签名方式。
说明
多分块上传可以和 Transfer-Encoding: chunked 同时使用,若使用 Transfer-Encoding: chunked,则无需携带 Content-Length 头域。
多分块上传请求示例
- 不使用链式签名和 Trailing Header
- 使用链式签名,不使用 Trailing Header。
- 不使用链式签名,使用 Trailing Header
- 同时使用链式签名和 Trailing Header
最近更新时间:2026.10.21 16:29:34