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頭,以提供特定於應用程式的實現行為。

另見