Content-Digest 头
HTTP Content-Digest
请求和响应头提供了使用哈希算法对消息内容进行计算的摘要。接收方可以使用 Content-Digest
来验证 HTTP 消息内容的完整性。
Want-Content-Digest
字段允许发送方请求 Content-Digest
以及他们的哈希算法偏好。内容摘要会因Content-Encoding
和 Content-Range
而异,但不会因 Transfer-Encoding
而异。
在某些情况下,Repr-Digest
可用于针对完整表示验证部分或多部分消息的完整性。例如,在范围请求中,如果仅请求的字节范围不同,则 Repr-Digest
将始终具有相同的值,而内容摘要对于每个部分都将不同。因此,当表示在单个消息中发送时,Content-Digest
与Repr-Digest
相同。
语法
Content-Digest: <digest-algorithm>=<digest-value>
// Multiple digest algorithms
Content-Digest: <digest-algorithm>=<digest-value>,<digest-algorithm>=<digest-value>, …
指令
<digest-algorithm>
-
用于创建消息内容摘要的算法。只有两种注册的摘要算法被认为是安全的:
sha-512
和sha-256
。不安全(旧版)的注册摘要算法是:md5
、sha
(SHA-1)、unixsum
、unixcksum
、adler
(ADLER32) 和crc32c
。 <digest-value>
-
使用
<digest-algorithm>
的消息内容的字节摘要。摘要算法的选择也决定了要使用的编码:sha-512
和sha-256
使用 base64 编码,而某些旧版摘要算法(例如unixsum
)使用十进制整数。与规范的早期草案相反,标准 base64 编码的摘要字节作为字典语法的一部分用冒号(:
,ASCII 0x3A)包裹。
描述
之前的规范中定义了一个 Digest
头,但事实证明它有问题,因为摘要应用范围不明确。具体来说,很难区分摘要是应用于整个资源表示还是应用于 HTTP 消息的特定内容。因此,指定了两个单独的头(Content-Digest
和 Repr-Digest
)分别用于传输 HTTP 消息内容摘要和资源表示摘要。
示例
用户代理请求 SHA-256 Content-Digest
在以下示例中,用户代理请求消息内容的摘要,首选 SHA-256,次选 SHA-1
GET /items/123 HTTP/1.1
Host: example.com
Want-Content-Digest: sha-256=10, sha=3
服务器使用 SHA-256 算法响应消息内容的 Content-Digest
HTTP/1.1 200 OK
Content-Type: application/json
Content-Digest: sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
{"hello": "world"}
相同的 Content-Digest 和 Repr-Digest 值
用户代理在没有 Want-Content-Digest
字段的情况下请求资源
GET /items/123 HTTP/1.1
Host: example.com
服务器配置为在响应中发送未经请求的摘要头。Repr-Digest
和 Content-Digest
字段具有匹配值,因为它们使用相同的算法,并且在这种情况下,整个资源都在一条消息中发送
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 19
Content-Digest: sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
Repr-Digest: sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
{"hello": "world"}
不同的 Content-Digest 和 Repr-Digest 值
如果重复与上一个示例相同的请求,但使用 HEAD
方法而不是 GET
,则 Repr-Digest
和 Content-Digest
字段将不同
GET /items/123 HTTP/1.1
Host: example.com
Repr-Digest
值将与以前相同,但没有消息体,因此服务器将发送不同的 Content-Digest
HTTP/1.1 200 OK
Content-Type: application/json
Content-Digest: sha-256=:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=:
Repr-Digest: sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
用户代理在请求中发送 Content-Digest
在以下示例中,用户代理使用 SHA-512 发送消息内容的摘要。它同时发送 Content-Digest
和 Repr-Digest
,它们由于 Content-Encoding
而相互不同
POST /bank_transfer HTTP/1.1
Host: example.com
Content-Encoding: zstd
Content-Digest: sha-512=:ABC…=:
Repr-Digest: sha-512=:DEF…=:
{
"recipient": "Alex",
"amount": 900000000
}
服务器可以计算收到的内容的摘要,并将结果与 Content-Digest
或 Repr-Digest
头进行比较,以验证消息完整性。在像上面示例这样的请求中,Repr-Digest
对服务器更有用,因为它是在解码后的表示上计算的,并且在不同的场景中会更一致。
规范
规范 |
---|
摘要字段 # 第 2 节 |
浏览器兼容性
此头没有规范定义的浏览器集成(“浏览器兼容性”不适用)。开发人员可以使用fetch()
设置和获取HTTP头,以提供特定于应用程序的实现行为。
另见
Want-Content-Digest
头请求内容摘要Repr-Digest
、Want-Repr-Digest
表示摘要头ETag
- API 数字签名 SDK 指南使用
Content-Digest
进行 HTTP 调用中的数字签名 (developer.ebay.com)