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)