Content-Digest 头

HTTP Content-Digest 请求响应头提供了使用哈希算法对消息内容进行计算的摘要。接收方可以使用 Content-Digest 来验证 HTTP 消息内容的完整性。

Want-Content-Digest 字段允许发送方请求 Content-Digest 以及他们的哈希算法偏好。内容摘要会因Content-EncodingContent-Range 而异,但不会因 Transfer-Encoding 而异。

在某些情况下,Repr-Digest 可用于针对完整表示验证部分或多部分消息的完整性。例如,在范围请求中,如果仅请求的字节范围不同,则 Repr-Digest 将始终具有相同的值,而内容摘要对于每个部分都将不同。因此,当表示在单个消息中发送时,Content-DigestRepr-Digest 相同。

头类型 请求头响应头表示头
禁止请求头

语法

http
Content-Digest: <digest-algorithm>=<digest-value>

// Multiple digest algorithms
Content-Digest: <digest-algorithm>=<digest-value>,<digest-algorithm>=<digest-value>, …

指令

<digest-algorithm>

用于创建消息内容摘要的算法。只有两种注册的摘要算法被认为是安全的:sha-512sha-256。不安全(旧版)的注册摘要算法是:md5sha (SHA-1)、unixsumunixcksumadler (ADLER32) 和 crc32c

<digest-value>

使用 <digest-algorithm> 的消息内容的字节摘要。摘要算法的选择也决定了要使用的编码:sha-512sha-256 使用 base64 编码,而某些旧版摘要算法(例如 unixsum)使用十进制整数。与规范的早期草案相反,标准 base64 编码的摘要字节作为字典语法的一部分用冒号(:,ASCII 0x3A)包裹。

描述

之前的规范中定义了一个 Digest 头,但事实证明它有问题,因为摘要应用范围不明确。具体来说,很难区分摘要是应用于整个资源表示还是应用于 HTTP 消息的特定内容。因此,指定了两个单独的头(Content-DigestRepr-Digest)分别用于传输 HTTP 消息内容摘要和资源表示摘要。

示例

用户代理请求 SHA-256 Content-Digest

在以下示例中,用户代理请求消息内容的摘要,首选 SHA-256,次选 SHA-1

http
GET /items/123 HTTP/1.1
Host: example.com
Want-Content-Digest: sha-256=10, sha=3

服务器使用 SHA-256 算法响应消息内容的 Content-Digest

http
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 字段的情况下请求资源

http
GET /items/123 HTTP/1.1
Host: example.com

服务器配置为在响应中发送未经请求的摘要头。Repr-DigestContent-Digest 字段具有匹配值,因为它们使用相同的算法,并且在这种情况下,整个资源都在一条消息中发送

http
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-DigestContent-Digest 字段将不同

http
GET /items/123 HTTP/1.1
Host: example.com

Repr-Digest 值将与以前相同,但没有消息体,因此服务器将发送不同的 Content-Digest

http
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-DigestRepr-Digest,它们由于 Content-Encoding 而相互不同

http
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-DigestRepr-Digest 头进行比较,以验证消息完整性。在像上面示例这样的请求中,Repr-Digest 对服务器更有用,因为它是在解码后的表示上计算的,并且在不同的场景中会更一致。

规范

规范
摘要字段
# 第 2 节

浏览器兼容性

此头没有规范定义的浏览器集成(“浏览器兼容性”不适用)。开发人员可以使用fetch()设置和获取HTTP头,以提供特定于应用程序的实现行为。

另见