検証可能なクレデンシャル・データ完全性 1.1

検証可能なクレデンシャル・データの完全性の保護

W3C 最初の公開作業草案

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2026/WD-vc-data-integrity-1.1-20260416/
最新の公開バージョン:
https://www.w3.org/TR/vc-data-integrity-1.1/
最新の編集者草案:
https://w3c.github.io/vc-data-integrity/
履歴:
https://www.w3.org/standards/history/vc-data-integrity-1.1/
コミット履歴
編集者:
Manu Sporny (Digital Bazaar)
Ted Thibodeau Jr (OpenLink Software)
Ivan Herman (W3C)
Dave Longley (Digital Bazaar)
Greg Bernstein (招待専門家)
著者:
Dave Longley (Digital Bazaar)
Manu Sporny (Digital Bazaar)
Ivan Herman (W3C)
フィードバック:
GitHub w3c/vc-data-integrity (プルリクエスト, 新しい課題, 未解決の課題)
public-vc-wg@w3.org に件名 [vc-data-integrity-1.1] … メッセージのトピック … を付けて送信 (アーカイブ)
正誤表:
正誤表があります
関連仕様
検証可能なクレデンシャル・データモデル v2.0
Edwards デジタル署名アルゴリズム暗号スイート v1.0
楕円曲線デジタル署名アルゴリズム 暗号スイート v1.0
BBS デジタル署名アルゴリズム暗号スイート v1.0

概要

本仕様は、暗号技術を用いて、特にデジタル 署名および関連する数学的証明の使用を通じて、 検証可能なクレデンシャルおよび 同様の種類の制約付きデジタル 文書の真正性と完全性を確保するための仕組みについて記述する。

この文書のステータス

この節では、この文書の公開時点における ステータスについて説明する。現在のW3C 公開物の一覧と、この技術報告の最新改訂版は、 W3C 標準および草案 索引で確認できる。

この仕様に関するコメントは、いつでも歓迎する。 課題は直接 GitHub に提出するか、 それができない場合は public-vc-comments@w3.org に送信してほしい。 (購読, アーカイブ)。

この文書は、検証可能なクレデンシャル作業 グループにより、 勧告トラックを用いた 最初の公開作業草案として公開された。

最初の公開作業草案としての公開は、 W3Cおよびその会員による承認を意味しない。

これは草案文書であり、いつでも他の文書によって更新、置換、 または廃止される可能性がある。この文書を進行中の作業以外のものとして 引用することは適切ではない。

この文書は、 W3C 特許 ポリシーの下で運営される グループによって作成された。 W3Cは、 グループの成果物に関連して行われた 特許開示の公開リスト を維持している。そのページには、 特許を開示するための手順も含まれている。個人が、 必須クレーム を含むとその個人が考える特許について実際の知識を有する場合、 W3C 特許ポリシー第6節に従って、 その情報を開示しなければならない。

この文書は、 2025年8月18日版 W3C プロセス文書に準拠する。

1. 序論

この節は非規範的である。

本仕様は、暗号技術を用いて、特にデジタル署名 および関連する数学的証明の使用を通じて、検証可能なクレデンシャルおよび 同様の種類の制約付きデジタル 文書の真正性と完全性を確保するための仕組みについて記述する。暗号学的証明は、 分散システムの実装者にとって有用な機能を可能にする。たとえば、証明は 次の用途に使用できる:

1.1 仕組み

この節は非規範的である。

データ完全性の動作は概念的には単純である。 暗号学的証明を作成するには、次の手順が実行される: 1) 変換、 2) ハッシュ化、3) 証明生成。


暗号学的証明の作成に関わる3つの手順を示す図。
この図は左から右へ配置され、左端に「Data」とラベル付けされた青いボックスがある。
青いボックスは左から右へ、「Transform Data」、「Hash Data」、「Generate Proof」と
ラベル付けされた3つの黄色い矢印を通過する。
右端に生成される青いボックスは「Data with Proof」とラベル付けされている。
1 暗号学的証明を作成するには、データを変換し、ハッシュ化し、 暗号学的に保護する。

変換とは、入力データを受け取り、ハッシュ化処理のために 準備する変換 アルゴリズムによって記述される処理である。 可能な変換の一例は、会議に出席した人々の名前の記録を取り、 個人の姓でリストをアルファベット順に並べ、名前を紙に 1行に1つずつ、整列済み順序で書き直すことである。 変換の例には、 正規化 および バイナリからテキストへの符号化が含まれる。

ハッシュ化とは、 暗号学的ハッシュ関数を用いて、変換済みデータの識別子を計算する ハッシュ化アルゴリズムによって 記述される処理である。この処理は、電話帳が機能する方法と概念的に似ており、 ある人物の名前 (入力データ) を受け取り、その名前をその人物の電話番号 (ハッシュ) に対応付ける。暗号学的ハッシュ関数の例には、 SHA-3 および BLAKE-3 が含まれる。

証明生成とは、入力データの 完全性を変更から保護する、または一定の望ましい信頼しきい値を証明する 値を計算する 証明シリアル化アルゴリズムによって記述される処理である。 この処理は、手紙を入れた封筒に蝋封を用いることで、差出人への 信頼を確立し、手紙が輸送中に改ざんされていないことを示す方法と 概念的に似ている。証明シリアル化関数の例には、 デジタル署名ステークの証明、および 知識の証明一般が含まれる。

暗号学的証明を検証するには、次の手順が実行される: 1) 変換、2) ハッシュ化、3) 証明検証。


暗号学的証明の検証に関わる3つの手順を示す図。
この図は左から右へ配置され、左端に「Data with Proof」と
ラベル付けされた青いボックスがある。青いボックスは左から右へ、
「Transform Data」、「Hash Data」、「Verify Proof」と
ラベル付けされた3つの黄色い矢印を通過する。
右端に生成される青いボックスは「Data with Proof」とラベル付けされている。
2 暗号学的証明を検証するには、データを変換し、ハッシュ化し、 正しさを確認する。

検証中、変換およびハッシュ化の手順は、 上記で説明したものと概念的に同じである。

証明検証とは、入力データを信頼できるかどうかを確認するために、 暗号学的証明検証関数を適用する 証明検証アルゴリズムによって 記述される処理である。可能な証明検証関数には、 デジタル署名ステークの証明、および 知識の証明一般が含まれる。

本仕様は、暗号ソフトウェアの設計者および実装者が、これらの処理を 暗号スイートと呼ばれるものにまとめ、 転送中および保存中のアプリケーションデータの完全性を保護する目的で、 それらをアプリケーション開発者に提供する方法を詳述する。

1.2 設計目標と根拠

この節は非規範的である。

本仕様は、次の設計目標に向けて最適化されている:

単純性
この技術は、暗号技術に関する重要な訓練を必要とせずに、 アプリケーション開発者が使いやすいように設計されている。これは、 次の構成員の優先順位に向けて最適化されている: 暗号スイート 実装者よりもアプリケーション開発者、暗号スイート設計者よりも 暗号スイート実装者、暗号アルゴリズム仕様の著者よりも 暗号スイート設計者。この解決策は、効果のない保護機構の選択を 防ぐため、妥当なデフォルトに重点を置く。詳細については、 5.2 アプリケーション開発者の保護および 5.1 暗号スイートのバージョン管理を参照。
合成可能性
歴史的なデジタル署名機構の多くは、データ変換、構文、 デジタル署名、およびシリアル化を単一の仕様に結合することで ユースケースを制限する、モノリシックな設計を持っていた。本仕様は、 各構成要素を階層化し、一般化された選択的開示や シリアル化に依存しない署名など、より広範なユースケースを可能にする。 さらなる根拠については、5.6 変換5.8 データの不透明性、および 5.1 暗号スイートのバージョン管理を参照。
回復力
デジタル証明機構は技術的進歩により警告なしに危殆化する可能性があるため、 暗号 スイートが複数層の保護を提供し、迅速にアップグレードできることが重要である。 本仕様は、デジタル証明形式を開発者にとって理解しやすく使いやすいものに 保ちながら、アルゴリズムのアジリティと暗号学的レイヤリングの両方を 提供する。詳細を理解するには、5.4 アジリティとレイヤリングを参照。
段階的拡張性
新しい暗号学的保護機構の作成と配備は、実験から実装、標準化へと 段階的に拡張が起こることを認識した、意図的で反復的かつ慎重な プロセスとなるように設計されている。本仕様は、暗号技術における イノベーションの速度を高める必要性と、安定した本番級の 暗号スイートの必要性とのバランスを取ることを目指す。 新しい種類の暗号学的証明を確立するための手順については、 3. 暗号スイートを参照。
シリアル化の柔軟性
暗号学的証明は、多くの異なるが等価な方法でシリアル化でき、しばしば 元の文書構文に強く結び付けられてきた。本仕様は、元の文書構文に 縛られない暗号学的証明の作成を可能にする。これにより、暗号学的証明を 再生成する必要なく、JSON や CBOR などさまざまなシリアル化構文に 単一のデジタル署名を使用できるなど、より高度なユースケースが可能になる。 このようなアプローチの利点については、5.6 変換を参照。
注記: より広範なユースケースへの技術の適用

本仕様は主に検証可能な クレデンシャルに焦点を当てているが、この技術の設計は一般化されており、 他のユースケースにも使用できる。これらの場合、実装者は、その技術が 自身のユースケースに適用可能であるかどうかについて、独自の デューデリジェンスおよび専門的レビューを行うことが期待される。

1.3 適合性

非規範的として示された節に加えて、本仕様におけるすべての作成ガイドライン、図、例、および注記は 非規範的である。本仕様のそれ以外のすべては規範的である。

この文書におけるキーワード MAYMUSTMUST NOTOPTIONAL、および SHOULD は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されているように解釈されるものとする。

適合する保護済み文書とは、 バイト列であって、 関連する規範的要件に従う JSON 文書へ変換できる任意のものをいう。 その要件は、2.1 証明2.2 証明の目的2.3 リソース 完全性2.4 コンテキストと語彙、および3.1 DataIntegrityProofの各節に含まれる。

適合する暗号スイート仕様とは、 3. 暗号スイート節の関連する規範的要件に従う 任意の仕様をいう。

適合するプロセッサとは、 ソフトウェアおよび/またはハードウェアとして実現される任意のアルゴリズムであって、 適合する保護済み文書を生成および/または消費し、 4. アルゴリズム節の関連する規範的記述に従うものをいう。 適合するプロセッサは、不適合な文書が消費された場合に エラーを生成しなければならない (MUST)。

1.4 用語

この文書全体で使用される一部の用語は、 検証可能なクレデンシャル・データモデル v2.0仕様の 用語節、および 制御識別子 v1.0仕様の 用語節で定義されている。 この節では、本仕様全体で使用される追加の用語を定義する。

暗号スイート
特定のセキュリティ目標を達成するために、特定の暗号プリミティブの使用方法を 定義する仕様。これらの文書は、多くの場合、 検証メソッド、デジタル 署名の型、その識別子、およびその他の関連プロパティを指定するために使用される。 詳細については、3. 暗号スイートを参照。
データ 完全性証明
デジタル証明と、それを検証するために必要なパラメータを表す属性の集合。 デジタル署名はデータ完全性証明の一種である。
証明の目的
証明に対する具体的な意図、すなわちエンティティがそれを作成した理由。 保護された宣言は、その証明が意図された目的以外の目的に悪用されることを 防ぐための保護手段として機能する。
公開鍵
対応する秘密鍵で作成されたデジタル証明を検証するために 使用できる暗号材料。
秘密鍵
私有鍵とも呼ばれることがある暗号材料であり、誰とも共有してはならず、 デジタル証明および/またはデジタル署名を生成するために使用される。

2. データモデル

この節では、データ完全性証明および関連リソースの完全性を表現するために 使用されるデータモデルを規定する。

本仕様におけるすべてのデータモデルのプロパティおよび型は URL に対応付けられる。 これらの URL が定義される語彙は The Security Vocabulary である。 保護済み文書内でこの対応付けを実行するために使用される明示的な仕組みは、 @context プロパティである。

対応付けの仕組みは JSON-LD 1.1 によって定義される。JSON-LD ライブラリを使用せずに文書を相互運用可能に消費できるようにするため、文書著者には、 ドメイン専門家が 1) @context プロパティに関連付けられるすべての値の 期待される順序を指定し、2) 各 @context ファイルの暗号学的ハッシュを公開し、 3) 各 @context ファイルの内容が意図されたユースケースに適切であると 判断していることを確保するよう助言される。

JSON-LD ライブラリを利用しないプロセッサによって文書が処理され、 JSON-LD 環境で使用されるものと同じ意味論を使用する必要がある場合、 実装者には、1) @context プロパティにおける期待される順序と値を強制し、 2) 各 @context ファイルが、それぞれの @context ファイルについて 既知の暗号学的ハッシュに一致することを確保するよう助言される。

公開された暗号学的ハッシュを持つ静的でバージョン化された @context ファイルを JSON Schema と組み合わせて使用することは、JSON-LD ライブラリを利用しない プロセッサが使用される場合に、適切な用語識別、型付け、および順序を確保する、 上記の仕組みを実装するための許容可能なアプローチの一つである。 詳細については、検証可能なクレデンシャル・データモデル v2.0 型固有処理に関する節を参照。

2.1 証明

データ完全性証明は、 証明機構、その証明を検証するために必要なパラメータ、および証明値そのものに関する 情報を提供する。この情報はすべて、 The Security Vocabulary などのリンクトデータ語彙を使用して提供される。

オブジェクト上でデータ完全性証明を表現する場合、 proof プロパティを使用しなければならない (MUST)。 検証可能なクレデンシャル 内の proof プロパティは名前付きグラフである。存在する場合、 その値は、以下のプロパティを使用して表現される、単一のオブジェクト、または 順序なしのオブジェクト集合のいずれかでなければならない (MUST):

