| インターネット技術タスクフォース (IETF) | R. Polli |
| Request for Comments: 9530 | Team Digitale, Italian Government |
| 廃止対象: 3230 | L. Pardue |
| カテゴリ: Standards Track | Cloudflare |
| ISSN: 2070-1721 | 2024年2月 |
ダイジェスト・フィールド
Abstract
本書は整合性ダイジェストをサポートする HTTP フィールドを定義します。Content-Digest フィールドは HTTP メッセージのコンテンツの整合性のために使用できます。Repr-Digest フィールドは HTTP 表現の整合性のために使用できます。Want-Content-Digest および Want-Repr-Digest は、それぞれの整合性フィールドの受信に対する送信者の関心や優先を示すために使用できます。
本書は RFC 3230 および Digest および Want-Digest HTTP フィールドを廃止します。
このメモの状態
これはインターネット標準トラック文書です。
本書はインターネット技術タスクフォース (IETF) の成果物です。IETF コミュニティのコンセンサスを表しています。公開審査を受け、Internet Engineering Steering Group (IESG) によって公開が承認されています。インターネット標準に関する詳細は RFC 7841 のセクション 2 を参照してください。
本書の現行の状態、訂正情報 (errata)、およびフィードバックの提供方法に関する情報は https://www.rfc-editor.org/info/rfc9530 で入手できます。
Copyright Notice
Copyright (c) 2024 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.
- 1. はじめに
- 2. Content-Digest フィールド
- 3. Repr-Digest フィールド
- 4. 整合性優先フィールド
- 5. ハッシュアルゴリズムに関する考慮事項と登録
- 6. セキュリティに関する考慮事項
- 7. IANA に関する考慮事項
- 8. 参考資料
- Appendix A. リソース表現と表現データ
- Appendix B. 未要求の Digest の例
- B.1. サーバが完全な表現データを返す場合
- B.2. サーバが表現データを返さない場合
- B.3. サーバが部分的な表現データを返す場合
- B.4. クライアントとサーバが完全な表現データを提供する場合
- B.5. クライアントが完全な表現データを提供し、サーバが表現データを提供しない場合
- B.6. クライアントとサーバが完全な表現データを提供する場合
- B.7. POST レスポンスがリクエスト URI を参照しない場合
- B.8. POST レスポンスがリクエストのステータスを示す場合
- B.9. Digest と PATCH の併用
- B.10. エラーレスポンス
- B.11. トレーラーフィールドと転送符号化での使用
- Appendix C. Want-Repr-Digest による要請された Digest の例
- Appendix D. サンプルの Digest 値
- Appendix E. RFC 3230 からの移行
- 謝辞
- 著者の連絡先
1. はじめに
HTTP はコンテンツや表現のデータ整合性を保護する手段を定義していません。HTTP メッセージがエンドポイント間で転送される際、TCP チェックサムや TLS レコード ([TLS]) のような下位レイヤの機能や特性がある程度の整合性保護を提供することがあります。しかし、トランスポートに依存した整合性はアプリケーション層からは不透明であり、単一接続の範囲にのみ適用されるため実用性が限定されます。HTTP メッセージはしばしば複数の別個の接続のチェーンを経由して移動します。接続間ではデータ破損が発生する可能性があります。HTTP の整合性メカニズムは、エンドポイントや HTTP を使用するアプリケーションがデータ破損を検出し、それにどう対処するかを選択する手段を提供できます。例えば、システム境界を越えた障害検出や診断の支援がそのユースケースの一つです。
本書は HTTP のための二つのダイジェスト整合性メカニズムを定義します。第一に、転送されるコンテンツに対するコンテンツ整合性(Section 6.4 of [HTTP])。第二に、表現データの整合性であり、これは表現データに作用します(Section 8.1 of [HTTP])。これにより、複数のリクエストや接続を用いて再構築されたリソースの整合性を検証するような高度なユースケースをサポートできます。
本書は [RFC3230] を廃止し、したがって Digest および Want-Digest HTTP フィールドを廃止します。詳細は Section 1.3 を参照してください。
1.1. 文書の構成
本書は次の構成になっています:
-
リクエストおよびレスポンスのヘッダとトレーラフィールドの新しい定義。
-
表現データ整合性に特有の考慮事項。
- Section 3.1 (状態変更リクエスト),
- Section 3.2 (Content-Location),
- Appendix A にはメッセージ交換における表現データの実例が含まれ、
- 付録 B と C はメッセージ交換における Repr-Digest および Want-Repr-Digest フィールドの実例を含みます。
- Section 5 ではハッシュアルゴリズムに関する考慮事項を示し、将来のエントリの登録手順を定義します。
1.2. 概念の概要
本書で定義される HTTP フィールドは HTTP の整合性に使用できます。送信者はハッシュアルゴリズムを選択し、HTTP メッセージに関連する入力からダイジェストを計算します。アルゴリズム識別子とダイジェストは HTTP フィールドで送信されます。受信者は整合性目的でダイジェストを検証できます。ハッシュアルゴリズムは "Hash Algorithms for HTTP Digest Fields" レジストリに登録されます(Section 7.2 を参照)。
ダイジェストを計算するデータの選択は、HTTP メッセージのユースケースによって異なります。本書は HTTP の表現データと HTTP コンテンツのために別々のフィールドを提供します。
単純に HTTP コンテンツのバイト列のダイジェストが必要となるユースケースがあります。その場合、コンテンツのダイジェストをサポートするために Content-Digest のリクエスト・レスポンスのヘッダおよびトレーラフィールドが定義されています(Section 6.4 of [HTTP])。詳細は Section 2 を参照してください。
より高度なユースケースのために、選択された表現データにハッシュアルゴリズムを適用して計算されるダイジェストを含むリクエスト・レスポンスのヘッダおよびトレーラフィールドとして Repr-Digest が定義されています(Section 3)。選択された表現に基づくことで、メッセージのコンテンツをリソースの表現と見なすために何らかの操作が必要な場合や、範囲リクエストのように部分的な表現を伝達する場合に適用しやすくなります(Section 14 of [HTTP] を参照)。
Content-Digest と Repr-Digest はハッシュアルゴリズムの柔軟性(アジリティ)をサポートします。Want-Content-Digest および Want-Repr-Digest フィールドは、それぞれ Content-Digest と Repr-Digest の受信に対する関心やアルゴリズムの優先を表現するために使用できます。
Content-Digest と Repr-Digest は総称して「Integrity fields(整合性フィールド)」と呼ばれます。Want-Content-Digest と Want-Repr-Digest は総称して「Integrity preference fields(整合性優先フィールド)」と呼ばれます。
整合性フィールドは Content-Encoding および Content-Type ヘッダフィールドに紐づきます。したがって、あるリソースは HTTP 経由で転送される際に複数の異なるダイジェスト値を持つことがあります。
整合性フィールドは HTTP メッセージやフィールド自体には適用されません。ただし、メタデータを保護するデジタル署名のような他のメカニズムと組み合わせることで、HTTP 交換のフェーズ全体や一部を保護することができます。例えば、HTTP Message Signatures [SIGNATURES] は整合性フィールドに署名するために使われ、HTTP コンテンツや表現データのカバレッジを提供できます。
本仕様は認証、認可、プライバシーの手段を定義しません。
1.3. RFC 3230 の廃止
[RFC3230] は HTTP の整合性のために Digest および Want-Digest フィールドを定義しました。また、「instance」や「instance manipulation」といった用語を導入し、選択された表現データ(Section 8.1 of [HTTP])のような概念を説明しました。これらの概念は現在では HTTP セマンティクスとしてより普遍的に定義され実装されています。
1.4. 表記規約
本書中のキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", および "OPTIONAL" は、すべて大文字で表示されるときに限り BCP 14 ([RFC2119] および [RFC8174]) に記述されたとおりに解釈されます。
本書は構文と解析の指定のために Section 3 of [STRUCTURED-FIELDS] からの用語(Boolean, Byte Sequence, Dictionary, Integer, List)を使用します。
本書中の "representation", "selected representation", "representation data", "representation metadata", "user agent", および "content" の定義は [HTTP] に従って解釈されます。
本書は長い行の折り畳み戦略として [FOLDING] を使用します。
ハッシュアルゴリズム名はその定義文書で用いられる大文字小文字を尊重します(例: SHA-1, CRC32c)。
HTTP メッセージはアルゴリズムを Algorithm Key(algorithms)で示します。本文で Algorithm Key に言及する場合、それは引用符で囲まれます(例: "sha", "crc32c")。
"checksum" という用語はバイト列にアルゴリズムを適用した出力を表し、"digest" はフィールド内に含まれる値にのみ用います。
"Integrity fields" は Content-Digest と Repr-Digest の総称です。
"Integrity preference fields" は Want-Repr-Digest と Want-Content-Digest の総称です。
2. Content-Digest フィールド
Content-Digest HTTP フィールドは、実際のメッセージコンテンツに適用されたハッシュアルゴリズムを用いて計算されるダイジェストをリクエスト及びレスポンスで伝達するために使用できます(Section 6.4 of [HTTP] を参照)。このフィールドは Dictionary 型(Section 3.2 of [STRUCTURED-FIELDS])であり、各エントリは次の通りです:
- key はダイジェストの計算に用いるハッシュアルゴリズム(Section 5 を参照)を示します;
- value はダイジェスト計算で生成されたバイト出力をエンコードしたものを伝える Byte Sequence(Section 3.3.5 of [STRUCTURED-FIELDS])です。
例えば:
NOTE: '\' line wrapping per RFC 8792 Content-Digest: \ sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
Dictionary 型を用いることで、異なるハッシュアルゴリズムを使って計算された複数のダイジェストを添付し、異なるまたは進化する能力を持つエンドポイント群をサポートできます。このようなアプローチは弱いアルゴリズムからの移行を支援することができます(Section 6.6 を参照)。
NOTE: '\' line wrapping per RFC 8792 Content-Digest: \ sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
受信者は任意またはすべてのダイジェストを無視してもよい(MAY)。アプリケーション固有の挙動やローカルポリシーは、伝達されたダイジェストの処理や検証手順に追加の制約を課すことがあります。セキュリティ考慮事項は、ダイジェストを無視することに関連する問題(Section 6.6)や複数ダイジェストの検証(Section 6.7)に関する事項を扱います。
送信者は受信者が特定のハッシュアルゴリズムをサポートしているかどうかを知らなくてもダイジェストを送信してよい(MAY)。送信者は受信者がそれを無視することを知っていてダイジェストを送信してもよい(MAY)。
Content-Digest はトレーラセクションで送信できます。この場合、Content-Digest はヘッダセクションにマージされ得ます。詳細は Section 6.5.1 of [HTTP] を参照してください。
3. Repr-Digest フィールド
Repr-Digest HTTP フィールドは、選択された表現データ全体に適用されたハッシュアルゴリズムを用いて計算されるダイジェストをリクエストおよびレスポンスで伝達するために使用できます(Section 8.1 of [HTTP] を参照)。
表現はメッセージに対する HTTP セマンティクスの影響を考慮します。例えば、コンテンツはレンジリクエストや HEAD のようなメソッドによって影響を受け得ますし、コンテンツが「オンザワイヤ」でどのように転送されるかは他の変換(例: HTTP/1.1 の transfer codings)に依存します(Section 6.1 of [HTTP/1.1] を参照)。HTTP 表現の概念を説明するために、いくつかの例を Appendix A に示します。
メッセージに表現データがない場合でも、空文字列に対してダイジェストを計算することで表現データが送信されなかったことを主張することが可能です(Section 6.3 を参照)。
Repr-Digest は Dictionary 型(Section 3.2 of [STRUCTURED-FIELDS])であり、各エントリは次の通りです:
- key はダイジェストの計算に用いるハッシュアルゴリズム(Section 5 を参照)を示します;
- value はダイジェスト計算で生成されたバイト出力をエンコードした Byte Sequence です。
例えば:
NOTE: '\' line wrapping per RFC 8792 Repr-Digest: \ sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
Dictionary 型を用いることで、異なるハッシュアルゴリズムを使って計算された複数のダイジェストを添付し、異なるまたは進化する能力を持つエンドポイント群をサポートできます。こうしたアプローチは弱いアルゴリズムからの移行を支援します(Section 6.6 を参照)。
NOTE: '\' line wrapping per RFC 8792 Repr-Digest: \ sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
受信者は任意またはすべてのダイジェストを無視してもよい(MAY)。アプリケーション固有の挙動やローカルポリシーは、伝達されたダイジェストの処理や検証手順に追加の制約を課すことがあります。セキュリティ考慮事項は、ダイジェストを無視することに関連する問題(Section 6.6)や複数ダイジェストの検証(Section 6.7)に関する事項を扱います。
送信者は受信者が特定のハッシュアルゴリズムをサポートしているかどうかを知らなくてもダイジェストを送信してよい(MAY)。送信者は受信者がそれを無視することを知っていてダイジェストを送信してもよい(MAY)。
Repr-Digest はトレーラセクションで送信できます。この場合、Repr-Digest はヘッダセクションにマージされ得ます。詳細は Section 6.5.1 of [HTTP] を参照してください。
3.1. 状態変更リクエストでの Repr-Digest の使用
状態変更リクエストに含まれる表現がターゲットリソースを記述していない場合、表現ダイジェストは表現データに対して計算されることが MUST です。表現ダイジェストは完全な表現メタデータを必要とするため(Section 3 を参照)、これが唯一の選択になります。
レスポンスにおいて、
- 表現がリクエストのステータスを記述する場合、Repr-Digest は同梱された表現に対して計算されることが MUST です(Appendix B.8 を参照);
- 参照されたリソースがある場合、Repr-Digest は参照されたリソースの選択された表現に対して計算されることが MUST です。これは同梱された表現とは異なる場合があり得ます。
後者の場合は、http のメソッドのセマンティクスに従って行われます。例えば Content-Location ヘッダフィールドを使用することがあります(Section 8.7 of [HTTP] を参照)。対照的に、Location ヘッダフィールドは表現メタデータではないため Repr-Digest に影響を与えません。
3.2. Repr-Digest とレスポンスにおける Content-Location
状態変更メソッドが Content-Location ヘッダフィールドを返す場合、同梱の表現はその値で識別されるリソースを参照し、Repr-Digest はそれに応じて計算されます。例は Appendix B.7 に示されています。
4. 整合性優先フィールド
送信者は Want-Content-Digest または Want-Repr-Digest HTTP フィールドを使って、整合性フィールドに対する関心やハッシュアルゴリズムの優先度を示すことができます。これらはリクエストおよびレスポンスの両方で使用できます。
Want-Content-Digest は送信者がリクエスト URI と表現メタデータに関連するメッセージで(Content-Digest フィールドを通じて)コンテンツダイジェストを受け取りたいことを示します。Want-Repr-Digest は送信者がリクエスト URI と表現メタデータに関連するメッセージで(Repr-Digest フィールドを通じて)表現ダイジェストを受け取りたいことを示します。
レスポンスで Want-Content-Digest または Want-Repr-Digest が使用されている場合、それはサーバがクライアントに将来のリクエストで該当する整合性フィールドを提供してほしいことを示します。
整合性優先フィールドはあくまでヒントに過ぎません。フィールドの受信者はそれを無視して任意のアルゴリズムで整合性フィールドを送信するか、またはフィールドをまったく省略することができます。例えば 付録 C.2 を参照してください。優先度が無視されてもプロトコルエラーではありません。整合性フィールドおよび整合性優先フィールドを使用するアプリケーションは、本仕様に加えて期待や制約を定義することができます。無視された優先設定はアプリケーション固有の問題です。
Want-Content-Digest と Want-Repr-Digest は Dictionary 型であり、各エントリは次のようになります:
- key はハッシュアルゴリズムを示します(セクション 5 を参照);
- value は昇順の相対的な重み付け優先度を示す Integer(RFC 8941 セクション 3.3.1)で、0〜10 の範囲でなければなりません。1 が最も低い優先度、10 が最も高い優先度で、値 0 は「受け入れ不可」を意味します。
例:
Want-Repr-Digest: sha-256=1 Want-Repr-Digest: sha-512=3, sha-256=10, unixsum=0 Want-Content-Digest: sha-256=1 Want-Content-Digest: sha-512=3, sha-256=10, unixsum=0
5. ハッシュアルゴリズムに関する考慮事項と登録
整合性の目的で使用できるハッシュアルゴリズムには多種多様なものがあります。アルゴリズムの選択は、整合性のユースケース、実装上の要件や制約、あるいはアプリケーションの設計やワークフローなど、いくつかの要因に依存します。
初期のアルゴリズム群は IANA の "Hash Algorithms for HTTP Digest Fields" レジストリに登録されます。詳細は セクション 7.2 を参照してください。追加のアルゴリズムは本節に記載された方針に従って登録できます。
各アルゴリズムには実装の選択を助けるためのステータスフィールドがあります。
ステータス値が "Active" のアルゴリズムは多くの用途に適しており、アプリケーションはこれらのアルゴリズムを使用することが推奨されます。これらは衝突攻撃、第一原像攻撃、第二原像攻撃に対する耐性を必要とする敵対的な状況で使用できます。敵対的な状況では、受け入れ可能な "Active" アルゴリズムの選択は状況が要求する保護レベルに依存します。詳細は セクション 6.6 を参照してください。
ステータス値が "Deprecated" のアルゴリズムはこれらの性質を満たさないか、既に弱点が知られているものです([NO-MD5] や [NO-SHA] を参照)。これらのアルゴリズムはデータ破損に対する整合性の維持には使用できる場合がありますが、認証のために Integrity フィールドの値に署名するなどの潜在的に敵対的な設定では使用してはなりません。これらのアルゴリズムの使用を許容することは、例えば以前に [RFC3230] を使用していたアプリケーションや、本仕様へ移行中のもの(付録 E)で、既に計算済みのダイジェスト値のコレクションを保持しているようなケースで、再計算による運用上の過度な負担を避けるのに役立つことがあります。ただし、そうしたアプリケーションも本節の要件から免除されるわけではありません。遺産的な理由や履歴がないアプリケーションは、"Active" ステータスのアルゴリズムを使用する方針に従うべきです。
アルゴリズムの柔軟性(agility)に関する議論は セクション 6.6 に示されています。
"Hash Algorithms for HTTP Digest Fields" レジストリへの登録要求は Specification Required ポリシーを使用します(RFC 8126 セクション 4.6)。要求は次のテンプレートを使用してください:
- Algorithm Key:
- Content-Digest、Repr-Digest、Want-Content-Digest、または Want-Repr-Digest フィールドの Dictionary メンバーキーで使用される Structured Fields のキー値。
- Status:
- アルゴリズムのステータス。選択肢は次のとおりです:
-
- "Active":
- 既知の問題がないアルゴリズム
- "Provisional":
- 未検証のアルゴリズム
- "Deprecated":
- 非推奨または安全でないアルゴリズム
- Description:
- アルゴリズムの短い説明。
- Reference(s):
- Algorithm Key とアルゴリズムの技術的詳細を定義する主要な文書への参照。
登録要求をレビューする際、指定された専門家は要求されたステータスに注意を払うべきです。ステータス値は標準化の状況と、IETF やセキュリティ関連の標準化団体(SDO)などの関連する利害関係グループの広範な意見を反映すべきです。"Active" ステータスは、弱く破損しているか実験的なアルゴリズムには適しません。もし登録要求がそのようなアルゴリズムを "Active" として登録しようとする場合、指定専門家は "Deprecated" または "Provisional" を代替ステータスとして提案すべきです。
登録要求をレビューする際、指定専門家は "Deprecated" または "Provisional" のステータスを理由に要求を拒否することはできません。
既存登録のフィールドを更新または変更する要求は許可されます。例えば、アルゴリズムのステータスをセキュリティ環境の変化に伴って "Active" から "Deprecated" に移行することが可能です。
6. セキュリティに関する考慮事項
6.1. HTTP メッセージは完全には保護されない
本書は HTTP の表現データまたはコンテンツのデータ整合性を保護する仕組みを規定しますが、HTTP のヘッダやトレーラフィールド全体を保護するものではありません。
整合性フィールドは HTTP メッセージに対する悪意ある改ざんに対する一般的な保護を意図したものではありません。追加のセキュリティメカニズムがない場合、経路上の悪意ある行為者はダイジェスト値を完全に削除するか、改変した表現データやコンテンツに対して新しいダイジェスト値を計算して置き換えることができます。この攻撃は、TLS やデジタル署名(例えば HTTP Message Signatures [SIGNATURES])と組み合わせることで軽減できます。
6.2. エンドツーエンドの整合性
整合性フィールドは、実装上の誤り、望ましくない「変換プロキシ」(RFC 9110 セクション 7.7 を参照)、またはデータが複数のホップやシステム境界を通過する際に行われるその他の操作による表現データやコンテンツの改変を検出するのに役立ちます。単純なエンドツーエンドの表現データ整合性の仕組みでも、ユーザエージェントがリソース取得の成功を検証してから HTML パーサやビデオプレーヤー等に渡すことができる点で有用です。
これらのメカニズムのみを使用しても、複数ホップにわたる HTTP メッセージのメタデータが任意の段階で改変され得るため、完全なエンドツーエンドの整合性は提供されないことに注意してください。メタデータを保護する方法については セクション 6.3 を参照してください。
6.3. 署名での使用
デジタル署名はチェックサムと組み合わせてメッセージの発信元の特定を確実にするために広く用いられます([FIPS186-5])。そのような署名は一つまたは複数の HTTP フィールドを保護できますが、整合性フィールドを含める場合には追加の考慮事項があります。
整合性フィールドと組み合わせるデジタル署名の型や形式には制限はありません。ひとつの方法として、HTTP Message Signatures [SIGNATURES] と組み合わせることが考えられます。
ダイジェストは明示的に「表現メタデータ」(例: Content-Type, Content-Encoding 等)の影響を受けます。整合性フィールドを保護する署名が他の「表現メタデータ」を保護していない場合、通信は改ざんに晒される可能性があります。例えば、攻撃者が Content-Type の値を操作して受信者でのダイジェスト検証を失敗させ、アプリケーションが表現にアクセスできないようにすることが考えられます。このような攻撃は両端のリソースを消費します。詳しくは セクション 3.2 も参照してください。
署名は整合性フィールドを適用する際に敵対的な環境と見なされることが多いでしょう(セクション 5 を参照)。Repr-Digest は署名と組み合わせた場合に興味深い可能性を提供します。例えば、送信するコンテンツがない場合に空文字列のダイジェストをメッセージに含め、それを署名すれば、受信者はコンテンツが事故や意図的な操作で追加されたかどうかを検出できます。逆のシナリオもサポートされます。コンテンツのための整合性フィールドを含めてそれに署名することにより、受信者はコンテンツが削除された箇所を検出できます。
整合性フィールドの任意の改変は署名検証に影響を与える可能性があります。改変の例としては、ダイジェストの重複除去や異なるフィールド値の結合などがあります(RFC 9110 セクション 5.2 を参照)。
6.4. トレーラーフィールドでの使用
整合性フィールドをトレーラセクションで送信する前に、送信者は仲介者がトレーラを削除することが明示的に許されている点を考慮すべきです(RFC 9110 セクション 6.5.2 を参照)。
整合性フィールドがトレーラセクションで使用される場合、フィールド値はコンテンツの後に受信されます。トレーラ前にコンテンツを先行処理するとダイジェスト検証ができず、無効なデータを処理してしまう可能性があります。
トレーラで整合性フィールドを使う利点の一つは、送信中にバイトをハッシュできる点です。しかし、コンテンツを処理する方法によってはこの利点が無効化されるアルゴリズムを設計することも可能です。例えば、Merkle Integrity Content Encoding [MICE] はコンテンツを逆順で処理することを要求します。これは完全なデータが利用可能でなければならないことを意味し、ヘッダに整合性フィールドを含める場合とトレーラに含める場合で処理差がほとんどなくなります。
6.5. Content-Encoding 内の変化
コンテンツ符号化の仕組みはさまざまなエンコーディングパラメータをサポートすることがあり、同じ入力コンテンツが異なる出力を生むことがあります。例えば GZIP は複数の圧縮レベルをサポートします。こうしたエンコーディングパラメータは一般に表現メタデータとして伝達されません。例えば異なる圧縮レベルはすべて同じ "Content-Encoding: gzip" フィールドを使用します。ほかの例として、nonce やタイムスタンプに依存するエンコーディング(RFC 8188 の aes128gcm 等)があります。
コンテンツ符号化内に変動が存在し得るため、整合性フィールドが示すチェックサムは、全コンテンツを保存しない限り「保存時(at rest)」の整合性の証明として使用することはできません。
6.6. アルゴリズムの柔軟性
ハッシュアルゴリズムのセキュリティ特性は固定的ではありません。アルゴリズムの柔軟性(agility)は、実装が IANA の "Hash Algorithms for HTTP Digest Fields" レジストリからハッシュアルゴリズムを選択できる柔軟性を提供することで達成されます(セクション 7.2 を参照)。
弱いアルゴリズムからの移行は、Want-Content-Digest や Want-Repr-Digest を使ったハッシュアルゴリズムのネゴシエーション(セクション 4 を参照)や、送信側が複数のダイジェストを送信して受信側が選択する方法によってサポートされます。ダイジェストをセキュリティ目的で依存する受信者は、受け入れる最も弱いアルゴリズムの脆弱性に対して脆弱になります。複数の値を送信することは受信者がそれらを無視した場合にリソースを消費することになるため注意が必要です(セクション 3 を参照)。
アルゴリズムの柔軟性は強力なアルゴリズムへの移行を可能にしますが、弱いアルゴリズムの使用を防ぐものではありません。整合性フィールドはハッシュアルゴリズムのダウングレードや置換攻撃に対する緩和策を提供しません(RFC 6211 セクション 1 を参照)。そのような攻撃から守るために、エンドポイントはサポートするアルゴリズム集合を強いものに制限し、TLS やデジタル署名でフィールドの値を保護することが考えられます。
6.7. リソース消耗
整合性フィールドの検証は計算資源を消費します。リソース枯渇を避けるため、実装はアルゴリズム種別、検証回数、コンテンツサイズの制限を設けることができます。そのような場合、検証を完全にスキップするか、より優先度の高いアルゴリズムの検証失敗を無視することでダウングレード攻撃の可能性が残ります(セクション 6.6 を参照)。
7. IANA に関する考慮事項
7.1. HTTP フィールド名の登録
IANA は "Hypertext Transfer Protocol (HTTP) Field Name Registry"([HTTP])を以下の表のように更新しました:
| フィールド名 | ステータス | 参照 |
|---|---|---|
| Content-Digest | permanent | セクション 2 of RFC 9530 |
| Repr-Digest | permanent | セクション 3 of RFC 9530 |
| Want-Content-Digest | permanent | セクション 4 of RFC 9530 |
| Want-Repr-Digest | permanent | セクション 4 of RFC 9530 |
| Digest | obsoleted | [RFC3230], セクション 1.3 of RFC 9530 |
| Want-Digest | obsoleted | [RFC3230], セクション 1.3 of RFC 9530 |
7.2. Hash Algorithms for HTTP Digest Fields レジストリの作成
IANA は新しい "Hash Algorithms for HTTP Digest Fields" レジストリを <https://www.iana.org/assignments/http-digest-hash-alg/> に作成し、表 2 のエントリで初期 populated を行いました。新規登録の手順は セクション 5 に記載されています。
| Algorithm Key | Status | Description | Reference |
|---|---|---|---|
| sha-512 | Active | SHA-512 アルゴリズム | [RFC6234], [RFC4648], RFC 9530 |
| sha-256 | Active | SHA-256 アルゴリズム | [RFC6234], [RFC4648], RFC 9530 |
| md5 | Deprecated | MD5 アルゴリズム。衝突攻撃に対して脆弱です([NO-MD5] および [CMU-836068] を参照)。 | [RFC1321], [RFC4648], RFC 9530 |
| sha | Deprecated | SHA-1 アルゴリズム。衝突攻撃に対して脆弱です([NO-SHA] および [IACR-2020-014] を参照)。 | [RFC3174], [RFC4648], [RFC6234], RFC 9530 |
| unixsum | Deprecated | UNIX の "sum" コマンドが使用するアルゴリズム | [RFC4648], [RFC6234], [UNIX], RFC 9530 |
| unixcksum | Deprecated | UNIX の "cksum" コマンドが使用するアルゴリズム | [RFC4648], [RFC6234], [UNIX], RFC 9530 |
| adler | Deprecated | ADLER32 アルゴリズム | [RFC1950], RFC 9530 |
| crc32c | Deprecated | CRC32c アルゴリズム | Appendix A of [RFC9260], RFC 9530 |
7.3. Hypertext Transfer Protocol (HTTP) Digest Algorithm Values レジストリの廃止
IANA は <https://www.iana.org/assignments/http-dig-alg/> にある "Hypertext Transfer Protocol (HTTP) Digest Algorithm Values" レジストリを廃止し、そのレジストリ上の注記を次のテキストに置き換えました:
このレジストリは廃止されています。なぜなら本レジストリは Digest および Want-Digest フィールドと共に使用可能なアルゴリズムを列挙しており、これらは [RFC3230] によって定義されていましたが、RFC 9530 によって廃止されたためです。登録は閉じられていませんが、新規登録は代わりに Hash Algorithms for HTTP Digest Fields レジストリの使用が推奨されます。
8. 参考資料
8.1. 規範的参照文献
- [FOLDING]
- Watsen, K., Auerswald, E., Farrel, A., and Q. Wu、「Handling Long Lines in Content of Internet-Drafts and RFCs」、RFC 8792、DOI 10.17487/RFC8792、2020年6月、<https://www.rfc-editor.org/info/rfc8792>。
- [HTTP]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., 「HTTP Semantics」、STD 97、RFC 9110、DOI 10.17487/RFC9110、2022年6月、<https://www.rfc-editor.org/info/rfc9110>。
- [RFC1321]
- Rivest, R., 「The MD5 Message-Digest Algorithm」、RFC 1321、DOI 10.17487/RFC1321、1992年4月、<https://www.rfc-editor.org/info/rfc1321>。
- [RFC1950]
- Deutsch, P. and J-L. Gailly, 「ZLIB Compressed Data Format Specification version 3.3」、RFC 1950、DOI 10.17487/RFC1950、1996年5月、<https://www.rfc-editor.org/info/rfc1950>。
- [RFC2119]
- Bradner, S., 「Key words for use in RFCs to Indicate Requirement Levels」、BCP 14、RFC 2119、DOI 10.17487/RFC2119、1997年3月、<https://www.rfc-editor.org/info/rfc2119>。
- [RFC3174]
- Eastlake 3rd, D. and P. Jones, 「US Secure Hash Algorithm 1 (SHA1)」、RFC 3174、DOI 10.17487/RFC3174、2001年9月、<https://www.rfc-editor.org/info/rfc3174>。
- [RFC4648]
- Josefsson, S., 「The Base16, Base32, and Base64 Data Encodings」、RFC 4648、DOI 10.17487/RFC4648、2006年10月、<https://www.rfc-editor.org/info/rfc4648>。
- [RFC5234]
- Crocker, D., Ed. and P. Overell, 「Augmented BNF for Syntax Specifications: ABNF」、STD 68、RFC 5234、DOI 10.17487/RFC5234、2008年1月、<https://www.rfc-editor.org/info/rfc5234>。
- [RFC6234]
- Eastlake 3rd, D. and T. Hansen, 「US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)」、RFC 6234、DOI 10.17487/RFC6234、2011年5月、<https://www.rfc-editor.org/info/rfc6234>。
- [RFC7405]
- Kyzivat, P., 「Case-Sensitive String Support in ABNF」、RFC 7405、DOI 10.17487/RFC7405、2014年12月、<https://www.rfc-editor.org/info/rfc7405>。
- [RFC8126]
- Cotton, M., Leiba, B., and T. Narten, 「Guidelines for Writing an IANA Considerations Section in RFCs」、BCP 26、RFC 8126、DOI 10.17487/RFC8126、2017年6月、<https://www.rfc-editor.org/info/rfc8126>。
- [RFC8174]
- Leiba, B., 「Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words」、BCP 14、RFC 8174、DOI 10.17487/RFC8174、2017年5月、<https://www.rfc-editor.org/info/rfc8174>。
- [STRUCTURED-FIELDS]
- Nottingham, M. and P-H. Kamp, 「Structured Field Values for HTTP」、RFC 8941、DOI 10.17487/RFC8941、2021年2月、<https://www.rfc-editor.org/info/rfc8941>。
8.2. 参考情報(Informative References)
- [CMU-836068]
- Carnegie Mellon University, Software Engineering Institute、「MD5 vulnerable to collision attacks」、2008年12月、<https://www.kb.cert.org/vuls/id/836068/>。
- [FIPS186-5]
- National Institute of Standards and Technology (NIST)、「Digital Signature Standard (DSS)」、FIPS PUB 186-5、DOI 10.6028/NIST.FIPS.186-5、2023年2月、<https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf>。
- [HTTP/1.1]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., 「HTTP/1.1」、STD 99、RFC 9112、DOI 10.17487/RFC9112、2022年6月、<https://www.rfc-editor.org/info/rfc9112>。
- [IACR-2020-014]
- Leurent, G. and T. Peyrin、「SHA-1 is a Shambles」、2020年1月、<https://eprint.iacr.org/2020/014.pdf>。
- [MICE]
- Thomson, M. and J. Yasskin、「Merkle Integrity Content Encoding」、作業中の文書、draft-thomson-http-mice-03、2018年8月、<https://datatracker.ietf.org/doc/html/draft-thomson-http-mice-03>。
- [NO-MD5]
- Turner, S. and L. Chen、「Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms」、 RFC 6151、DOI 10.17487/RFC6151、2011年3月、<https://www.rfc-editor.org/info/rfc6151>。
- [NO-SHA]
- Polk, T., Chen, L., Turner, S., and P. Hoffman、「Security Considerations for the SHA-0 and SHA-1 Message-Digest Algorithms」、RFC 6194、DOI 10.17487/RFC6194、2011年3月、<https://www.rfc-editor.org/info/rfc6194>。
- [PATCH]
- Dusseault, L. and J. Snell、「PATCH Method for HTTP」、RFC 5789、DOI 10.17487/RFC5789、2010年3月、<https://www.rfc-editor.org/info/rfc5789>。
- [RFC3230]
- Mogul, J. and A. Van Hoff、「Instance Digests in HTTP」、RFC 3230、DOI 10.17487/RFC3230、2002年1月、<https://www.rfc-editor.org/info/rfc3230>。
- [RFC6211]
- Schaad, J., 「Cryptographic Message Syntax (CMS) Algorithm Identifier Protection Attribute」、RFC 6211、DOI 10.17487/RFC6211、2011年4月、<https://www.rfc-editor.org/info/rfc6211>。
- [RFC7396]
- Hoffman, P. and J. Snell、「JSON Merge Patch」、RFC 7396、DOI 10.17487/RFC7396、2014年10月、<https://www.rfc-editor.org/info/rfc7396>。
- [RFC7696]
- Housley, R., 「Guidelines for Cryptographic Algorithm Agility and Selecting Mandatory-to-Implement Algorithms」、BCP 201、RFC 7696、DOI 10.17487/RFC7696、2015年11月、<https://www.rfc-editor.org/info/rfc7696>。
- [RFC8188]
- Thomson, M., 「Encrypted Content-Encoding for HTTP」、RFC 8188、DOI 10.17487/RFC8188、2017年6月、<https://www.rfc-editor.org/info/rfc8188>。
- [RFC9260]
- Stewart, R., Tüxen, M., and K. Nielsen、「Stream Control Transmission Protocol」、RFC 9260、DOI 10.17487/RFC9260、2022年6月、<https://www.rfc-editor.org/info/rfc9260>。
- [RFC9457]
- Nottingham, M., Wilde, E., and S. Dalal、「Problem Details for HTTP APIs」、RFC 9457、DOI 10.17487/RFC9457、2023年7月、<https://www.rfc-editor.org/info/rfc9457>。
- [SIGNATURES]
- Backman, A., Ed., Richer, J., Ed., and M. Sporny、「HTTP Message Signatures」、RFC 9421、DOI 10.17487/RFC9421、2024年2月、<https://www.rfc-editor.org/info/rfc9421>。
- [TLS]
- Rescorla, E., 「The Transport Layer Security (TLS) Protocol Version 1.3」、RFC 8446、DOI 10.17487/RFC8446、2018年8月、<https://www.rfc-editor.org/info/rfc8446>。
- [UNIX]
- The Open Group、"The Single UNIX Specification, Version 2 - 6 Vol Set for UNIX 98"、1998年1月。
Appendix A. リソース表現と表現データ
以下の例は、表現メタデータ、コンテンツ変換、およびメソッドがメッセージとコンテンツに与える影響を示します。これらの例は網羅的ではありません。
特に明記されていない限り、例は LF に続く JSON オブジェクト {"hello": "world"} に基づきます。コンテンツに非可視文字(例えばエンコードされた場合)が含まれる場合は、16進エンコードされたバイト列として示します。
例えばクライアントが PUT メソッドを使って JSON オブジェクトをアップロードしたいとします。この場合、application/json の Content-Type を使い、コンテンツ符号化を行わずに送信できます。
PUT /entries/1234 HTTP/1.1
Host: foo.example
Content-Type: application/json
Content-Length: 19
{"hello": "world"}
図 1: コンテンツ符号化なしで JSON オブジェクトを含むリクエスト
しかし、コンテンツ符号化は一般的に用いられます。クライアントは同じデータを GZIP 符号化してアップロードすることもできます(RFC 9110 セクション 8.4.1.3 を参照)。この場合、符号化のオーバーヘッドにより Content-Length は大きな値になります。
PUT /entries/1234 HTTP/1.1 Host: foo.example Content-Type: application/json Content-Encoding: gzip Content-Length: 39 1F 8B 08 00 88 41 37 64 00 FF AB 56 CA 48 CD C9 C9 57 B2 52 50 2A CF 2F CA 49 51 AA E5 02 00 D9 E4 31 E7 13 00 00 00
図 2: GZIP エンコードされた JSON オブジェクトを含むリクエスト
GZIP 符号化されたデータを Content-Encoding を示さずに送ると、コンテンツは不正なものになります。この場合、サーバはエラーで応答することができます。
PUT /entries/1234 HTTP/1.1 Host: foo.example Content-Type: application/json Content-Length: 39 1F 8B 08 00 88 41 37 64 00 FF AB 56 CA 48 CD C9 C9 57 B2 52 50 2A CF 2F CA 49 51 AA E5 02 00 D9 E4 31 E7 13 00 00 00
図 3: 不正な JSON を含むリクエスト
HTTP/1.1 400 Bad Request
図 4: 不正なコンテンツに対するエラーレスポンス
Range リクエストは転送されるメッセージコンテンツに影響します。以下の例では、クライアントは /entries/1234(LF に続く JSON オブジェクト {"hello": "world"})にアクセスしていますが、優先するコンテンツ符号化と特定のバイト範囲を指定しています。
GET /entries/1234 HTTP/1.1 Host: foo.example Accept-Encoding: gzip Range: bytes=1-7
図 5: 部分コンテンツのリクエスト
サーバはクライアントの要求を満たし、部分表現で応答します(図 2 に示した JSON オブジェクトの最初の10バイトに相当)。
HTTP/1.1 206 Partial Content Content-Encoding: gzip Content-Type: application/json Content-Range: bytes 0-9/39 1F 8B 08 00 A5 B4 BD 62 02 FF
図 6: GZIP エンコードされた表現からの部分レスポンス
コンテンツ符号化やレンジリクエスト以外にも、メソッドは転送されるメッセージコンテンツに影響を与えることがあります。例えば、HEAD リクエストへの応答はコンテンツを持ちませんが、この例では Content-Length を含めています(RFC 9110 セクション 8.6 を参照)。
HEAD /entries/1234 HTTP/1.1 Host: foo.example Accept: application/json Accept-Encoding: gzip
図 7: HEAD リクエスト
HTTP/1.1 200 OK Content-Type: application/json Content-Encoding: gzip Content-Length: 39
図 8: HEAD リクエストへのレスポンス(空コンテンツ)
最後に、レスポンスのセマンティクスはターゲット URI と同梱表現を切り離すことがあります。以下の例では、クライアントは /authors/ に対して POST リクエストを行いますが、レスポンスには同梱表現が /authors/123 にあるリソースを参照していることを示す Content-Location ヘッダーフィールドが含まれています。この例では Content-Length は送信されていない点に注意してください。
POST /authors/ HTTP/1.1
Host: foo.example
Accept: application/json
Content-Type: application/json
{"author": "Camilleri"}
図 9: POST リクエスト
HTTP/1.1 201 Created
Content-Type: application/json
Content-Location: /authors/123
Location: /authors/123
{"id": "123", "author": "Camilleri"}
図 10: Content-Location ヘッダを含むレスポンス
Appendix B. 未要求の Digest の例
以下の例は、クライアントが Want-Content-Digest または Want-Repr-Digest を用いて要求しなくても、サーバが Content-Digest または Repr-Digest フィールドを返すやり取りの例を示します。
いくつかの例にはコンテンツに JSON オブジェクトが含まれます。表示の都合上、行長制限に収まるオブジェクトは先頭に空白を付けずに一行で示します。行長制限を超えるオブジェクトは複数行(各キーと値ごとに1行)に分け、先頭に2つのスペースを付けて示します。
本書で定義されたチェックサム機構はメディアタイプに依存せず、特定フォーマットの正規化アルゴリズムは提供しません。例は空白を含めた状態で計算されています。例は両方のフィールドを含むことがありますが、Content-Digest と Repr-Digest は独立して返され得ます。
B.1. サーバが完全な表現データを返す場合
この例では、メッセージコンテンツが完全な表現データを伝えます。したがってレスポンスでは、Content-Digest と Repr-Digest の両方が JSON オブジェクト {"hello": "world"}(LF に続く)に対して計算され、同じ値になります。
GET /items/123 HTTP/1.1 Host: foo.example
図 11: アイテム取得のための GET リクエスト
NOTE: '\' line wrapping per RFC 8792
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"}
図 12: 同一の Repr-Digest と Content-Digest を含むレスポンス
B.2. サーバが表現データを返さない場合
この例では、HEAD リクエストを使ってリソースのチェックサムを取得します。
レスポンスの Content-Digest フィールド値は空のコンテンツに対して計算されています。Repr-Digest は JSON オブジェクト {"hello": "world"}(LF に続く)に対して計算されていますが、コンテンツがないため表示されていません。
HEAD /items/123 HTTP/1.1 Host: foo.example
図 13: アイテムの HEAD リクエスト
NOTE: '\' line wrapping per RFC 8792 HTTP/1.1 200 OK Content-Type: application/json Content-Digest: \ sha-256=:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=: Repr-Digest: \ sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
図 14: 両方の Content-Digest と Repr-Digest を含むレスポンス(空コンテンツ)
B.3. サーバが部分的な表現データを返す場合
この例では、クライアントがレンジリクエストを行い、サーバが部分コンテンツで応答します。
GET /items/123 HTTP/1.1 Host: foo.example Range: bytes=10-18
図 15: 部分コンテンツのリクエスト
NOTE: '\' line wrapping per RFC 8792 HTTP/1.1 206 Partial Content Content-Type: application/json Content-Range: bytes 10-18/19 Content-Digest: \ sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=: Repr-Digest: \ sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: "world"}
図 16: 両方の Content-Digest と Repr-Digest を含む部分レスポンス
上のレスポンスメッセージでは、Repr-Digest と Content-Digest が異なることに注意してください。Repr-Digest のフィールド値は JSON オブジェクト全体 {"hello": "world"}(LF に続く)を横断して計算され、次のように現れます:
NOTE: '\' line wrapping per RFC 8792 Repr-Digest: \ sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
しかし、メッセージコンテンツがバイト 10-18 に制限されているため、Content-Digest のフィールド値はシーケンス "world"}(LF に続く)に対して計算され、次のようになります:
NOTE: '\' line wrapping per RFC 8792 Content-Digest: \ sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=:
B.4. クライアントとサーバが完全な表現データを提供する場合
リクエストには同梱表現に対して計算された Repr-Digest フィールド値が含まれています。また、クライアントは Brotli 符号化をサポートすることを示す Accept-Encoding: br ヘッダーフィールドを含めています。
レスポンスには選択された表現が Brotli で符号化されていることを示す Content-Encoding: br が含まれます。したがって、Repr-Digest のフィールド値はリクエストと異なります。
表示の都合上、レスポンスボディは非表示文字を含むため 16 進エンコードされたバイト列として表示されています。
NOTE: '\' line wrapping per RFC 8792
PUT /items/123 HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept-Encoding: br
Repr-Digest: \
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
{"hello": "world"}
図 17: Digest を含む PUT リクエスト
NOTE: '\' line wrapping per RFC 8792 HTTP/1.1 200 OK Content-Type: application/json Content-Location: /items/123 Content-Encoding: br Content-Length: 23 Repr-Digest: \ sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=: 8B 08 80 7B 22 68 65 6C 6C 6F 22 3A 20 22 77 6F 72 6C 64 22 7D 0A 03
図 18: エンコード済レスポンスの Digest
B.5. クライアントが完全な表現データを提供し、サーバが表現データを提供しない場合
リクエストの Repr-Digest フィールド値は、同梱コンテンツ(LF に続く JSON オブジェクト {"hello": "world"})に対して計算されています。
レスポンスの Repr-Digest フィールド値は、レスポンスにコンテンツが含まれない場合でも Content-Encoding: br を含む表現メタデータに依存します。
NOTE: '\' line wrapping per RFC 8792
PUT /items/123 HTTP/1.1
Host: foo.example
Content-Type: application/json
Content-Length: 19
Accept-Encoding: br
Repr-Digest: \
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:
{"hello": "world"}
HTTP/1.1 204 No Content Content-Type: application/json Content-Encoding: br Repr-Digest: sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:
図 19: Digest を含む空のレスポンス
B.6. クライアントとサーバが完全な表現データを提供する場合
レスポンスは異なるアルゴリズムを使った二つのダイジェスト値を含みます。
表示の都合上、レスポンスボディは非表示文字を含むため 16 進エンコードされたバイト列として表示されています。
NOTE: '\' line wrapping per RFC 8792
PUT /items/123 HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept-Encoding: br
Repr-Digest: \
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:
{"hello": "world"}
図 20: Digest を含む PUT リクエスト
NOTE: '\' line wrapping per RFC 8792 HTTP/1.1 200 OK Content-Type: application/json Content-Encoding: br Content-Location: /items/123 Repr-Digest: \ sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ sha-512=:db7fdBbgZMgX1Wb2MjA8zZj+rSNgfmDCEEXM8qLWfpfoNY0sCpHAzZbj\ 09X1/7HAb7Od5Qfto4QpuBsFbUO3dQ==: 8B 08 80 7B 22 68 65 6C 6C 6F 22 3A 20 22 77 6F 72 6C 64 22 7D 0A 03
図 21: エンコード済コンテンツの Digest
B.7. POST レスポンスがリクエスト URI を参照しない場合
リクエストの Repr-Digest フィールド値は同梱表現(LF に続く JSON オブジェクト {"title": "New Title"})に対して計算されます(セクション 3.1 を参照)。
レスポンスに同梱された表現は複数行の JSON オブジェクト(LF に続く)で、Content-Location によって識別されるリソースを参照します(RFC 9110 セクション 6.4.2 を参照)。したがって、アプリケーションは Repr-Digest を Content-Location によって参照されるリソースと関連付けて使用できます。
POST /books HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept: application/json
Accept-Encoding: identity
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=:
{"title": "New Title"}
図 22: Digest を含む POST リクエスト
HTTP/1.1 201 Created
Content-Type: application/json
Content-Location: /books/123
Location: /books/123
Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=:
{
"id": "123",
"title": "New Title"
}
図 23: リソースの Digest を含むレスポンス
B.8. POST レスポンスがリクエストのステータスを示す場合
リクエストの Repr-Digest フィールド値は同梱表現(LF に続く JSON オブジェクト {"title": "New Title"})に対して計算されています(セクション 3.1 を参照)。
レスポンスに同梱された表現はリクエストの状態を記述しており、したがって Repr-Digest はその同梱表現に対して計算されます。これは複数行の JSON オブジェクト(LF に続く)です。
レスポンスの Repr-Digest は Location によって参照されるリソースと明示的な関係を持ちません。
POST /books HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept: application/json
Accept-Encoding: identity
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=:
{"title": "New Title"}
図 24: Digest を含む POST リクエスト
HTTP/1.1 201 Created
Content-Type: application/json
Repr-Digest: sha-256=:yXIGDTN5VrfoyisKlXgRKUHHMs35SNtyC3szSz1dbO8=:
Location: /books/123
{
"status": "created",
"id": "123",
"ts": 1569327729,
"instance": "/books/123"
}
図 25: 表現の Digest を含むレスポンス
B.9. Digest と PATCH の併用
このケースは、ターゲットリソースがターゲット URI を反映する POST リクエストに類似しています。
PATCH リクエストは application/merge-patch+json メディアタイプを使用します(RFC7396 を参照)。Repr-Digest はパッチ文書に対応するコンテンツ(LF に続く JSON オブジェクト {"title": "New Title"})に対して計算されます。
レスポンスの Repr-Digest フィールド値は、パッチされたリソースの完全な表現に対して計算されます。これは複数行の JSON オブジェクト(LF に続く)です。
PATCH /books/123 HTTP/1.1
Host: foo.example
Content-Type: application/merge-patch+json
Accept: application/json
Accept-Encoding: identity
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=:
{"title": "New Title"}
図 26: Digest を含む PATCH リクエスト
HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=:
{
"id": "123",
"title": "New Title"
}
図 27: 表現の Digest を含むレスポンス
同じ Repr-Digest フィールド値を持ちコンテンツがない 204 No Content のレスポンスも妥当であったことに注意してください。その場合、Content-Digest は空コンテンツに対して計算されます。
B.10. エラーレスポンス
エラーレスポンスでは、表現データは必ずしもターゲットリソースを参照するわけではありません。代わりにエラーの表現を参照します。
以下の例では、クライアントは図 26(PATCH リクエスト)の同じリクエストを /books/123 に送信してリソースをパッチしようとしました。しかし、リソースが存在しないためサーバは 404 を生成し、RFC9457 に従ってエラーを記述する本文を返します。
レスポンスの Repr-Digest フィールド値はこの同梱表現に対して計算されています。これは複数行の JSON オブジェクト(LF に続く)です。
HTTP/1.1 404 Not Found
Content-Type: application/problem+json
Repr-Digest: sha-256=:EXB0S2VF2H7ijkAVJkH1Sm0pBho0iDZcvVUHHXTTZSA=:
{
"title": "Not Found",
"detail": "Cannot PATCH a non-existent resource",
"status": 404
}
図 28: エラー表現の Digest を含むレスポンス
B.11. トレーラーフィールドおよび転送符号化との併用
オリジンサーバはストリーミング中にダイジェスト値を計算できるように、Repr-Digest をトレーラーフィールドとして送信することがあります。 これによりリソース消費を軽減できます。Repr-Digest のフィールド値は 付録 B.1 のものと同一です。Repr-Digest は一つ以上の転送符号化の使用と無関係となるよう設計されているためです(参照: セクション 3)。
以下の応答コンテンツでは、文字列 "\r\n" が CRLF バイトを表します。
GET /items/123 HTTP/1.1 Host: foo.example
図 29: GET リクエスト
NOTE: '\' line wrapping per RFC 8792
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Trailer: Repr-Digest
8\r\n
{"hello"\r\n
8\r\n
: "world\r\n
3\r\n
"}\n\r\n
0\r\n
Repr-Digest: \
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:\r\n
図 30: トレーラに Digest を含むチャンク応答
Appendix C. Want-Repr-Digest による要請された Digest の例
以下の例は、クライアントが Want-Repr-Digest を使って Repr-Digest を要請するやり取りを示します。Content-Digest および Want-Content-Digest の振る舞いは同一です。
いくつかの例ではコンテンツに JSON オブジェクトが含まれます。表示上の都合から、行長制限に完全に収まるオブジェクトは先頭スペースなしのコンパクト形式で一行に示します。行長制限を超えるオブジェクトは複数行(キーと値ごとに1行)で示し、先頭に二つのスペースを付けて表示します。
本書で説明するチェックサム機構はメディアタイプに依存せず、特定フォーマットの正規化アルゴリズムは提供しません。例は空白を含めた状態で計算されています。
C.1. サーバがクライアントの最も低い優先度のアルゴリズムを選択する場合
クライアントはダイジェストを要求し "sha" を好むと示します。サーバはそれでも "sha-256" で応答して構いません。
GET /items/123 HTTP/1.1 Host: foo.example Want-Repr-Digest: sha-256=3, sha=10
図 31: Want-Repr-Digest を含む GET リクエスト
NOTE: '\' line wrapping per RFC 8792
HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: \
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:
{"hello": "world"}
図 32: 異なるアルゴリズムによるレスポンス
C.2. サーバがクライアント未サポートのアルゴリズムを選択する場合
クライアントはサポートする唯一のアルゴリズムとして "sha" を要求します。サーバは必ずしも "sha" を含む応答を返す義務はなく、別のアルゴリズムを使用します。
GET /items/123 HTTP/1.1 Host: foo.example Want-Repr-Digest: sha=10
図 33: Want-Repr-Digest を含む GET リクエスト
NOTE: '\' line wrapping per RFC 8792
HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: \
sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\
yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
{"hello": "world"}
図 34: クライアント未サポートのアルゴリズムによるレスポンス
C.3. サーバがクライアントのアルゴリズムをサポートせずエラーを返す場合
付録 C.2 はサーバがクライアントの優先ダイジェストアルゴリズムを無視する例です。代わりにサーバはリクエストを拒否して 4xx や 5xx のようなエラーステータスコードで応答することもできます。本仕様はステータスコード選択に関する要件を定めませんが、以下は一例を示しています。
この例ではクライアントは "sha" の Repr-Digest を要求し、サーバは問題の詳細(RFC9457)を含むエラーを返します。問題の詳細にはサーバがサポートするハッシュアルゴリズムの一覧が含まれます。これはあくまで例であり、本仕様はそのようなコンテンツの形式や要件を定義しません。
GET /items/123 HTTP/1.1 Host: foo.example Want-Repr-Digest: sha=10
図 35: Want-Repr-Digest を含む GET リクエスト
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{
"title": "Bad Request",
"detail": "Supported hashing algorithms: sha-256, sha-512",
"status": 400
}
図 36: サポートされているアルゴリズムを通知するレスポンス
Appendix D. サンプルの Digest 値
この節は異なるハッシュアルゴリズムによるダイジェスト値の例を示します。入力値は JSON オブジェクト {"hello": "world"} です。ダイジェスト値はそれぞれ該当するハッシュアルゴリズムを入力に対して実行し、出力バイトを Byte Sequence シリアライゼーションに通すことで生成されています。詳細は RFC 8941 セクション 4.1.8 を参照してください。
NOTE: '\' line wrapping per RFC 8792
sha-512 - :WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm+\
AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==:
sha-256 - :X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:
md5 - :Sd/dVLAcvNLSq16eXua5uQ==:
sha - :07CavjDP4u3/TungoUHJO/Wzr4c=:
unixsum - :GQU=:
unixcksum - :7zsHAA==:
adler - :OZkGFw==:
crc32c - :Q3lHIA==:
Appendix E. RFC 3230 からの移行
HTTP ダイジェストはハッシュアルゴリズムを入力データに適用して計算されます。[RFC3230] は入力データを "instance" と定義していましたが、この用語は後に HTTP セマンティクスの "representation" に置き換えられました。いくつかの RFC3230 実装が "instance" を HTTP コンテンツと誤解していたことがあると理解されています。Digest フィールドでコンテンツを用いることは誤りであり、RFC3230 を実装するピア間での相互運用性問題を引き起こします。
[RFC3230] は常に、現在 HTTP が定義する選択された表現データを用いることを意図していました。ダイジェストと表現の概念は Repr-Digest フィールドの定義(セクション 3)と併せて説明されています。
Digest と Repr-Digest の構文は異なりますが、本ドキュメントが Repr-Digest に関して示す考慮事項や例は、同じ入力データに作用するため Digest にも等しく適用されます。参照: セクション 3.1, 6, および 6.3。
[RFC3230] は Digest フィールドで HTTP メッセージコンテンツのダイジェストを伝える手段を提供することはできませんでした。Content-Digest がその機能を提供します。
謝辞
本書は [RFC3230] のアイデアに基づいているため、Jeff Mogul と Arthur Van Hoff に感謝します。RFC3230 を刷新するという元々の着想は、MICE コンテンツ符号化をレビューする際の Mark Nottingham、Jeffrey Yasskin、Martin Thomson との興味深い議論から生じました。
本書への貴重な寄与をしてくれた Julian Reschke に感謝します。また、バグ報告、鋭い質問、原稿の作成やレビュー、未解決問題の評価を通じて本仕様の改善に寄与してくれた以下の協力者にも感謝します: Mike Bishop, Brian Campbell, Matthew Kerwin, James Manger, Tommy Pauly, Sean Turner, Justin Richer, および Erik Wilde。