id
証明の任意の識別子であり、URL [URL] でなければならない (MUST)。たとえば URN としての UUID (urn:uuid:6a1676b8-b51f-11ed-937b-d76685a20ff5) などである。 このプロパティの使用法は、2.1.2 証明 チェーン節でさらに説明される。
type
証明の具体的な型は、URL [URL] に対応付けられる 文字列として指定されなければならない (MUST)。 証明型の例には DataIntegrityProof および Ed25519Signature2020 が含まれる。証明型は、証明を保護および検証するために 他にどのフィールドが必要かを決定する。
proofPurpose
証明が作成された理由は、URL [URL] に対応付けられる 文字列として指定されなければならない (MUST)。証明目的は、その証明が意図されたもの以外の目的に 適用されて悪用されることを防ぐ保護手段として機能する。たとえば、この値がないと、 証明の作成者は、ログイン処理 (authentication) の間に、通常は検証可能な クレデンシャル (assertionMethod) を作成するために使用される暗号材料を 使用するようだまされる可能性があり、その結果、単に Web サイトにログインするという 意図された行為ではなく、作成するつもりのなかった 検証可能な クレデンシャルが作成されてしまう。
verificationMethod
検証メソッドとは、証明を検証するために必要な手段および情報である。 含まれる場合、その値は [URL] に対応付けられる 文字列でなければならない (MUST)。 verificationMethod の包含は任意である (OPTIONAL) が、 含まれない場合は、cryptosuite などの他のプロパティが、 証明を検証するために必要な情報を取得するための仕組みを提供する可能性がある。 verificationMethodデータ完全性証明内で 表現される場合、その値はデータの実際の場所を指すことに注意する。すなわち、 verificationMethod は、URL を介して、証明を検証するために使用できる 公開鍵の場所を参照する。この 公開鍵データは、 検証メソッドの完全な説明を含む 制御識別子 文書に格納される。
cryptosuite
証明を検証するために使用できる暗号スイートの識別子。詳細については 3. 暗号スイートを参照。証明の typeDataIntegrityProof である場合、cryptosuite は 指定されなければならない (MUST)。それ以外の場合、 cryptosuite は指定してもよい (MAY)。指定される場合、 その値は文字列でなければならない (MUST)。
created
証明が作成された日時は任意であり (OPTIONAL)、含まれる場合は、 [XMLSCHEMA11-2] dateTimeStamp 文字列として指定されなければならない (MUST)。これは、値の末尾に Z で示される協定世界時 (UTC)、または UTC に対するタイムゾーンオフセット付きのいずれかである。 適合するプロセッサは、 オフセットなしで誤ってシリアル化された時刻値を消費することを選択してもよい (MAY)。オフセットなしで誤ってシリアル化された時刻値は UTC として解釈されるものとする。
expires
expires プロパティは任意であり (OPTIONAL)、存在する場合は、 証明がいつ失効するかを指定する。存在する場合、それは [XMLSCHEMA11-2] dateTimeStamp 文字列でなければならない (MUST)。 これは、値の末尾に Z で示される協定世界時 (UTC)、または UTC に対する タイムゾーンオフセット付きのいずれかである。適合するプロセッサは、 オフセットなしで誤ってシリアル化された時刻値を消費することを選択してもよい (MAY)。オフセットなしで誤ってシリアル化された時刻値は UTC として解釈されるものとする。
domain
domain プロパティは任意である (OPTIONAL)。 これは、証明が使用されることを意図された1つ以上のセキュリティドメインを伝える。 指定される場合、関連する値は文字列、または順序なしの文字列集合のいずれかで なければならない (MUST)。検証者は、その値を用いて、 証明が検証者の動作するセキュリティドメインで使用されることを意図していたことを 確保するべきである (SHOULD)。domain パラメータの指定は、 検証者が証明の作成者に知られているセキュリティドメイン内で動作している チャレンジレスポンスプロトコルで有用である。ドメイン値の例には、 domain.example (DNS ドメイン)、https://domain.example:8443 (Web オリジン)、mycorp-intranet (独自のテキスト文字列)、および b31d37d4-dd59-47d3-9dd8-c973da43b63a (UUID) が含まれる。
challenge
文字列値であり、 domain が指定される場合、証明に含めるべきである (SHOULD)。この値は、特定の ドメインおよび時間枠に対して一度だけ 使用される。この値はリプレイ攻撃を軽減するために使用される。 challenge 値の例には、 1235abcd678979d34551-ae81-44ae-823b-6dadbab9ebd4、および ruby が含まれる。
proofValue
指定された verificationMethod を使用してデジタル証明を検証するために 必要な、base 符号化されたバイナリデータを表す 文字列値。 この値は、バイナリデータを表すために 制御識別子 v1.0仕様の 2.4 Multibase節で説明される ヘッダーおよび符号化を使用しなければならない (MUST)。 この値の内容は、特定の暗号スイートによって決定され、その暗号スイートの 証明追加アルゴリズムによって生成された 証明値に設定される。暗号スイートによって異なる符号化が指定された 代替プロパティは、デジタル証明を検証するために必要なデータを符号化するため、 このプロパティの代わりに使用してもよい (MAY)。
previousProof
previousProof プロパティは任意である (OPTIONAL)。 存在する場合、それは文字列値または順序なしの文字列値リストでなければならない (MUST)。各値は別の データ完全性証明を識別し、それらすべては、 現在の証明が検証済みと見なされるために、同じく検証されなければならない (MUST)。このプロパティは 2.1.2 証明チェーン節で使用される。
nonce
証明作成者によって提供される任意の (OPTIONAL) 文字列値。このフィールドの一つの用途は、 決定論的に生成される署名の結果として生じるリンク可能性を低下させることで、 プライバシーを高めることである。

次のように、JSON 文書に証明を追加できる:

1: 単純な JSON データ文書
{
  "myWebsite": "https://hello.world.example/"
};

次の証明は、上記の文書を eddsa-jcs-2022 暗号スイート [DI-EDDSA] を 使用して保護する。この暗号スイートは、JSON Canonicalization Scheme (JCS) [RFC8785] を使用して入力データを変換し、 その後 Edwards Digital Signature Algorithm (EdDSA) を使用してデジタル署名することで、 検証可能なデジタル証明を生成する。

2: 単純な署名付き JSON データ文書
{
  "myWebsite": "https://hello.world.example/",
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-jcs-2022",
    "created": "2023-03-05T19:23:24Z",
    "verificationMethod": "https://di.example/issuer#z6MkjLrk3gKS2nnkeWcmcxiZPGskmesDpuwRBorgHxUXfxnG",
    "proofPurpose": "assertionMethod",
    "proofValue": "zQeVbY4oey5q2M3XKaxup3tmzN4DRFTLVqpLMweBrSxMY2xHX5XTYV8nQApmEcqaqA3Q1gVHMrXFkXJeV6doDwLWx"
  }
}

同様に、次のような JSON-LD データ文書に証明を追加できる:

3: 単純な JSON-LD データ文書
{
  "@context": {"myWebsite": "https://vocabulary.example/myWebsite"},
  "myWebsite": "https://hello.world.example/"
};

次の証明は、ecdsa-rdfc-2019 暗号スイート [DI-ECDSA] を 使用して上記の文書を保護する。この暗号スイートは、RDF Dataset Canonicalization Scheme [RDF-CANON] を使用して入力データを変換し、 その後 Elliptic Curve Digital Signature Algorithm (ECDSA) を使用してデジタル署名することで、 検証可能なデジタル証明を生成する。

4: 単純な署名付き JSON-LD データ文書
{
  "@context": [
    {"myWebsite": "https://vocabulary.example/myWebsite"},
    "https://w3id.org/security/data-integrity/v2"
  ],
  "myWebsite": "https://hello.world.example/",
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "ecdsa-rdfc-2019",
    "created": "2020-06-11T19:14:04Z",
    "verificationMethod": "https://ldi.example/issuer#zDnaepBuvsQ8cpsWrVKw8fbpGpvPeNSjVPTWoq6cRqaYzBKVP",
    "proofPurpose": "assertionMethod",
    "proofValue": "zXb23ZkdakfJNUhiTEdwyE598X7RLrkjnXEADLQZ7vZyUGXX8cyJZRBkNw813SGsJHWrcpo4Y8hRJ7adYn35Eetq"
  }
}
注記: 個人への時刻値の表現

本仕様は、created および expires プロパティを通じたものなど、 日付および時刻の表現を可能にする。この情報は、証明が処理され、 許容される時間範囲外であると検出された場合、個人に間接的に公開される可能性がある。 暗号学的証明の有効性に関連する日付および時刻の値を表示する場合、 実装者には、個人の ロケール およびローカルカレンダー設定を尊重するよう助言される [LTLI]。 タイムスタンプをローカル時刻値へ変換する際には、個人のタイムゾーンの期待を 考慮することが期待される。個人に対する時刻値の表現についての詳細は、 検証可能なクレデンシャル・データ モデル v2.0を参照。

5: 'expires' プロパティを使用する添付証明付きの データ文書
{
  "@context": [
    {"myWebsite": "https://vocabulary.example/myWebsite"},
    "https://w3id.org/security/data-integrity/v2"
  ],
  "myWebsite": "https://hello.world.example/",
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "ecdsa-rdfc-2019",
    "created": "2020-06-11T19:14:04Z",
    // 証明は作成から1か月後に失効する
    "expires": "2020-07-11T19:14:04Z",
    "verificationMethod": "https://ldi.example/issuer#zDnaepBuvsQ8cpsWrVKw8fbpGpvPeNSjVPTWoq6cRqaYzBKVP",
    "proofPurpose": "assertionMethod",
    "proofValue": "z98X7RLrkjnXEADJNUhiTEdwyE5GXX8cyJZRLQZ7vZyUXb23ZkdakfRJ7adYY8hn35EetqBkNw813SGsJHWrcpo4"
  }
}

Data Integrity 仕様は、単一の文書内に複数の証明を置く概念をサポートする。 識別される複数証明アプローチには、証明セット (順序なし) と 証明チェーン (順序あり) の2種類がある。

2.1.1 証明セット

証明セットは、 同じデータを複数のエンティティによって保護する必要があるが、証明の順序が 問題にならない場合、たとえば契約上の署名集合の場合に有用である。 順序を持たない証明セットは、文書内の proof キーに 証明の集合を関連付けることで表現される。

6: データ文書内の証明セット
{
  "@context": [
    {"myWebsite": "https://vocabulary.example/myWebsite"},
    "https://w3id.org/security/data-integrity/v2"
  ],
  "myWebsite": "https://hello.world.example/",
  "proof": [{
    // これは集合内の証明の1つである
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "created": "2020-11-05T19:23:24Z",
    "verificationMethod": "https://ldi.example/issuer/1#z6MkjLrk3gKS2nnkeWcmcxiZPGskmesDpuwRBorgHxUXfxnG",
    "proofPurpose": "assertionMethod",
    "proofValue": "z4oey5q2M3XKaxup3tmzN4DRFTLVqpLMweBrSxMY2xHX5XTYVQeVbY8nQAVHMrXFkXJpmEcqdoDwLWxaqA3Q1geV6"
  }, {
    // これは集合内のもう1つの証明である
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "created": "2020-11-05T13:08:49Z",
    "verificationMethod": "https://pfps.example/issuer/2#z6MkGskxnGjLrk3gKS2mesDpuwRBokeWcmrgHxUXfnncxiZP",
    "proofPurpose": "assertionMethod",
    "proofValue": "z5QLBrp19KiWXerb8ByPnAZ9wujVFN8PDsxxXeMoyvDqhZ6Qnzr5CG9876zNht8BpStWi8H2Mi7XCY3inbLrZrm95"
  }]
}

2.1.2 証明チェーン

証明 チェーンは、同じデータを複数のエンティティが署名する必要があり、 かつ証明が発生した順序が重要である場合、たとえば公証人が文書上に作成された 証明に副署する場合に有用である。証明順序を保持する必要がある証明チェーンは、 UUID [RFC9562] などの id を持つ少なくとも1つの証明、および前の証明を識別する previousProof 値を持つ別の証明を提供することで表現される。

7: データ文書内の証明チェーン
{
  "@context": [
    {"myWebsite": "https://vocabulary.example/myWebsite"},
    "https://w3id.org/security/data-integrity/v2"
],
  "myWebsite": "https://hello.world.example/",
  "proof": [{
    // 'id' 値は、この特定の証明を識別する
    "id": "urn:uuid:60102d04-b51e-11ed-acfe-2fcd717666a7",
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "created": "2020-11-05T19:23:42Z",
    "verificationMethod": "https://ldi.example/issuer/1#z6MkjLrk3gKS2nnkeWcmcxiZPGskmesDpuwRBorgHxUXfxnG",
    "proofPurpose": "assertionMethod",
    "proofValue": "zVbY8nQAVHMrXFkXJpmEcqdoDwLWxaqA3Q1geV64oey5q2M3XKaxup3tmzN4DRFTLVqpLMweBrSxMY2xHX5XTYVQe"
  }, {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "created": "2020-11-05T21:28:14Z",
    "verificationMethod": "https://pfps.example/issuer/2#z6MkGskxnGjLrk3gKS2mesDpuwRBokeWcmrgHxUXfnncxiZP",
    "proofPurpose": "assertionMethod",
    "proofValue": "z6Qnzr5CG9876zNht8BpStWi8H2Mi7XCY3inbLrZrm955QLBrp19KiWXerb8ByPnAZ9wujVFN8PDsxxXeMoyvDqhZ",
    // 'previousProof' 値は、この証明の前にどの証明が検証されるかを識別する
    "previousProof": "urn:uuid:60102d04-b51e-11ed-acfe-2fcd717666a7"
  }]
}

2.1.3 証明グラフ

文書内のデータを保護する場合、保護対象のデータを明確に区分することが重要である。 これは、保護機構に関連付けられたデータを含むグラフを除く、文書内で表現される すべてのグラフであり、その除外されるグラフは 証明グラフと呼ばれる。この分離を作ることで、 処理アルゴリズムは保護済み文書を決定論的に保護および検証できる。

データ完全性証明が文書に追加される前に 入力文書に含まれる情報は、1つ以上のグラフで表現される。異なる データ完全性証明からの情報が 誤って混在しないようにするため、 証明グラフの概念が、 各データ完全性証明をカプセル化するために使用される。 文書の proof プロパティに関連付けられた各値は、別個のグラフを識別する。 これは時に 名前付きグラフと呼ばれ、 型 ProofGraphであり、単一のデータ完全性証明を含む。

これらのグラフを使用することは、JSON-LD 処理を行う際に具体的な効果を持つ。 これは、あるグラフで表現された文を別のグラフの文から適切に分離するためである。 JSON、YAML、CBOR など他のメディアタイプに処理を限定する実装者は、 たとえば id 値文字列が両方の文書で同じ場合など、一つの文書のデータを 別の文書のデータとマージする場合に、この点を念頭に置く必要がある。 似たようなプロパティを持っているように見えるオブジェクトであっても、それらの オブジェクトが id プロパティを持たない場合、および/または URL などの グローバル識別子型を使用しない場合、マージしないことが重要である。 それらがないと、2つのそのようなオブジェクトが同じエンティティに関する情報を 表現しているかどうかを判断することは不可能である。

2.2 証明の目的

目的を記述する証明は、他の目的に悪用されることを防ぐのに役立つ。 証明の目的は、 検証者が 証明作成者の意図を知ることを可能にし、メッセージが誤って別の目的に 悪用されないようにする。たとえば、単に主張を行う目的で署名された メッセージ (広く共有されることが意図されている可能性がある) が、 サービスへの認証や何らかのアクション (何かを行う capability を呼び出すなど) のための メッセージとして悪用されることを防ぐ。

証明の目的は、 JSON Web Key (JWK) における key_ops 制限、 Web Cryptography API における KeyUsage 制限、および Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile とは 異なる仕組みであることに注意することが重要である。証明の目的は、 証明が作成された理由とその意図された利用ドメインを表すものである一方、 上記の他の仕組みは、私有鍵を何に使用できるかを制限することを意図している。 証明の目的証明とともに「移動」するが、鍵制限はそうではない。

次に、一般的に使用される証明の目的値の一覧を示す。

authentication
与えられた証明が、認証プロトコルの目的にのみ使用されることを示す。
assertionMethod
証明が、たとえば 検証可能な クレデンシャルへの署名など、主張を行うためにのみ使用できることを示す。
keyAgreement
証明が、一般的な暗号化ライブラリで使用される Elliptic Curve Diffie Hellman 鍵共有など、鍵共有プロトコルに使用されることを示す。
capabilityDelegation
証明が capability の委任にのみ使用できることを示す。詳細については Authorization Capabilities [ZCAP] 仕様を参照。
capabilityInvocation
証明が capability の呼び出しにのみ使用できることを示す。詳細については Authorization Capabilities [ZCAP] 仕様を参照。

2.3 リソース完全性

外部リソースへのリンクが 適合する保護済み文書に含まれる場合、 識別されたリソースが証明の作成後に変更されたかどうかを知ることが望ましい。 これは、外部リソースがリモートから取得される場合だけでなく、 検証者が そのリソースのローカルにキャッシュされたコピーを持っている可能性がある場合にも適用される。

適合する保護済み文書によって参照される リソースが、その文書が保護されてから変更されていないことを確認できるようにするため、 実装者は、id プロパティを含む任意のオブジェクトに digestMultibase という名前のプロパティを含めてもよい (MAY)。存在する場合、digestMultibase 値は、 単一の文字列値、 または文字列値の リストでなければならず (MUST)、各値は Multibase 符号化された Multihash 値である。

JSON-LD コンテキストの著者は、他のリソースを参照する文書で使用される コンテキストに digestMultibase を追加し、関連する暗号学的ダイジェストを 含めることが期待される。たとえば、 検証可能なクレデンシャル・データモデル v2.0 の基本コンテキスト (https://www.w3.org/ns/credentials/v2) は digestMultibase プロパティを含む。

リソース完全性で保護されたオブジェクトの例を以下に示す:

8: オブジェクトに関連付けられた完全性保護済み画像
{
  ...
  "image": {
    "id": "https://university.example.org/images/58473",
    "digestMultibase": "zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n"
  },
  ...
}

実装者は、自身のユースケースに適したハッシュアルゴリズムを選択していることを 確保するため、 FIPS 180-4 Secure Hash Standard および Commercial National Security Algorithm Suite 2.0 などの 適切な情報源を参照することが強く求められる。

2.4 コンテキストと語彙

JSON-LD 処理を行う実装は、以下の JSON-LD コンテキスト URL をすでに解決済みとして扱い、 解決済み文書が以下の対応するハッシュ値に一致するものとしなければならない (MUST):

コンテキスト URL とハッシュ
URL: https://w3id.org/security/data-integrity/v2
SHA2-256 ダイジェスト: 67f21e6e33a6c14e5ccfd2fc7865f7474fb71a04af7e94136cb399dfac8ae8f4
URL: https://w3id.org/security/multikey/v1
SHA2-256 ダイジェスト: ba2c182de2d92f7e47184bcca8fcf0beaee6d3986c527bf664c195bbc7c58597
URL: https://w3id.org/security/jwk/v1
SHA2-256 ダイジェスト: 0f14b62f6071aafe00df265770ea0c7508e118247d79b7d861a406d2aa00bece

上記に列挙された暗号学的ダイジェストは、現代的な UNIX 系 OS のコマンドライン インターフェイスを通じて、次のようなコマンドを実行することで確認できる (<DOCUMENT_URL> を適切な値に置き換える): curl -sL -H "Accept: application/ld+json" <DOCUMENT_URL> | openssl dgst -sha256

上記に列挙された JSON-LD コンテキストが解決するセキュリティ語彙用語は、 https://w3id.org/security# 名前空間内にある。すなわち、この語彙内のすべてのセキュリティ用語は https://w3id.org/security#TERM という形式であり、ここで TERM は用語の名前である。

RDF 処理を行う実装は、語彙 URL の JSON-LD シリアル化を すでに参照解除済みとして扱い、その参照解除済み文書が 以下の対応するハッシュ値に一致するものとしなければならない (MUST)。

注記

本仕様によって定義されるセキュリティ用語に加えて、 https://w3id.org/security# 名前空間には、 制御識別子 v1.0 [CID] 仕様で定義される用語も含まれ、上記に列挙されたコンテキストファイル内に 対応する対応付けがある。

https://w3id.org/security# URL を 参照解除する場合、返されるデータのメディアタイプは HTTP コンテンツネゴシエーションに 依存する。これらは次のとおりである:

メディアタイプ 説明とハッシュ
application/ld+json JSON-LD 形式の語彙 [JSON-LD11]。

SHA2-256 ダイジェスト: 0bc653de0d3f1bf35f1006442b8b7c1a48ca5aa0dc7f69c7d966f5686f367a14
text/turtle Turtle 形式の語彙 [TURTLE]。

SHA2-256 ダイジェスト: cb90eb1b39dfb4cd1e87239edf624e7ff320980dfbcb3a963294c8783874e93a
text/html HTML+RDFa 形式の語彙 [HTML-RDFA]。

SHA2-256 ダイジェスト: 3bb7c8ab6d4795f047798a2a523b29e795f77952c1af0707c441968eae4f1de8

上記に列挙された暗号学的ダイジェストは、現代的な UNIX 系 OS のコマンドライン インターフェイスを通じて、次のようなコマンドを実行することで確認できる (<MEDIA_TYPE> および <DOCUMENT_URL> を適切な値に置き換える): curl -sL -H "Accept: <MEDIA_TYPE>" <DOCUMENT_URL> | openssl dgst -sha256

アプリケーション固有の語彙および仕様の著者は、自身の JSON-LD コンテキストおよび 語彙ファイルが、上記で説明したキャッシュ手法または機能的に等価な仕組みを用いて 永続的にキャッシュ可能であることを確保すべきである (SHOULD)。

実装は、開発中にアプリケーション固有の JSON-LD コンテキストファイルを ネットワークから読み込んでもよい (MAY) が、 本番環境では、セキュリティおよびプライバシー特性を高めるため、 適合する保護済み文書で使用される JSON-LD コンテキストファイルを永続的にキャッシュすべきである (SHOULD)。処理速度の目標は、上記で説明したような キャッシュ手法または機能的に等価な仕組みによって達成してもよい (MAY)。

デジタルウォレットなど、一部のアプリケーションは、任意の発行者からの任意の 検証可能なクレデンシャル または他のデータ完全性保護済み文書を、任意のコンテキストを用いて保持できるため、 本番環境で JSON-LD コンテキストファイルなど外部リンクされたリソースを 読み込める必要があるかもしれない。これは、時間とともにエコシステムにおける ユーザーの選択肢、スケーラビリティ、および分散型アップグレードを高めることが 期待される。そのようなアプリケーションの著者には、さらなる考慮事項について、 この文書のセキュリティおよびプライバシーの節を読むことが助言される。

JSON-LD コンテキストおよび語彙の処理に関するさらなる情報については、 検証可能な クレデンシャル v2.0: 基本コンテキストおよび 検証可能なクレデンシャル v2.0: 語彙を参照。

2.4.1 コンテキストの検証

消費側アプリケーションが処理する入力文書の型、したがってその意味論を 明示的に承認していることを確保する必要がある。JSON-LD コンテキスト値を 既知の正しい値に照らして確認しないことは、それらが伝える意味論のばらつきにより、 セキュリティ脆弱性につながる可能性がある。アプリケーションは、 4.6 コンテキスト検証節のアルゴリズム、または同等の保護を 達成するものを使用して、 適合する保護済み文書内のコンテキストを 検証しなければならない (MUST)。コンテキスト検証は、 4.4 証明の 検証または 4.5 証明セットおよびチェーンの検証のいずれかの 該当するアルゴリズムを実行したに実行しなければならない (MUST)。

4.6 コンテキスト検証節で説明されるアルゴリズムは、コンテキスト値を確認する 一つの方法、および未知のコンテキスト値を安全に処理する一つの任意の方法を 提供するが、実装者は、同じ保護を提供する代替アプローチ、または異なる 手順の順序を使用してもよい (MAY)。

たとえば、JSON-LD 処理を行わない場合、この確認を実行する代わりに、 アプリケーションは、その種類の文書の意味論を適切に理解するために 帯域外で提供される信頼できる文書に従うことができる。

別のアプローチとして、JSON-LD Context ローダー、時に文書ローダーと呼ばれるものを 使用するようにアプリケーションを設定し、承認済みコンテキストファイルのローカルコピー のみを使用させることができる。これにより、コンテキストファイルもその暗号学的ハッシュも 変更されることがなくなり、実質的に 4.6 コンテキスト検証節のアルゴリズムと同じ結果になる。

さらに別の代替アプローチとして、これも 4.6 コンテキスト検証節のアルゴリズムと実質的に 等価であるが、アプリケーションが、すべてのコンテキストファイルをローカルに 保存することなく、よく知られたコンテキスト URL とそれに関連付けられた承認済みの 暗号学的ハッシュのリストを保持する方法がある。これにより、これらのコンテキストを アプリケーションのセキュリティ期待を損なうことなくネットワークから安全に読み込める。

さらに別の有効なアプローチとして、送信アプリケーションが、 圧縮処理により、 受信アプリケーションが要求するものと正確に一致する文書へ変換する方法がある。 これは、検証可能な プレゼンテーションを要求するプロトコルなどを介して行われ、元の文書を保護する際に 使用された追加の送信者固有のコンテキスト値を省略する。暗号スイートの検証 アルゴリズムが成功した検証結果を提供する限り、そのような変換は有効であり、 省略されたコンテキストによって以前に圧縮されていた用語について、完全な URL が 得られる。すなわち、受信者にとって未知の送信者提供コンテキスト (例: `https://ontology.example/v1) に基づいて以前は foo に圧縮されていた用語は、代わりに https://ontology.example#foo のような URL へ「展開」され、 その後、未知のコンテキストが省略され、JSON-LD 圧縮アルゴリズムが 受信アプリケーションによって適用されると、同じ URL へ「圧縮」される。

2.4.2 コンテキスト注入

@context プロパティは、本仕様の用語が処理される際に、 実装が同じ意味論を使用していることを確保するために用いられる。 たとえば、type のようなプロパティが処理され、その値である DataIntegrityProof などが使用される場合に、これは重要になり得る。

アプリケーションが文書を保護する場合に、@context プロパティが文書に 提供されていない、または文書内で使用されている Data Integrity 用語が @context プロパティ内の既存の値によって対応付けられていない場合、 実装は、値 https://w3id.org/security/data-integrity/v2 を持つ @context プロパティ、または少なくとも同じ宣言を持つ1つ以上の コンテキスト、たとえば検証可能なクレデンシャル・データモデル v2.0 コンテキスト (https://www.w3.org/ns/credentials/v2) を注入または追加すべきである (SHOULD)。

JSON-LD 処理を使用する意図のない実装は、文書のトップレベルに @context 宣言を含めないことを選択してもよい (MAY)。 ただし、@context 宣言が含まれない場合、本仕様または対応する暗号スイートに 関連する拡張 (新しいプロパティの追加など) を行ってはならない (MUST NOT)。

2.4.3 データを損失なく保護する

HTML プロセッサは、回復可能なエラーが検出された場合でも処理を継続するように 設計されている。JSON-LD プロセッサも同様の方法で動作する。この設計哲学は、 開発者が JSON-LD 言語のうち有用だと考える部分だけを使用できるようにし、 開発者にとって重要でない可能性があるものによってプロセッサがエラーを投げることを 避けることを意図したものであった。とりわけ、この哲学は、未定義の用語などに 遭遇した場合に、JSON-LD プロセッサがエラーを投げるのではなく、開発者に 警告するよう設計されることにつながった。

JSON-LD から RDF Dataset へ変換する場合、たとえば文書を正規化する場合 [RDF-CANON]、未定義の用語や相対 URL は黙って破棄される可能性がある。値が破棄されると、それらはデジタル証明によって 保護されない。これにより、JSON-LD プロセッサの動作を知らない開発者が、 特定のデータが保護されていると思い、エラーが投げられなかったにもかかわらず、 実際には保護されていなかったことを知って驚くという、期待の不一致が生じる。 本仕様は、JSON-LD 変換を実行する際に回復可能なデータ損失が発生した場合、 開発者のセキュリティ期待の不一致を避けるため、エラーになることを要求する。

RDF Dataset Canonicalization [RDF-CANON] などの JSON-LD 処理を 使用する実装は、入力文書内で未定義の用語が検出された場合など、JSON-LD プロセッサによってデータが破棄される場合に、エラーを投げなければならず (MUST)、そのエラーは DATA_LOSS_DETECTION_ERROR であるべきである (SHOULD)。

同様に、適合する保護済み 文書は一つのセキュリティドメインから別のドメインへ転送され得るため、 適合するプロセッサ適合する保護済み文書を処理する際、 その文書について特定のベース URL を仮定することはできない。RDF へデシリアライズする際、 実装はベース URL が null に設定されることを確保しなければならない (MUST)。

2.4.4 データ型

この節では、本仕様で使用されるデータ型を定義する。

2.4.4.1 cryptosuiteString データ型

本仕様は、暗号スイート識別子を列挙可能な文字列として符号化する。これは、 圧縮アルゴリズムなど、そのような文字列を効率的に符号化する必要がある処理で 有用である。RDF [RDF-CONCEPTS] など、文字列値に対する データ型をサポートする環境では、暗号識別子内容は、データ型が https://w3id.org/security#cryptosuiteString に設定された リテラル値を用いて示される。

cryptosuiteString データ型は次のように定義される:

このデータ型を示す URL
https://w3id.org/security#cryptosuiteString
字句空間
すべての Data Integrity 暗号スイート仕様の集合によって定義される、 American Standard Code for Information Interchange [ASCII] 文字列を用いて表現される、すべての暗号スイート文字列の和集合。
値空間
3.1 DataIntegrityProof節で定義される、 cryptosuite プロパティを用いて表現されるすべての暗号スイート型の和集合。
字句から値への対応付け
字句空間の任意の要素は、他のすべての可能な暗号スイート型からその暗号スイート型を 一意に識別する内部表現へ解析した結果に対応付けられる。
正規対応付け
値空間の任意の要素は、字句空間内の対応する文字列に対応付けられる。

2.5 リンクトデータとの関係

Linked Data という用語は、URL などの標準を用いて、ものおよびそのプロパティを 識別し、Web 上で情報を公開、共有、接続するための推奨されるベストプラクティスを 説明するために使用される。情報が Linked Data として提示される場合、 他の関連情報を容易に発見でき、新しい情報を容易にそれへリンクできる。 Linked Data は分散的な方法で拡張可能であり、大規模統合への障壁を大幅に低減する。

Linked Data のさまざまなアプリケーションでの利用が増加するにつれ、 Linked Data 文書の真正性と完全性を検証できる必要がある。本仕様は、 Linked Data の拡張性および合成可能性などの機能を犠牲にすることなく、 数学的証明の使用を通じてデータ文書に認証および完全性保護を追加する。

注記: Linked Data の使用は任意の機能である

本仕様は Linked Data にデジタル署名するための仕組みを提供するが、 本仕様が提供する利点の一部を得るために Linked Data を使用する必要はない。

2.6 検証可能なクレデンシャルとの関係

本仕様を実装する暗号スイートは、 検証可能なクレデンシャル および検証可能な プレゼンテーションを保護するために使用できる。これらのユースケースに 対応する実装者は、その種類の文書を処理する際に追加の確認が適切である可能性が あることに注意すべきである。

証明で使用される 検証 メソッドが、 issuer 検証可能なクレデンシャルにおいて関連付けられていること、または holder 検証可能なプレゼンテーションにおいて、 妥当性確認の過程で 関連付けられていることを確保することが重要なユースケースがある。 そのような関連付けを確認する一つの方法は、証明の 検証メソッドcontroller プロパティの値が、 issuer または holder を識別するために 使用される URL 値とそれぞれ一致し、 かつ検証メソッドが、証明の目的を踏まえて受け入れ可能な検証関係の下に 表現されていることを確保することである。この特定の関連付けは、 issuer または holder がそれぞれ、 証明を検証するために使用される 検証 メソッドの controller であることを示す。

文書著者および実装者には、証明の有効期間と クレデンシャルの 有効期間の違いを理解することが助言される。前者は created および expires プロパティを用いて表現され、 後者は validFrom および validUntil プロパティを用いて表現される。 これらのプロパティは同じ有効期間を表す場合もあるが、 必ずしも一致するとは限らない。証明を検証する場合、 関心時刻 (現在時刻または任意の他の時刻であり得る) が証明の有効期間内、 すなわち createdexpires の間にあることを確保することが重要である。 妥当性確認によって 検証可能なクレデンシャルを 検証する場合、関心時刻が クレデンシャルの 有効期間内、すなわち validFromvalidUntil の間に あることを確保することが重要である。証明の有効期間、 または クレデンシャルの有効期間の いずれかを検証し損なうと、本来拒否されるべきデータを受け入れる結果になる可能性が あることに注意する。

最後に、実装者には、 検証可能なクレデンシャルに 関連付けられた失効情報と、 検証 メソッド失効 および有効期限時刻との間には 違いがあることも理解することが強く求められる。 検証 メソッド失効および 有効期限時刻は、それぞれ revocation および expires プロパティを用いて表現される。 それらは、秘密鍵が 危殆化した、または期限切れになったなどの事象に関連し、controller の詳細、 たとえばそのセキュリティ慣行や危殆化された可能性のある時期などを明らかにし得る タイミング情報を提供できる。検証可能なクレデンシャルの 失効情報は credentialStatus プロパティを用いて表現される。 これは、個人が 検証可能なクレデンシャルによって 付与される特権を失うなどの事象に関連し、プライバシーを高めるため、 タイミング情報を提供しない。

3. 暗号スイート

データ完全性証明は、開発者が容易に使用できるように 設計されているため、証明を生成するために覚える必要のある情報量を最小化するよう 努めている。多くの場合、証明の作成を開始するために開発者から必要とされるのは、 暗号スイート名 (たとえば eddsa-rdfc-2022) だけである。これらの 暗号スイートは、安全な暗号プリミティブの組み合わせが 使用されることを確保するために必要な暗号技術の訓練を受けた人々によって作成および レビューされることが多い。この節では、暗号スイート仕様を作成するための要件を規定する。

すべてのデータ完全性暗号スイート仕様に対する要件は次のとおりである:

cryptosuite instance は、 cryptosuite instantiation algorithm を 使用してインスタンス化され、実装固有の方法でアルゴリズムに利用可能にされる。 実装は、既知の cryptosuite instantiation algorithmsを発見するために、 検証可能な クレデンシャル拡張文書を使用してもよい (MAY)。

3.1 DataIntegrityProof

多くの暗号スイートは、 データ完全性証明を表現する際に同じ基本パターンに 従う。この節では、その一般的な設計パターン、すなわち DataIntegrityProof と呼ばれる 暗号スイート型を規定する。 これは、設計プリミティブおよびソースコードの再利用を通じて、 暗号スイートの 作成および実装の負担を軽減する。

この設計パターンを利用する暗号スイートを指定する場合、 proof 値は次の形式をとる:

type
type プロパティは、文字列 DataIntegrityProof を含まなければならない (MUST)。
cryptosuite
cryptosuite プロパティの値は、 暗号スイートを識別する 文字列で なければならない (MUST)。処理環境が 文字列 サブタイプをサポートする場合、cryptosuite 値のサブタイプは https://w3id.org/security#cryptosuiteString サブタイプでなければならない (MUST)。
proofValue
proofValue プロパティは、 2.1 証明節で規定されているように使用しなければならない (MUST)。

暗号スイートの設計者は、 2.1 証明節で定義された必須の proof 値プロパティを使用しなければならず (MUST)、 自身の暗号スイートに固有の他のプロパティを定義してもよい (MAY)。

注記: レガシー暗号スイートの設計パターン

2012年から2020年までの Data Integrity 暗号スイートで見られた設計パターンの一つは、 type プロパティを使用して暗号スイートに固有の型を確立することであった。 Ed25519Signature2020 暗号スイートは、そのような仕様の一つであった。これは、 すべての新しい暗号スイートが新しい JSON-LD Context の指定を必要とするという点で、 暗号スイート実装に大きな負担をもたらし、開発者体験として最適ではない結果を 生んだ。この設計パターンの簡素化されたバージョンが2020年に現れ、 開発者は、すべての現代的な暗号スイートをサポートするために、単一の JSON-LD Context だけを含めればよいようになった。これにより、EdDSA Cryptosuites [DI-EDDSA] や ECDSA Cryptosuites [DI-ECDSA] などのより現代的な暗号スイートが、この節で説明する簡素化されたパターンに 基づいて構築されるようになった。

開発者体験を改善するため、新しい Data Integrity 暗号スイート仕様を作成する著者は、 現代的なパターンを使用すべきである (SHOULD)。すなわち、 typeDataIntegrityProof に設定し、 cryptosuite プロパティが暗号スイートの識別子を担い、 暗号スイート固有の暗号データは proofValue 内にカプセル化される (すなわち、アプリケーション層データとして直接公開されない) パターンである。 このパターンに従うことが知られている暗号スイート仕様の一覧は、 検証可能なクレデンシャル拡張文書の Securing Mechanisms 節に示されている。

4. アルゴリズム

以下で定義されるアルゴリズムは、JSON オブジェクトとして表現される文書を対象に動作する。本仕様は、 JSON オブジェクトをmapとして表現する点で、 JSON-LD 1.1 Processing Algorithms and API仕様に従う。 未保護データ文書とは、証明値を含まない mapである。 入力文書とは、現在の証明がまだ追加されていない mapであるが、以前の処理によって追加された 証明値を含んでもよい (MAY)。保護済みデータ 文書 とは、1つ以上の証明値を含むmapである。

実装者は、開発者の誤り、過度なリソース消費、特定の保護が存在する新たに発見された 攻撃モデル、およびその他の改善を軽減するため、以下のアルゴリズムに加えて、 妥当なデフォルトおよび保護手段を実装してもよい (MAY)。 以下で提供されるアルゴリズムは、相互運用可能な実装のための 最小要件であり、開発者には、より安全で効率的なエコシステムに 寄与し得る追加の対策を含めることが強く求められる。

4.1 処理モデル

適合するプロセッサおよびその アプリケーション固有ソフトウェアによって使用される処理モデルは、この節で説明される。 ソフトウェアが情報を改ざん検出可能にする必要がある場合、次の手順を実行する:

  1. ソフトウェアは、JSON または JSON-LD 文書などの文書に情報を配置する。
  2. 文書が JSON-LD 文書である場合、ソフトウェアは1つ以上の JSON-LD Context を選択し、それらを @context プロパティを用いて表現する。
  3. ソフトウェアは、許容可能な暗号鍵材料を使用して、完全開示、選択的開示、 または非リンク可能な開示を提供するものなど、ユースケースの要件を満たす 1つ以上の暗号スイートを選択する。
  4. ソフトウェアは、1つ以上の証明を追加するために、4.2 証明の追加 または4.3 証明セット/チェーンの追加で提供される 該当するアルゴリズムを使用する。

ソフトウェアが、本仕様で説明される仕組みを使用して送信された情報を使用する必要が ある場合、次の手順を実行する:

  1. ソフトウェアは、受信データを、4.4 証明の 検証または 4.5 証明セットおよびチェーンの検証で提供される 該当するアルゴリズムが理解できる文書へ変換する。
  2. ソフトウェアは、JSON Schema または同等の仕組みを使用して、受信文書が アプリケーションで使用される期待されるスキーマに従っていることを検証する。
  3. ソフトウェアは、受信文書の完全性を検証するために、4.4 証明の 検証 または4.5 証明セットおよびチェーンの検証で提供される該当するアルゴリズムを使用する。
  4. 文書が JSON-LD 文書である場合、ソフトウェアは、文書で使用されるすべての JSON-LD Context 値を検証するために、4.6 コンテキスト検証で提供される アルゴリズム、または同等の保護を提供するアルゴリズムを使用する。

4.2 証明の追加

次のアルゴリズムは、デジタル証明を入力文書に追加し、その後、出力文書の真正性 および完全性を検証するために使用できる方法を規定する。必須入力は、 入力文書 (map inputDocument)、cryptosuite instance (struct cryptosuite)、および オプションの集合 (map options) である。出力は、保護済みデータ文書 (map) またはエラーである。 このアルゴリズムが文字列を符号化する場合は常に、UTF-8 符号化を 使用しなければならない (MUST)。

  1. proof を、inputDocument および options をパラメータとして渡して、 cryptosuite.createProof で指定された createProof アルゴリズムを呼び出した結果とする。アルゴリズムがエラーを生成した場合、 そのエラーは伝播されなければならず (MUST)、エラー型を伝えるべきである (SHOULD)。
  2. proof.typeproof.verificationMethod、および proof.proofPurpose の値の1つ以上が設定されていない場合、 エラーを発生させなければならず (MUST)、 PROOF_GENERATION_ERROR のエラー型を伝えるべきである (SHOULD)。
  3. options が非 null の domain itemを持つ場合、それは proof.domain と等しくなければならず (MUST)、 そうでない場合はエラーを発生させなければならず (MUST)、 PROOF_GENERATION_ERROR のエラー型を伝えるべきである (SHOULD)。
  4. options が非 null の challenge itemを持つ場合、それは proof.challenge と等しくなければならず (MUST)、 そうでない場合はエラーを発生させなければならず (MUST)、 PROOF_GENERATION_ERROR のエラー型を伝えるべきである (SHOULD)。
  5. securedDataDocumentinputDocument のコピーとする。
  6. securedDataDocument.proofproof の値に設定する。
  7. securedDataDocument保護済みデータ文書として返す。

4.3 証明セット/チェーンの追加

次のアルゴリズムは、証明または証明セット/チェーンのいずれかを含む保護済み文書から開始して、 証明セットまたは証明チェーンに証明を段階的に追加する方法を規定する。必須入力は、 保護済みデータ文書 (map securedDocument)、暗号スイート (cryptosuite instance suite)、およびオプションの集合 (map options) である。出力は新しい 保護済みデータ文書 (map) である。このアルゴリズムが文字列を符号化する場合は常に、 UTF-8 符号化を使用しなければならない (MUST)。

  1. proofsecuredDocument.proof に設定する。 allProofs を空のリストとする。proof がリストである場合、 proof のすべての要素を allProofs にコピーする。proof がオブジェクトである場合、そのオブジェクトのコピーを allProofs に追加する。
  2. inputDocument を、proof 属性を取り除いた securedDocument のコピーとする。outputinputDocument のコピーとする。
  3. matchingProofs を空のリストとする。
  4. options が文字列である previousProof itemを持つ場合、 previousProof と一致する id 属性を持つ allProofs 内の要素を matchingProofs に追加する。previousProof に等しい id を持つ証明が allProofs 内に存在しない場合、エラーを発生させなければならず (MUST)、 PROOF_GENERATION_ERROR のエラー型を伝えるべきである (SHOULD)。
  5. options が配列である previousProof itemを持つ場合、その配列の要素と一致する id 属性を持つ allProofs 内の各要素を追加する。 previousProof list のいずれかの要素が、 allProofs のいずれの要素の id 属性にも一致しない id 属性を持つ場合、エラーを発生させなければならず (MUST)、 PROOF_GENERATION_ERROR のエラー型を伝えるべきである (SHOULD)。
  6. inputDocument.proofmatchingProofs に設定する。
    注記: この手順は文書および既存の 証明を保護する

    この手順は、名前付き グラフへの参照を追加するとともに、 証明 グラフに含まれるすべてのクレームのコピーを追加する。 この手順は、現在の証明を適用する前に、一致する証明を文書へ 束縛するため重要である。文書の proof 値は、 このアルゴリズムの後の手順で更新される。

  7. 4.2 証明の追加節の アルゴリズムの手順1から6を、inputDocumentsuite、および options を渡して実行する。例外が発生しない場合、生成された proof 値を allProofs に追加する。それ以外の場合は例外を発生させる。
  8. output.proofallProofs の値に設定する。
  9. output を新しい保護済みデータ文書として返す。

4.4 証明の検証

次のアルゴリズムは、デジタル証明を検証することによって、 保護済みデータ文書の真正性および完全性を 確認する方法を規定する。このアルゴリズムは次を入力として受け取る:

mediaType
[MIMESNIFF] で定義される メディアタイプ
documentBytes
メディアタイプが mediaType である バイト列
cryptosuite
cryptosuite instance
expectedProofPurpose
任意の文字列であり、 proof が検証者によって期待される理由で証明作成者により生成されたことを 確保するために使用される。一般的な値については、2.2 証明の 目的を参照。
domain
任意の文字列集合であり、 証明作成者が証明を特定のセキュリティドメインへ固定するため、および検証者が 証明が異なるセキュリティドメイン間で使用されていないことを確保するために使用する。
challenge
任意の文字列 challengeであり、攻撃者が以前に作成された証明を リプレイしていないことを検証者が確保するために使用する。

このアルゴリズムは、検証結果、すなわち structを返す。その 項目は次のとおりである:

verified
true または false
verifiedDocument
verifiedfalse の場合は Null。そうでない場合は、 入力文書
mediaType
verifiedfalse の場合は Null。そうでない場合は、 メディアタイプであり、 パラメータを含んでもよい (MAY)。
warnings
ProblemDetailsリストであり、 デフォルトでは空のリストである。
errors
ProblemDetailsリストであり、 デフォルトでは空のリストである。

手順が「エラーを発生させなければならない (MUST)」という場合、 それは検証結果が、 verifiedfalse および空でない errors リストを伴って 返されなければならないことを意味する。

  1. securedDocument を、documentBytes に対して parse JSON bytes to an Infra valueを実行した結果とする。
  2. securedDocumentmapではない、または securedDocument.proofmapではない場合、 エラーを発生させなければならず (MUST)、 PARSING_ERROR のエラー型を伝えるべきである (SHOULD)。
  3. proofsecuredDocument.proof とする。
  4. proof.typeproof.verificationMethod、および proof.proofPurpose の1つ以上が 存在しない場合、 エラーを発生させなければならず (MUST)、 PROOF_VERIFICATION_ERROR のエラー型を伝えるべきである (SHOULD)。
  5. expectedProofPurpose が与えられており、それが proof.proofPurpose と一致しない場合、 エラーを発生させなければならず (MUST)、 PROOF_VERIFICATION_ERROR のエラー型を伝えるべきである (SHOULD)。
  6. domain が与えられており、それが proof.domain と同じ 文字列を含まない場合 (単一の文字列は、その 文字列だけを含む 集合として扱う)、 エラーを発生させなければならず (MUST)、 INVALID_DOMAIN_ERROR のエラー型を伝えるべきである (SHOULD)。
  7. challenge が与えられており、それが proof.challenge と一致しない場合、 エラーを発生させなければならず (MUST)、 INVALID_CHALLENGE_ERROR のエラー型を伝えるべきである (SHOULD)。
  8. cryptosuiteVerificationResult を、 securedDocument を入力として渡して cryptosuite.verifyProof アルゴリズムを 実行した結果とする。
  9. 次の項目を持つ 検証結果を返す:
    verified
    cryptosuiteVerificationResult.verified
    verifiedDocument
    cryptosuiteVerificationResult.verifiedDocument
    mediaType
    mediaType

4.5 証明セットおよびチェーンの検証

証明セットまたは 証明チェーンでは、 保護済みデータ文書は、 証明のリスト (allProofs) を含む proof 属性を持つ。次のアルゴリズムは、 allProofs 内のすべての証明を検証することで達成される、 保護済みデータ文書の真正性および完全性を 確認する一つの方法を提供する。 他のアプローチも可能であり、特に allProofs に含まれる証明の一部のみを 検証したい場合がある。証明の一部のみを検証する別のアプローチを採る場合、 その部分集合に含まれる previousProof を持つ任意の証明は、それが参照する 証明も検証済みと見なされる場合にのみ、検証済みと見なせることに注意することが重要である。

必須入力は保護済みデータ文書 (securedDocument) である。 allProofs 内の各証明に対応する 検証結果のリストが生成され、 単一の結合された検証結果が出力として返される。 実装は、結合された検証結果とともに、 その他の検証結果および/または任意の その他のメタデータを返してもよい (MAY)。

  1. allProofssecuredDocument.proof に設定する。
  2. verificationResults を空のリストに設定する。
  3. allProofs 内の各 proof について、次の手順を実行する:
    1. matchingProofs を空のリストとする。
    2. proofpreviousProof 属性を含み、その属性の値が 文字列である場合、 previousProof の値と一致する id 属性値を持つ allProofs 内の要素を matchingProofs に追加する。 previousProof の値に等しい id 値を持つ証明が allProofs 内に存在しない場合、エラーを発生させなければならず (MUST)、 PROOF_VERIFICATION_ERROR のエラー型を 伝えるべきである (SHOULD)。previousProof 属性が リストである場合、その リストの要素の値と 一致する id 属性値を持つ allProofs 内の各要素を追加する。 previousProof list のいずれかの要素が、 allProofs のいずれの要素の id 属性値にも一致しない id 属性値を持つ場合、エラーを発生させなければならず (MUST)、 PROOF_VERIFICATION_ERROR のエラー型を 伝えるべきである (SHOULD)。
    3. inputDocument を、証明値を取り除いた securedDocument のコピーとし、 その後 inputDocument.proofmatchingProofs に設定する。
      注記: 文書および以前の 証明を保護する

      この手順がどの文書プロパティおよび以前の証明を保護するかについては、 4.3 証明セット/チェーンの追加の手順6の注記を参照。

    4. 4.4 証明の検証節のアルゴリズムの手順4から8を inputDocument に対して実行する。例外が発生しない場合、 cryptosuiteVerificationResultverificationResults に追加する。
  4. successfulVerificationResults を空のリストに設定する。
  5. combinedVerificationResult を空の struct とする。 combinedVerificationResult.statustrue に、combinedVerificationResult.documentnull に、そして combinedVerificationResult.mediaTypenull に設定する。
  6. verificationResults 内の各 cryptosuiteVerificationResult について:
    1. cryptosuiteVerificationResult.verifiedfalse の場合、 combinedVerificationResult.verifiedfalse に設定する。
    2. それ以外の場合、combinedVerificationResult.documentcryptosuiteVerificationResult.verifiedDocument に設定し、 combinedVerificationResult.mediaTypecryptosuiteVerificationResult.mediaType に設定し、 cryptosuiteVerificationResultsuccessfulVerificationResults に追加する。
  7. combinedVerificationResult.statusfalse の場合、 combinedVerificationResult.documentnull に設定し、 combinedVerificationResult.mediaTypenull に設定する。
  8. combinedVerificationResultsuccessfulVerificationResults を返す。

4.6 コンテキスト検証

次のアルゴリズムは、アプリケーションが文書内の入力に固有のビジネスルールを 実行する前に、文書に関連付けられたコンテキストを理解していることを確保するために 使用できる一つの仕組みを提供する。このアルゴリズムに関連するさらなる根拠については、 2.4.1 コンテキストの検証を参照。 このアルゴリズムは、文書 (map inputDocument)、 既知の JSON-LD Context の集合 (list knownContext)、および未知のコンテキストが検出された場合に 再圧縮するかどうかを示すブール値 (boolean recompact) を入力とする。

このアルゴリズムは、コンテキスト検証結果、 すなわちstructを返す。 その項目は次のとおりである:

validated
true または false
validatedDocument
validatedfalse の場合は Null。そうでない場合は、 入力文書
warnings
ProblemDetailsリストであり、 デフォルトでは空のリストである。
errors
ProblemDetailsリストであり、 デフォルトでは空のリストである。

コンテキスト検証アルゴリズムは次のとおりである:

  1. result.validatedfalse に、 result.warnings を空のリストに、 result.errors を空のリストに、compactionContext を空のリストに設定し、 inputDocumentresult.validatedDocument に複製する。
  2. contextValue を、 result.validatedDocument@context プロパティの値とする。 これは未定義である可能性がある。
  3. contextValueknownContext と深く等しくない場合、 result.validatedDocument 内の任意のサブツリーが @context プロパティを含む場合、または contextValue 内の任意の URI が、既知の正しい値または暗号学的ハッシュに 一致しない JSON-LD Context ファイルへ参照解除される場合、該当するアクションを実行する:
    1. recompacttrue である場合、 result.validatedDocument を、 inputDocument および knownContext を入力として JSON-LD Compaction Algorithmを実行した結果に設定する。圧縮が失敗した場合、 少なくとも1つのエラーを result.errors に追加する。
    2. recompacttrue ではない場合、少なくとも1つのエラーを result.errors に追加する。
  4. result.errors が空である場合、result.validatedtrue に設定する。そうでない場合、 result.validatedfalse に設定し、 result から document プロパティを削除する。
  5. result の値を返す。

実装は、実装または特定のユースケースに固有のさらなる検証規則を強制する 追加の警告またはエラーを含めてもよい (MAY)。

4.7 処理エラー

本仕様およびさまざまな暗号スイート仕様で説明されるアルゴリズムは、 特定の種類のエラーを投げる。実装者は、これらのエラーを他のライブラリまたは ソフトウェアシステムへ伝えることが有用であると考えるかもしれない。 この節は、エラーが発生したときに、本仕様で説明される技術を実装する エコシステムがより効果的に相互運用できるように、これらのエラーに対する 具体的な URL および説明を提供する。

これらのエラーを HTTP インターフェイスを通じて公開する場合、実装者は [RFC9457] を使用して、エラーデータ構造を ProblemDetails mapとして 符号化すべきである (SHOULD)。[RFC9457] が使用される場合:

PROOF_GENERATION_ERROR
証明を生成する要求が失敗した。4.2 証明の追加、 および 4.3 証明セット/チェーンの追加を参照。
PROOF_VERIFICATION_ERROR
証明検証中にエラーが発生した。4.4 証明の 検証を参照。
PROOF_TRANSFORMATION_ERROR
変換処理中にエラーが発生した。
INVALID_DOMAIN_ERROR
証明内の domain 値が期待値と一致しなかった。4.4 証明の検証を参照。
INVALID_CHALLENGE_ERROR
証明内の challenge 値が期待値と一致しなかった。4.4 証明の検証を参照。

5. セキュリティ上の考慮事項

次の節では、この仕様を実装する開発者が安全なソフトウェアを作成するために 認識しておくべきセキュリティ上の考慮事項について説明する。

5.1 暗号スイートのバージョン管理

暗号技術は、秘密の使用を通じて情報を保護する。必要な秘密を知っていれば、 特定の情報にアクセスすることは計算上容易になる。同じ情報は、 計算上困難な総当たりの試みがその秘密を推測することに成功した場合にも アクセスできる。すべての現代的な暗号技術は、その計算上困難なアプローチが 時間を通じて困難であり続けることを必要とするが、科学および数学の突破口により、 それが常に成り立つとは限らない。つまり、暗号技術には寿命があるということである。

本仕様は、現在使用されている暗号技術が時間の経過とともに破られる可能性が 非常に高いと主張することで、すべての暗号学的アプローチの陳腐化を見込んでいる。 ソフトウェアシステムは、情報を継続して保護するために、時間の経過に応じて 使用中の暗号技術を変更できなければならない。そのような変更には、必要な秘密の サイズを大きくすることや、使用される暗号プリミティブの変更が含まれる可能性がある。 しかし、暗号パラメータの組み合わせによっては、実際にはセキュリティを低下させる 可能性がある。これらの前提を踏まえると、システムは、安全な暗号パラメータの 異なる組み合わせ、すなわち暗号スイートを互いに区別できる必要がある。 暗号スイートを識別またはバージョン管理する場合、パラメータ、番号、日付などを 含むいくつかのアプローチを採ることができる。

パラメータ方式のバージョン管理は、暗号スイートで用いられる特定の暗号パラメータを 指定する。たとえば、RSASSA-PKCS1-v1_5-SHA1 のような識別子を 使用できる。この方式の利点は、十分に訓練された暗号技術者が、その識別子によって 使われているすべてのパラメータを判断できることである。この方式の欠点は、 この種の識別子を使用する人々の大半が十分に訓練されておらず、したがって 前述の識別子がもはや安全に使用できない暗号スイートであることを理解しないことである。 さらに、この知識不足により、ソフトウェア開発者が暗号スイート識別子の解析を 一般化し、暗号プリミティブの任意の組み合わせを受け入れ可能にしてしまい、 セキュリティ低下につながる可能性がある。理想的には、暗号スイートは、特定の 受け入れ可能な暗号パラメータのプロファイルとしてソフトウェアに実装されるべきである。

番号方式のバージョン管理は、1.02.1 のような メジャーおよびマイナーバージョン番号を指定する場合がある。番号方式の バージョン管理は、特定の順序を伝え、より高いバージョン番号がより低い バージョン番号より高機能であることを示唆する。このアプローチの利点は、 専門性の低い開発者には理解できない可能性がある複雑なパラメータを取り除き、 アップグレードが適切である可能性を伝える、より単純なモデルにできることである。 このアプローチの欠点は、アップグレードが必要かどうかが明確ではないことである。 ソフトウェアのバージョン番号の増加は、そのソフトウェアが機能し続けるために アップグレードを必要としないことが多いからである。これにより、開発者は 特定のバージョンの使用が安全であると考える可能性があるが、実際にはそうではない。 理想的には、暗号スイートをソフトウェアで使用する開発者に対し、そのスイートの 継続的なセキュリティについて定期的なレビューが必要であることを示す追加の シグナルが与えられるべきである。

日付ベースのバージョン管理は、特定の暗号スイートに対する特定のリリース日を 指定する。年などの日付の利点は、その日付が比較的古いのか新しいのかが 開発者にすぐ分かることである。古い日付を見ることで、開発者はより新しい 暗号スイートを探しに行く可能性があるが、パラメータ方式または番号方式の バージョン管理ではそうならない可能性がある。日付ベースのバージョンの欠点は、 一部の暗号スイートが5〜10年は失効しない可能性があり、開発者がより新しい 暗号スイートを探しに行っても、より新しいものが見つからない可能性があることである。 これは不便かもしれないが、より安全なエコシステムの挙動につながる不便である。

5.2 アプリケーション 開発者の保護

現代的な暗号アルゴリズムは、さまざまなユースケースの多様な要件を満たせるように、 多数の調整可能なパラメータおよびオプションを提供する。たとえば、組み込みシステムは 処理能力とメモリ環境が限られており、特定のアルゴリズムで最強のデジタル署名を 生成するためのリソースを持たない可能性がある。金融取引システムのような 他の環境では、取引が行われている1日だけデータを保護すればよい場合がある一方、 他の環境ではデータを複数十年保護する必要がある場合がある。これらのニーズを 満たすため、暗号アルゴリズム設計者は、多くの場合、暗号アルゴリズムを設定する 複数の方法を提供する。

暗号ライブラリ実装者は、多くの場合、暗号アルゴリズム設計者および仕様著者が 作成した仕様を受け取り、それらのライブラリを使用するアプリケーション開発者に すべてのオプションが利用可能となるように実装する。これは、特定の アプリケーション開発者が特定の暗号配備で必要とする機能の組み合わせが 分からないためである可能性がある。すべてのオプションがアプリケーション開発者に 公開されることが多い。

暗号ライブラリを使用するアプリケーション開発者は、多くの場合、特定の アプリケーションに対して暗号パラメータおよびオプションを適切に選択するために 必要な暗号に関する専門知識および知識を持っていない。この専門知識の不足は、 特定のアプリケーションに対して暗号パラメータおよびオプションを不適切に選択する ことにつながる可能性がある。

本仕様は、暗号ライブラリ実装者よりもアプリケーション開発者を、暗号仕様著者よりも 暗号ライブラリ実装者を、暗号アルゴリズム設計者よりも暗号仕様著者を保護する という構成員の優先順位を設定する。これらの優先順位を踏まえ、次の推奨を行う:

上記の指針は、有用な暗号オプションおよびパラメータがアーキテクチャの下位層で 提供される一方で、各オプションの利点と欠点のバランスを十分に理解していない 可能性のあるアプリケーション開発者に、それらのオプションおよびパラメータを 公開しないことを意図している。

5.3 暗号スイートの 命名規約

5.1 暗号スイートのバージョン管理節では、特定の暗号スイートの時宜性に関して 比較的理解しやすい情報を提供する重要性が強調され、 5.2 アプリケーション開発者の保護節では、指定されるオプションの数を 最小化することがさらに強調された。実際、3. 暗号スイート節は、アルゴリズム、変換、ハッシュ化、およびシリアル化の 詳細な指定を含む暗号スイートの要件を列挙している。したがって、暗号スイートの名前が これらの詳細すべてを含む必要はない。これは、 5.1 暗号スイートのバージョン管理節で述べた パラメータ方式のバージョン管理が、必要でも望ましくもないことを意味する。

暗号スイートの推奨される命名規約は、署名アルゴリズム識別子から成る文字列であり、 暗号スイートが互換性のない実装オプションをサポートする場合は、ハイフンで区切られた オプション識別子を続け、さらにハイフンと、そのスイートが提案された概ねの年を 示す指定を続ける。

たとえば、[DI-EDDSA] は EdDSA デジタル署名に基づき、正規化アプローチに基づく2つの互換性のない オプションをサポートし、概ね2022年に提案されたため、2つの異なる 暗号スイート名、eddsa-rdfc-2022 および eddsa-jcs-2022 を持つ。

[DI-ECDSA] は ECDSA デジタル署名に基づき、[DI-EDDSA] と 同じ2つの互換性のない正規化アプローチをサポートし、さらに楕円曲線とハッシュの 2つの代替集合を通じて2つの異なるセキュリティレベル (128ビットおよび192ビット) を サポートするが、暗号スイート名は ecdsa-rdfc-2019 および ecdsa-jcs-2019 の2つだけである。 セキュリティレベルおよび対応する曲線とハッシュは、妥当性確認で使用される 公開鍵のマルチキー形式から決定される。

5.4 アジリティとレイヤリング

暗号アジリティとは、 頻繁に接続される情報セキュリティシステムを、 複数の暗号プリミティブおよび/またはアルゴリズム間で切り替えられるように 設計する実践である。暗号アジリティの主な目標は、システムのインフラストラクチャに 破壊的な変更を加えることなく、新しい暗号プリミティブおよびアルゴリズムへ システムが迅速に適応できるようにすることである。したがって、SHA-1 アルゴリズムなどの 特定の暗号プリミティブがもはや安全に使用できないと判断された場合、システムは 単純な設定ファイルの変更を通じて、より新しいプリミティブを使用するように 再設定できる。

暗号アジリティは、情報セキュリティシステム内のクライアントとサーバーが 定期的に接触している場合に最も効果的である。しかし、特定の暗号アルゴリズムによって 保護されるメッセージが、検証可能な クレデンシャルのように長寿命である場合、および/またはクライアント (holder) が サーバー (issuer) に容易に再接触できない可能性がある場合、暗号アジリティは 望ましい保護を提供しない。

暗号レイヤリングとは、 まれに接続される情報セキュリティシステムを、 複数のプリミティブおよび/またはアルゴリズムを同時に用いるように 設計する実践である。暗号レイヤリングの主な目標は、1つ以上の暗号アルゴリズムまたは プリミティブが失敗しても、ペイロード上の暗号学的保護を失うことなくシステムが 生き残れるようにすることである。たとえば、単一の情報片に対して RSA、ECDSA、 Falcon アルゴリズムを並列に使用してデジタル署名することは、これら3つの デジタル署名アルゴリズムのうち2つが失敗しても生き残れる仕組みを提供する。 768ビット鍵を使用する RSA デジタル署名など、特定の暗号学的保護が危殆化した場合でも、 システムは危殆化していない暗号学的保護を引き続き利用して情報を保護できる。 開発者には、1年以上保護する必要がある可能性のあるすべての署名済みコンテンツについて、 この機能を活用することが強く求められる。

本仕様は、両方の形態のアジリティを提供する。一つは暗号アジリティであり、 あるアルゴリズムから別のアルゴリズムへ容易に切り替えられるようにする。 もう一つは暗号レイヤリングであり、複数の暗号アルゴリズムを通常は並列に 同時使用できるようにし、情報を保護するために使用されたそれらのいずれも、 他のものに依存せず、また他のものを必要とせずに使用できるようにしつつ、 デジタル証明形式を開発者にとって使いやすく保つ。

5.5 より安全な抽象化

証明には proofValue が含まれ、その中には 暗号学的証明に関連する多数のパラメータを埋め込むことができる。たとえば、 Data Integrity ECDSA Cryptosuites v1.0 仕様の選択的開示アルゴリズムは、 proofValue 内に、選択的に開示可能な各項目につき1つの複数の 暗号署名を含む。これは、アプリケーション開発者にとって技術をより簡単かつ 安全に使用できるようにするために行われている。

本仕様は、仕様著者に対し、アプリケーション層でほとんど必要とされない情報を 抽象化するために単一の値を使用することを強く求める。画像を表す data: URL が、画像レンダリングの多くのパラメータを単一の値にカプセル化するのと 同様に、proofValue プロパティ (および他の類似プロパティ) は、 アプリケーション開発者にとって有用ではない情報を抽象化し、アプリケーションに とって重要であるフィールドの識別を簡素化する。このように情報を抽象化することで、 開発者が扱いやすいデータ構造となり、たとえば、重要なプロパティを追加または 削除するプログラミングエラーによる偶発的な破損によって暗号層に悪影響を与える ことに対して、より影響を受けにくくなる。

本仕様におけるデータ完全性の設計は、一般に暗号層にのみ有用な情報を 単一のプロパティへ抽象化し、アプリケーション開発者の負担を軽減し、 システムのセキュリティを高める。

5.6 変換

暗号学的保護処理の間に、保護対象のデータを変換することが有益な場合がある。 このような「インライン」変換により、特定の種類の暗号学的保護が、そのデータが 搬送されるデータ形式に依存しないものになり得る。たとえば、一部の Data Integrity 暗号スイートは RDF Dataset Canonicalization [RDF-CANON] を利用し、初期表現を 正規形 [N-QUADS] へ変換し、それが シリアル化、ハッシュ化、デジタル署名される。保護対象データを表現する任意の構文が この正規形へ変換できる限り、デジタル署名は検証できる。これにより、情報に対する 同じデジタル署名を、各構文ごとに暗号学的証明を作成することなく、JSON、CBOR、 YAML、およびその他の互換構文で表現できる。

さまざまな構文にわたって同じデジタル署名を表現できることは有益である。 なぜなら、システムはしばしば動作に用いるネイティブなデータ形式を持つからである。 たとえば、JSON データを対象に作られているシステムもあれば、CBOR データを対象に 作られているシステムもある。変換がなければ、内部的にデータを CBOR として 処理するシステムは、デジタル署名されたデータ構造を JSON として保存する必要がある (またはその逆)。これはデータの二重保存につながり、データベースに保存された 署名されていない表現が署名済み表現から偶発的に逸脱した場合、セキュリティ攻撃面を 増大させる可能性がある。変換を使用することで、デジタル証明はネイティブな データ形式の中に存在でき、時間の経過とともに検出不能なデータベースのドリフトが 発生することを防ぐ助けとなる。

本仕様は、「インライン」データ変換を利用することで、署名済み情報の重複を 要求しないように設計されている。アプリケーション開発者には、暗号学的に保護された データをアプリケーションのネイティブなデータ形式で扱い、暗号学的証明を 保護対象データから分離して保存しないことが強く求められる。開発者にはまた、 暗号学的に保護されたデータがアプリケーションストレージへ書き込まれ、そこから 読み出される際に改ざんされていないことを定期的に確認することも強く求められる。

RDF Dataset Canonicalization [RDF-CANON] などの一部の変換には、 攻撃者が過剰な処理サイクルを消費するために使用できる入力データセットに対する 緩和策がある。この種類の攻撃は dataset poisoning と呼ばれ、 すべての現代的な RDF Dataset 正規化器は、この種の不正な入力を検出して 処理を停止することが要求される。RDF Dataset Canonicalization のテストスイートには、 そのような緩和策がすべての適合実装に存在することを確保するため、 そのような毒入りデータセットが含まれている。一般的に言えば、変換を使用する 暗号スイート仕様は、この種の攻撃を緩和することが要求され、実装者には、 使用するソフトウェアライブラリがこれらの緩和策を強制することを確保するよう 強く求められる。これらの攻撃は、サーバー上の接続を枯渇させるために 意図的に接続を遅くする HTTP クライアントなど、あらゆるリソース枯渇攻撃と 同じ一般的なカテゴリに属する。実装者には、防御的なセキュリティ戦略を 実装する際に、この種の攻撃を考慮することが助言される。

5.7 保護される情報

任意のデータ完全性証明によって 保護されるデータは、変換済みデータである。 変換済みデータは、 特定のcryptosuiteによって指定される 変換アルゴリズムによって 生成される。この保護機構は、入力データに対していかなる種類の 変換も行わない一部のより伝統的なデジタル署名機構とは 異なる。変換の利点は、 5.6 変換節で詳述される。

たとえば、 cryptosuitesである ecdsa-jcs-2019 および eddsa-jcs-2022 は、 JSON Canonicalization Scheme (JCS) を使用してデータを正規化 JSON へ 変換し、それが暗号学的にハッシュ化され、 デジタル署名される。このアプローチの一つの利点は、署名対象の情報の意味に 影響しない空白、タブ、改行などの書式文字を追加または削除しても、 デジタル署名が無効にならないことである。より伝統的なデジタル署名機構には この能力がない。

他のcryptosuitesである ecdsa-rdfc-2019 および eddsa-rdfc-2022 は、 RDF Dataset Canonicalization を使用して、データを正規化された N-Quads [N-QUADS] へ 変換し、 それが暗号学的にハッシュ化され、デジタル署名される。このアプローチの一つの利点は、 暗号署名が、JSON、YAML、CBOR など、さまざまな異なる構文へ、署名を無効にすることなく 移植可能であることである。より伝統的な暗号署名機構にはこの能力がない。

実装者および開発者には、データ完全性証明を含む情報を、 その証明が検証済みであり、 かつ返されるすべてのデータが正常に保護されていることを確認したソフトウェアライブラリの 戻り値として検証済みデータが提供されている場合を除き、信頼しないことが強く求められる。

5.8 データの不透明性

アプリケーションデータの検査可能性は、システム効率および開発者生産性に影響を与える。 base 符号化されたバイナリデータなど、暗号学的に保護されたアプリケーションデータが、 データベースなどのアプリケーションサブシステムによって容易に処理できない場合、 暗号学的に保護された情報を扱う労力が増加する。たとえば、データベースによって ネイティブに保存およびインデックス化できる暗号学的に保護されたペイロードは、 次のようなより単純なシステムをもたらす:

同様に、複数の上流ネットワークシステムによって処理可能な暗号学的に保護された ペイロードは、セキュリティアーキテクチャを適切に階層化する能力を高める。 たとえば、上流システムが受信ペイロードを繰り返し復号する必要がない場合、 攻撃に能動的に対抗することに特化した上流サブシステムによって処理負荷を分散する システムの能力が高まる。実質的なアクションを行う前には常にデジタル署名を 確認する必要があるが、明らかに不正なリクエストを拒否するために、識別子ベースの レート制限、署名期限の確認、nonce/challenge の確認など、透明なペイロードに対して 他の上流チェックを実行できる。

さらに、開発者がシステム内のデータを容易に閲覧できない場合、システムの正しさを 容易に監査またはデバッグする能力が妨げられる。たとえば、アプリケーション開発者に base 符号化されたアプリケーションデータの切り貼りを要求すると、開発がより困難になり、 すべてのメッセージが手動操作の base 復号ツールを通過する必要があるため、 明らかなバグが見逃される可能性が高まる。

しかし、データを不透明にすることが正しい設計判断である場合もある。 他のアプリケーションサブシステムによって処理される必要のないデータ、および アプリケーション開発者によって変更またはアクセスされる必要のないデータは、 不透明な形式へシリアル化できる。例として、デジタル署名値、暗号鍵パラメータ、 および暗号ライブラリだけがアクセスする必要があり、アプリケーション開発者が 変更する必要のないその他のデータフィールドがある。保存時暗号化を行うデータベースなど、 基盤となるサブシステムが不透明データの基盤となる複雑さをアプリケーション開発者に 露出しない場合にも、データの不透明性が適切である例がある。これらの場合、 アプリケーション開発者は透明なアプリケーションデータ形式を対象に開発を続け、 データベースが長期保存との間でアプリケーションデータを暗号化および復号する 複雑さを管理する。

本仕様は、アプリケーションデータがネイティブ形式のまま残り、不透明化されない一方で、 デジタル署名などの他の暗号データは不透明なバイナリ符号化形式のまま保持される アーキテクチャを提供することを目指す。暗号スイート実装者には、スイートを設計する際に データの不透明性の適切な使用を検討し、アプリケーションデータを不透明にすることと、 アプリケーション層で暗号データへのアクセスを提供することの設計上のトレードオフを 比較検討することが強く求められる。

5.9 検証メソッドの束縛

実装者は、検証メソッドの定義から 制御識別子 文書へ進み、その後、その制御識別子 文書にもその 検証メソッドへの参照が 含まれていることを確保することで、検証メソッドが特定の controller に束縛されていることを確保する。この処理は、 検証メソッドの取得のアルゴリズムで説明される。

5.10 検証関係の 妥当性確認

実装が証明を検証する場合、証明を生成するために使用された 検証メソッド制御識別子 文書に列挙されていることだけでなく、それが検証されている証明を生成するために 使用されることを意図していたことも検証することが不可欠である。この処理は 「検証関係の妥当性確認」として知られる。

検証関係を妥当性確認する処理は、 制御識別子 v1.0 仕様の 3.3 Retrieve Verification Method節で概説されている。

この処理は、私有暗号鍵などの暗号材料が、意図しない目的にアプリケーションによって 誤用されないことを確保するために使用される。暗号材料の誤用の例として、 検証可能なクレデンシャル を発行するために使用されることを意図した私有暗号鍵が、代わりに Web サイトへ ログインするため (すなわち認証のため) に使用される場合がある。検証関係を確認しないことは 危険である。なぜなら、ある暗号材料に対する制限および保護プロファイルは、その 意図された用途によって決定され得るからである。たとえば、一部のアプリケーションは 暗号材料を1つの目的にのみ使用することを信頼されている場合があり、また一部の 暗号材料は、ラップトップ上の暗号化されていないファイルではなく、データセンター内の ハードウェアセキュリティモジュールに保存されるなど、より保護されている場合がある。

5.11 証明目的の妥当性確認

実装が証明を検証する場合、 証明の目的が意図された用途と 一致することを検証することが不可欠である。

この処理は、証明がアプリケーションによって意図しない目的に誤用されないことを 確保するために使用される。これは証明作成者にとって危険である。誤用の例として、 検証可能なクレデンシャル における主張を保護するための目的であると記載された証明が、代わりに Web サイトへ ログインするためのauthenticationに使用される場合がある。この場合、 証明作成者は、無制限の数の他の当事者に配布されることを期待して、任意の数の 検証可能なクレデンシャル に証明を添付している。これらの当事者のいずれかが、Web サイトがそのような証明を 意図された目的ではなくauthenticationとして誤って受け入れた場合、 証明作成者として Web サイトにログインできてしまう。

5.12 正規化メソッドの セキュリティ

正規化などの変換が実行される方法は、システムのセキュリティ特性に影響を与える 可能性がある。最良の正規化機構の選択は、ユースケースに依存する。多くの場合、 望ましいセキュリティ要件を満たす最も単純な機構が最良の選択である。 この節は、本仕様で参照される2つの主な正規化機構、すなわち JSON Canonicalization Scheme [RFC8785] および RDF Dataset Canonicalization [RDF-CANON] の間で実装者が選択するのに 役立つ、単純な指針を提供しようとするものである。

アプリケーションが JSON のみを使用し、いかなる形式の RDF 意味論にも依存しない場合、 JSON Canonicalization Scheme [RFC8785] を使用する暗号スイートを 使用することは魅力的なアプローチである。

アプリケーションが JSON-LD を使用し、文書の意味論を保護する必要がある場合、 RDF Dataset Canonicalization [RDF-CANON] を使用する暗号スイートを 使用することは魅力的なアプローチである。

実装者には、変換を行わず、データに証明を埋め込む代わりに暗号学的エンベロープで データを包むことによってデータを保護する他の機構も利用可能であることが助言される。 その例には JWTs [RFC7519] および CWTs [RFC8392] がある。 これらのアプローチは、一部のユースケースでは単純さの利点を持つが、本仕様で詳述される アプローチが提供する利点の一部を犠牲にする。

5.13 正規化メソッドの 正確性

本仕様で使用されるアルゴリズム処理の一つは正規化であり、これは 変換の一種である。正規化とは、意味論的に 等価なさまざまな方法で表現され得る情報を入力として受け取り、すべての出力を 「正規形」と呼ばれる単一の方法で表現する処理である。

正規化を利用する結果として得られる データ完全性証明の セキュリティは、アルゴリズムの正確性に大きく依存する。たとえば、正規化 アルゴリズムが、異なる意味を持つ2つの入力を同じ出力へ変換する場合、著者の意図が 検証者に対して 誤って表現される可能性がある。これは攻撃者によって攻撃ベクトルとして使用され得る。

さらに、入力内の意味論的に関連する情報が出力に存在しない場合、攻撃者は 証明検証を失敗させることなく、そのような情報をメッセージに挿入できる可能性がある。 これは、暗号学的にメッセージへ署名する際によく使用される別の変換である 暗号学的ハッシュ化に似ている。攻撃者が異なる入力から同じ暗号学的ハッシュを 生成できる場合、その暗号学的ハッシュアルゴリズムは安全であるとは見なされない。

実装者には、入力をハッシュ化処理へ 変換するために使用される任意の 正規化アルゴリズムについて、適切な精査を確保することが強く求められる。 適切な精査には、少なくとも、アルゴリズムの正確性に関する査読済み数学的証明との 関連付けが含まれる。複数の実装、および標準化団体における専門家による精査が 望ましい。実装者には、情報正規化に関する正式な訓練を受けている場合、および/または アルゴリズムの正確性に関する査読済み数学的証明を作成できる分野の専門家へ アクセスできる場合を除き、新しい仕組みを考案または使用しないことが強く求められる。

5.14 ネットワークリクエスト

本仕様は、適合する保護済み文書上の証明を 検証する際に、ネットワークリクエストを必要としないように設計されている。 しかし読者は、JSON-LD contexts および 検証 メソッドが、ネットワーク接続を介して取得される可能性のある URL を含み得ることに 注意するかもしれない。この懸念は、検証中または検証後にネットワークから読み込まれる 可能性のある任意の URL に存在する。

可能な限り、実装者には、そのような情報を永続的または積極的にキャッシュし、 ネットワーク経由でそのような URL を取得する必要がある実装の攻撃面を低減することが 強く求められる。たとえば、JSON-LD contexts のキャッシュ手法は、 2.4 コンテキストと語彙節で説明されており、 did:key [DID-KEY] など一部の 検証 メソッドは、ネットワークから取得する必要がまったくない。

特定の HTTP URL ベースの 検証メソッドの インスタンスに初めて遭遇する場合など、キャッシュ済み情報を使用できない場合、 実装者には、ネットワークからリソースを取得する可能性のある任意の処理中に、 サービス拒否攻撃を緩和するための防御策を使用することが注意喚起される。

5.15 その他のセキュリティ上の考慮事項

本仕様で説明される文書を保護する技術は一般化された性質を持つため、 その使用に伴うセキュリティ上の影響は、読者にすぐ明らかではない可能性がある。 完全なソフトウェアシステムで考慮する必要があり得る種類のセキュリティ上の懸念を 理解するため、実装者には、この技術が 検証可能なクレデンシャル エコシステム [VC-DATA-MODEL-2.0] で どのように使用されるかを読むことが強く求められる。詳細については 検証可能なクレデンシャルのセキュリティ上の考慮事項に関する節を参照。

6. プライバシー上の考慮事項

次の節では、この仕様を実装する開発者がプライバシーを高めるソフトウェアを作成するために 認識しておくべきプライバシー上の考慮事項について説明する。

6.1 非リンク可能性

デジタル署名されたペイロードに、複数の検証者によって見られるデータが含まれる場合、 それは相関の点となる。そのようなデータの例は、買い物のロイヤルティカード番号である。 相関可能なデータは検証者による追跡目的に使用でき、場合によってはプライバシー期待に 反する可能性がある。一部のデータが追跡に使用できるという事実は、すぐには明らかで ない可能性がある。そのような相関可能データの例には、静的なデジタル署名や画像の 暗号学的ハッシュが含まれるが、これらに限定されない。

相関可能な追跡データを持たず、同時に特定のやり取りに対してペイロードが信頼できる ことについて一定程度の保証を提供する、デジタル署名されたペイロードを作成することは 可能である。この特性は 非リンク可能性と呼ばれ、デジタル署名されたペイロードに 相関可能なデータが使用されないことを確保しつつ、一定程度の信頼を提供する。 その十分性は各検証者が判断しなければならない。

すべてのユースケースが非リンク可能性を必要とする、または許可するわけではないことを 理解することが重要である。危険物を輸送および保管する組織や個人を相関させる場合など、 規制上または安全上の理由によりリンク可能性および相関が必要となるユースケースがある。 非リンク可能性は、特定のやり取りに対するプライバシー期待がある場合に有用である。

一定程度の非リンク可能性を提供できる仕組みは少なくとも2つある。 第1の方法は、メッセージで使用されるデータ値が将来のメッセージで決して 繰り返されないようにすることである。第2の方法は、繰り返される任意のデータ値が 十分な群衆プライバシーを提供し、そのやり取りにおいて一定程度のプライバシーを 期待するエンティティを相関させることが実質的に不可能になるようにすることである。

非リンク可能性を達成するために、さまざまな方法を使用できる。これらの方法には、 メッセージを、相関目的に使用できる情報を持たない単回使用のベアラートークンにすること、 十分なレベルの群衆プライバシーを確保する属性を使用すること、および、提示される メッセージへの信頼を損なうことなく、メッセージを提示するエンティティが新しい署名を 再生成できる暗号スイートを使用することが含まれる。

6.2 選択的開示

選択的開示とは、以前に署名されたメッセージ (すなわち、その作成者によって署名された メッセージ) の受信者が、その部分の検証可能性を損なうことなく、メッセージの一部だけを 明らかにできる技術である。たとえば、車を借りる目的でデジタル運転免許証を 選択的に開示する場合がある。これには、免許証から発行機関、免許番号、生年月日、 および許可された自動車クラスのみを明らかにすることが含まれ得る。この場合、 免許番号は相関可能な情報であるが、運転者の氏名および住所が共有されないため、 ある程度のプライバシーが保持されることに注意する。

すべてのソフトウェアまたは暗号スイートが選択的開示を提供できるわけではない。 メッセージの著者が、その受信者によって選択的に開示可能であることを望む場合、 特定のメッセージで選択的開示を有効にする必要があり、両者は対応可能な 暗号スイートを使用する必要がある。著者はまた、メッセージの特定部分の開示を 必須にする場合もある。メッセージの部分的な内容を選択的に開示したい受信者は、 その技術を実行できるソフトウェアを利用する必要がある。選択的開示をサポートする 暗号スイートの例は bbs-2023 である。

非リンク可能性を保持しない方法で情報を選択的に開示することも可能である。 たとえば、出荷に関連する検査結果を開示したい場合があり、その検査結果には 規制要件により相関可能である必要がある出荷識別子またはロット番号が含まれる 可能性がある。しかし、検査結果全体の開示は必要ではない場合があり、合格/不合格 状態だけを選択的に開示することで十分と見なされる可能性がある。プライバシーを 保持しながら情報を開示することに関する詳細については、 6.1 非リンク可能性を参照。

6.3 以前の証明

2.1.2 証明 チェーンで定義される previousProof 機能を使用する場合、 実装は、1つ以上の以前の証明に対してデジタル署名することを要求される。 これは、それらを保護済みペイロードに含めるためである。これにより必然的に、 以前の証明を追加した各エンティティに関連する情報が露出する。

少なくとも、以前の証明の 検証メソッド、たとえば 公開鍵は、証明チェーン内の次の証明の作成者に見られる。これは、以前の証明の作成者が 証明チェーンに含まれることを意図していなかった場合にはプライバシー上の懸念となり得るが、 あらゆる種類の文書に否認不能なデジタル署名を追加する場合には避けられない結果である。

グループ署名など、 より高度な暗号機構を使用して、メッセージ署名者の身元を隠すことは可能であり、 Data Integrity 暗号スイートがこのプライバシー上の懸念を緩和することも可能である。

6.4 ネットワークリクエストの フィンガープリンティング

フィンガープリンティングの懸念は、証明検証中またはその後に ネットワークから読み込まれる可能性のある任意の URL に存在する。本仕様は、 適合する保護済み文書上の 証明を検証する際に、ネットワークリクエストが必要ないように設計されている。 しかし読者は、JSON-LD contexts および 検証 メソッドが、ネットワーク接続を介して取得される可能性のあるリソース URL を含み、 フィンガープリンティングの懸念につながり得ることに注意するかもしれない。

たとえば、適合する保護済み文書の 作成者は、JSON-LD contexts および 検証 メソッドについて、文書ごとに一意の URL を作成する可能性がある。 そのような文書を検証する際、検証者がその情報をネットワークから取得すると、 その文書に対する関心を文書の作成者に明らかにしてしまい、文書の作成者ではない 任意のエンティティに対するプライバシー期待との不一致につながる可能性がある。

実装者には、URL のキャッシュおよびネットワークから URL を取得する際の防御的実装に ついて、5.14 ネットワーク リクエスト節の指針に従うことが強く求められる。 リクエストを行っているクライアントを明らかにせずにネットワークからリソースを 取得するために、 Oblivious HTTP などの技術を使用することが奨励される。さらに、 適合する保護済み文書の作成者が、 プライバシー期待に反する可能性のある方法でフィンガープリンティング URL を 使用しているかどうかを判断するために、ヒューリスティックを使用してもよい。 これらのヒューリスティックは、フィンガープリンティングが疑われる URL を含む文書を 処理する可能性のあるエンティティに警告を表示するために使用できる。

6.5 正規化メソッドの プライバシー

変換、すなわち正規化が実行される方法は、システムのプライバシー特性に影響を与える 可能性がある。最良の正規化機構の選択は、ユースケースに依存する。 この節は、本仕様で参照される2つの主な正規化機構、すなわち JSON Canonicalization Scheme [RFC8785] および RDF Dataset Canonicalization [RDF-CANON] の間で、 プライバシーの観点から実装者が選択するのに役立つ単純な指針を提供しようとするものである。

アプリケーションが保護済み文書内の情報の選択的開示を行う必要がなく、 JSON-LD も利用しない場合、JSON Canonicalization Scheme [RFC8785] は魅力的なアプローチである。

アプリケーションが JSON-LD を使用し、保護済み文書内の情報の選択的開示を 必要とする可能性がある場合、RDF Dataset Canonicalization [RDF-CANON] を使用する暗号スイートを 使用することは魅力的なアプローチである。

実装者には、変換を行わず、データに証明を埋め込む代わりに暗号学的エンベロープで データを包むことによってデータを保護する、他の選択的開示機構も利用可能であることが 助言される。その例には SD-JWTs [SD-JWT] がある。このアプローチは、 一部のユースケースでは単純さの利点を持つが、本仕様で詳述されるアプローチが提供する 利点の一部を犠牲にする。

6.6 その他のプライバシー上の考慮事項

本仕様で説明される文書を保護する技術は一般化された性質を持つため、 その使用に伴うプライバシー上の影響は、読者にすぐ明らかではない可能性がある。 完全なソフトウェアシステムで考慮する必要があり得る種類のプライバシー上の懸念を 理解するため、実装者には、この技術が 検証可能なクレデンシャル エコシステム [VC-DATA-MODEL-2.0] で どのように使用されるかを読むことが強く求められる。詳細については 検証可能なクレデンシャルのプライバシー上の考慮事項に関する節を参照。

7. アクセシビリティ上の考慮事項

次の節では、この仕様を実装する開発者が、自身のソフトウェアをさまざまな認知、 運動、および視覚上のニーズを持つ人々にとって利用可能にするために考慮することが 強く求められるアクセシビリティ上の考慮事項について説明する。一般的な規則として、 本仕様はシステムソフトウェアによって使用され、アクセシビリティ上の考慮事項の対象となる 情報を個人に直接公開するものではない。しかし、本仕様によって表現される情報に 個人が間接的にさらされる場合があり、そのような状況のために以下の指針が提供される。

7.1 時刻値の提示

本仕様は、暗号学的証明の有効期間に関連する日付および時刻の表現を可能にする。 この情報は、証明が処理され、許容される時間範囲外であると検出された場合、 個人に間接的に公開される可能性がある。これらの日付および時刻を個人に公開する場合、 実装者には、表示ソフトウェアにおいて 日付および時刻を表現する際の 文化的規範とロケールを考慮に入れることが強く求められる。これらの考慮事項に加え、 情報を受け取る個人の認知的負担を軽減する方法で時刻値を提示することは、推奨される ベストプラクティスである。

たとえば、特定のデジタル署名済み情報集合の有効期限を伝える場合、実装者には、 正確性を最適化する表現ではなく、理解しやすい言葉を使用して有効期限を提示することが 強く求められる。有効期限を「このチケットは3日前に期限切れになりました。」として 提示することは、「このチケットは2023年7月25日午後3時43分に期限切れになりました。」 のような表現よりも望ましい。前者は、後者の時刻よりも理解しやすい相対時刻を提供する。 後者は、個人が頭の中で計算することを必要とし、そのような計算が可能であることを 前提としている。

A. 証明セット および証明チェーンの理解

この節は非規範的である。

2.1.1 証明セットおよび2.1.2 証明チェーン の各節では、複数の証明を 保護済みデータ文書で 表現する方法を説明する。すなわち、 保護済みデータ文書に含まれる単一の 証明 の代わりに、 6および 7に示すように、複数の証明を リストで表現できる。 このリストの要素は、 証明セットのメンバーであり、任意で 証明チェーンの メンバーでもある。この節の目的は、これらの各機能の意図された使用法、 特にそれらの異なるセキュリティ特性を説明することである。これらの異なる セキュリティ特性は、 4.3 証明セット/チェーンの追加節における処理の違いにつながる。

この節では、重要なセキュリティ特性を観察できるように、 証明を含む保護済みデータ文書を 簡略化した形で表現する。

CEO、CFO、およびエンジニアリング担当副社長という3人の署名者がいる シナリオを考える。それぞれが文書へ署名するための公開鍵と秘密鍵の ペアを持つ必要がある。これらの署名者それぞれの秘密鍵/公開鍵を、 それぞれ secretCEO/publicCEOsecretCFO/publicCFO、および secretVPE/publicVPE と表す。

各署名者がinputDocumentへ個別に署名する 証明セットを構築する場合、証明を記号的に次のように構築する:

9: 証明が作成される方法の記号的表現
{
  "type": "DataIntegrityProof",
  "cryptosuite": "eddsa-jcs-2022",
  "created": "2023-03-05T19:23:24Z",
  "proofPurpose": "assertionMethod",
  "verificationMethod": publicCEO,
  "proofValue": signature(secretCEO, inputDocument)
}

ここで、publicCEO は CEO の公開鍵へ解決される参照のプレースホルダーとして 使用され、signature(secretKey, inputDocument) は、特定の秘密鍵を使用し、特定の文書に対して、 特定のデータ完全性暗号スイートによってデジタル署名を計算することを表す。 typecryptosuitecreated、および proofPurpose 属性はこの議論に影響しないため省略する。特に、以下では、 エンジニアリング担当副社長、CFO、および CEO によって署名された文書上の 証明セット内のすべての証明を示す:

10: 証明セットの記号的表現
{
  // 保護済みデータ文書の残りは示していない (上記)
  "proof": [{
    "verificationMethod": publicVPE,
    "proofValue": signature(secretVPE, inputDocument)
  }, {
    "verificationMethod": publicCFO,
    "proofValue": signature(secretCFO, inputDocument)
  }, {
    "verificationMethod": publicCEO,
    "proofValue": signature(secretCEO, inputDocument)
  }]
}

holderまたは 証明セットを含む 保護済みデータ文書を受け取る その他の仲介者は、それを別のエンティティへ渡す前に、そのセット内の proof 値のいずれかを削除でき、それでもその 保護済み データ文書は検証に成功する。これは意図されたことである場合もあれば、 そうでない場合もある。大切な従業員へ誕生日カードを送る署名者の場合、 証明セットを使うことは おそらく問題ない。承認が会社の階層を上っていく業務プロセスをモデル化しようと している場合には、これは理想的ではない。なぜなら、任意の仲介者が 証明セットから署名を削除しても、 それをなお検証可能にできるからである。たとえば、以下の例では、 エンジニアリング担当副社長の同意なしに、CFO と CEO が何かを承認したように見える。

11: 証明セット内の署名の削除
{
  // 保護済みデータ文書の残りは示していない (上記)
  "proof": [{
    "verificationMethod": publicCFO,
    "proofValue": signature(secretCFO, inputDocument)
  }, {
    "verificationMethod": publicCEO,
    "proofValue": signature(secretCEO, inputDocument)
  }]
}

各証明の id プロパティを設定して別の証明から参照できるようにすることで、 証明セット内の 証明間に依存関係を導入できる。 つまり、依存される証明は、 previousProof プロパティを用いて、他の 依存する証明から参照される。このような 依存チェーンは任意の深さを持つことができる。このような 証明チェーン意図は、 業務プロセスにおける承認チェーン、またはアナログ署名を目撃する公証人を モデル化することである。

以下の例は、エンジニアリング担当副社長が最初に文書を承認署名し、 そのエンジニアリング担当副社長の署名とレビューに基づいて CFO が文書を承認署名し、 最後にそれ以前の両方の署名とレビューに基づいて CEO が文書を承認署名する場合に、 証明チェーンをどのように構築できるかを 示す。ほかの者がエンジニアリング担当副社長の署名を参照することになるため、 その証明に id を追加する必要がある。まず、エンジニアリング担当副社長が 入力文書に署名する:

12: `id` プロパティが設定された最初の証明を含む 証明チェーン
{
  // 保護済みデータ文書の残りは示していない (上記)
  "proof": {
    "id": "urn:proof-1",
    "verificationMethod": publicVPE,
    "proofValue": signature(secretVPE, inputDocument)
  }
}

次に、CFO は文書を受け取り、エンジニアリング担当副社長がそれに署名したことを 検証し、レビューとエンジニアリング担当副社長の署名に基づいてそれに署名する。 そのためには、受け取ったばかりの文書内の証明への依存関係を示すことで、 証明チェーンを設定する必要がある。 これは、第2の証明の previousProof プロパティを urn:proof-1 という値に設定することで行う。これにより、第2の証明が 第1の証明へ「束縛」され、その後署名される。次の例は、第1の証明への依存関係が どのように作成されるかを示している:

13: 2つの証明を含む証明チェーン
{
  // 保護済みデータ文書の残りは示していない (上記)
  "proof": [{
    "id": "urn:proof-1",
    "verificationMethod": publicVPE,
    "proofValue": signature(secretVPE, inputDocument)
  }, {
    "id": "urn:proof-2",
    "verificationMethod": publicCFO,
    "previousProof": "urn:proof-1",
    "proofValue": signature(secretCFO, inputDocumentWithProof1)
  }]
}

ここで、CEO が上記の証明チェーンを持つ、受け取った 保護済み データ文書を検証する場合、CFO がエンジニアリング担当副社長の署名に基づいて 署名したことを確認する。まず、id プロパティの値が urn:proof-1 である証明を、エンジニアリング担当副社長の公開鍵に対して 確認する。この証明は元の文書に対するものであることに注意する。

次に、CEO は id プロパティの値が urn:proof-2 である証明を、CFO の公開鍵に対して確認する。しかし、 CFO が、エンジニアリング担当副社長がすでに署名した証明を含む文書に署名したことを 確実にするため、この証明を文書と urn:proof-1 の組み合わせに対して 検証する。検証が成功した場合、CEO は署名し、urn:proof-1 および urn:proof-2 を含む文書に対する証明を生成する。最終的な 証明チェーンは次のようになる:

14: 3つの証明を含む証明チェーン
{
  // 保護済みデータ文書の残りは示していない (上記)
  "proof": [{
    "id": "urn:proof-1",
    "verificationMethod": publicVPE,
    "proofValue": signature(secretVPE, inputDocument)
  }, {
    "id": "urn:proof-2",
    "verificationMethod": publicCFO,
    "previousProof": "urn:proof-1",
    "proofValue": signature(secretCFO, inputDocumentWithProof1)
  }, {
    "id": "urn:proof-3",
    "verificationMethod": publicCEO,
    "previousProof": "urn:proof-2",
    "proofValue": signature(secretCEO, inputDocumentWithProof2)
  }]
}

この保護済みデータ文書の受信者は、 その後、同様の方法でそれを妥当性確認し、チェーン内の各証明を確認する。

B. 改訂履歴

この節は非規範的である。

この節には、この仕様に対して時間の経過とともに行われた実質的な変更を含む。

第2候補勧告以降の変更:

第1候補勧告以降の変更:

最初の公開作業草案以降の変更:

C. 謝辞

この節は非規範的である。

この仕様に関する作業は、Christopher Allen、Shannon Appelcline、Kiara Robles、 Brian Weller、Betty Dhamers、Kaliya Young、Manu Sporny、Drummond Reed、Joe Andrieu、Heather Vescent、Kim Hamilton Duffy、Samantha Chase、Andrew Hughes、 Will Abramson、Erica Connell、および Eric Schuh によって推進された Rebooting the Web of Trust コミュニティによって支援された。Phil Windley、 Kaliya Young、Doc Searls、および Heidi Nobantu Saul によって推進された Internet Identity Workshop の参加者も、この仕様について学び、議論し、 改善するために設計された多数のワーキングセッションを通じて、この作業の 洗練を支援した。

ワーキンググループはまた、議長である Brent Zundel、前議長である Kristina Yasuda、および W3C スタッフ連絡先である Ivan Herman に対し、W3C 標準化プロセスを 通じたグループの専門的な管理と安定した指導に感謝する。

この仕様に関する作業の一部は、契約 70RSAT20T00000029、70RSAT21T00000016、 70RSAT23T00000005、70RSAT20T00000010/P00001、70RSAT20T00000029、 70RSAT21T00000016/P00001、70RSAT23T00000005、70RSAT23C00000030、 70RSAT23R00000006、70RSAT24T00000011 に基づく米国国土安全保障省 科学技術局、および NSF 22-572 を通じた全米科学財団によって資金提供された。 この仕様の内容は、必ずしも米国政府の立場または方針を反映するものではなく、 公式な承認が示唆されるべきではない。

ワーキンググループは、この仕様をレビューし、フィードバックを提供した以下の個人に 感謝する (姓のアルファベット順、名前が提供されていない場合は GitHub ハンドル順):

Will Abramson, Mahmoud Alkhraishi, Christopher Allen, Joe Andrieu, Bohdan Andriyiv, George Aristy, Anthony, Greg Bernstein, Bob420, Sarven Capadisli, Melvin Carvalho, David Chadwick, Gabe Cohen, Matt Collier, Sebastian Crane, Kim Hamilton Duffy, Snorre Lothar von Gohren Edwin, Veikko Eeva, Eric Elliott, Raphael Flechtner, Julien Fraichot, Benjamin Goering, Kyle Den Hartog, Joseph Heenan, Helge Krueger, Ivan Herman, Michael Herman, Alen Horvat, Anil John, Andrew Jones, Michael B. Jones, Rieks Joosten, Gregory K., Gregg Kellogg, Filip Kolarik, David I. Lehn, Charles E. Lehner, Christine Lemmer-Webber, Eric Lim, Dave Longley, Tobias Looker, Jer Miller, nightpool, Bert Van Nuffelen, Luis Osta, Nate Otto, George J. Padayatti, Addison Phillips, Mike Prorock, Brian Richter, Anders Rundgren, Eugeniu Rusu, Markus Sabadello, silverpill, Wesley Smith, Manu Sporny, Orie Steele, Patrick St-Louis, Henry Story, Oliver Terbu, Ted Thibodeau Jr., John Toohey, Mike Varley, Jeffrey Yasskin, Kristina Yasuda, Benjamin Young, Dmitri Zagidulin, and Brent Zundel.

D. 参考文献

D.1 規範的参考文献

[ASCII]
ISO/IEC 646:1991, 情報技術 -- 情報交換用 ISO 7ビット符号化文字集合. Ecma International. URL: https://www.ecma-international.org/publications-and-standards/standards/ecma-6/
[CID]
Controlled Identifiers v1.0. Michael Jones; Manu Sporny. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/cid-1.0/
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 2020年7月16日. W3C 勧告. URL: https://www.w3.org/TR/json-ld11/
[JSON-LD11-API]
JSON-LD 1.1 Processing Algorithms and API. Gregg Kellogg; Dave Longley; Pierre-Antoine Champin. W3C. 2020年7月16日. W3C 勧告. URL: https://www.w3.org/TR/json-ld11-api/
[MIMESNIFF]
MIME Sniffing Standard. Gordon P. Hemsley. WHATWG. Living Standard. URL: https://mimesniff.spec.whatwg.org/
[RDF-CANON]
RDF Dataset Canonicalization. Gregg Kellogg; Dave Longley; Dan Yamamoto. W3C. 2024年5月21日. W3C 勧告. URL: https://www.w3.org/TR/rdf-canon/
[RFC2119]
RFC において要求レベルを示すために使用される キーワード. S. Bradner. IETF. 1997年3月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧性. B. Leiba. IETF. 2017年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8259]
JavaScript Object Notation (JSON) データ 交換形式. T. Bray, Ed. IETF. 2017年12月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc8259
[RFC8785]
JSON Canonicalization Scheme (JCS). A. Rundgren; B. Jordan; S. Erdtman. IETF. 2020年6月. Informational. URL: https://www.rfc-editor.org/rfc/rfc8785
[RFC9457]
Problem Details for HTTP APIs. M. Nottingham; E. Wilde; S. Dalal. IETF. 2023年7月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9457
[URL]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[VC-DATA-MODEL-2.0]
検証可能なクレデンシャル・データモデル v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/vc-data-model-2.0/
[XMLSCHEMA11-2]
W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 2012年4月5日. W3C 勧告. URL: https://www.w3.org/TR/xmlschema11-2/

D.2 参考情報としての参考文献

[DI-ECDSA]
楕円曲線デジタル署名アルゴリズム 暗号スイート v1.0. David Longley; Manu Sporny; Marty Reed. W3C Verifiable Credentials Working Group. W3C 作業草案. URL: https://www.w3.org/TR/vc-di-ecdsa/
[DI-EDDSA]
Edwards デジタル署名アルゴリズム 暗号スイート v1.0. David Longley; Manu Sporny; Dmitri Zagidulin. W3C Verifiable Credentials Working Group. W3C 作業草案. URL: https://www.w3.org/TR/vc-di-eddsa/
[DID]
分散識別子 (DIDs) v1.0. Manu Sporny; Amy Guy; Markus Sabadello; Drummond Reed. W3C. 2022年7月19日. W3C 勧告. URL: https://www.w3.org/TR/did-core/
[DID-KEY]
The did:key Method. Manu Sporny; Dmitri Zagidulin; Dave Longley; Orie Steele. W3C Credentials Community Group. CG-DRAFT. URL: https://w3c-ccg.github.io/did-key-spec/
[HTML-RDFA]
HTML+RDFa 1.1 - Second Edition. Manu Sporny. W3C. 2015年3月17日. W3C 勧告. URL: https://www.w3.org/TR/html-rdfa/
[LTLI]
Web のための言語タグおよびロケール識別子. Addison Phillips. W3C. 2020年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/ltli/
[N-QUADS]
RDF 1.1 N-Quads. Gavin Carothers. W3C. 2014年2月25日. W3C 勧告. URL: https://www.w3.org/TR/n-quads/
[RDF-CONCEPTS]
Resource Description Framework (RDF): Concepts and Abstract Syntax. Graham Klyne; Jeremy Carroll. W3C. 2004年2月10日. W3C 勧告. URL: https://www.w3.org/TR/rdf-concepts/
[RFC5280]
Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. D. Cooper; S. Santesson; S. Farrell; S. Boeyen; R. Housley; W. Polk. IETF. 2008年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5280
[RFC7517]
JSON Web Key (JWK). M. Jones. IETF. 2015年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7517
[RFC7519]
JSON Web Token (JWT). M. Jones; J. Bradley; N. Sakimura. IETF. 2015年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7519
[RFC7696]
暗号アルゴリズム・アジリティおよび 実装必須アルゴリズム選択のための指針. R. Housley. IETF. 2015年11月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc7696
[RFC8392]
CBOR Web Token (CWT). M. Jones; E. Wahlstroem; S. Erdtman; H. Tschofenig. IETF. 2018年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8392
[RFC9562]
Universally Unique IDentifiers (UUIDs). K. Davis; B. Peabody; P. Leach. IETF. 2024年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9562
[SD-JWT]
JWT のための 選択的開示 (SD-JWT). Daniel Fett; Kristina Yasuda; Brian Campbell. The IETF OAuth Working Group. I-D. URL: https://datatracker.ietf.org/doc/draft-ietf-oauth-selective-disclosure-jwt/
[SECURITY-VOCABULARY]
The Security Vocabulary. Ivan Herman; Manu Sporny; David Longley. Verifiable Credentials Working Group. W3C Editor's Draft. URL: https://w3id.org/security
[TURTLE]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 2014年2月25日. W3C 勧告. URL: https://www.w3.org/TR/turtle/
[VC-DI-ECDSA]
Data Integrity ECDSA Cryptosuites v1.0. Manu Sporny; Dave Longley; Greg Bernstein. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/vc-di-ecdsa/
[VC-DI-EDDSA]
Data Integrity EdDSA Cryptosuites v1.0. Manu Sporny; Ted Thibodeau Jr; Greg Bernstein. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/vc-di-eddsa/
[VC-EXTENSIONS]
Verifiable Credential Extensions. Manu Sporny. W3C Verifiable Credentials Working Group. W3C Editor's Draft. URL: https://w3c.github.io/vc-extensions/
[WEBCRYPTOAPI]
Web Cryptography API. Mark Watson. W3C. 2017年1月26日. W3C 勧告. URL: https://www.w3.org/TR/WebCryptoAPI/
[ZCAP]
Linked Data のための認可ケイパビリティ. Credentials Community Group. CGDRAFT. URL: https://w3c-ccg.github.io/zcap-spec/