検証可能なクレデンシャル偽造防御 v1.0

インデックス付きハッシュ ウィットネスを使用する、検証可能なクレデンシャルの偽造防止機構

W3C 第一公開作業草案

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2026/WD-vc-forgery-defense-1.0-20260630/
最新公開バージョン:
https://www.w3.org/TR/vc-forgery-defense-1.0/
最新編集者草案:
https://w3c.github.io/vc-forgery-defense/
履歴:
https://www.w3.org/standards/history/vc-forgery-defense-1.0/
コミット履歴
編集者:
Wesley Smith (Digital Bazaar)
Elaine Wooton (招待専門家)
著者:
Wesley Smith (Digital Bazaar)
Dave Longley (Digital Bazaar)
Manu Sporny (Digital Bazaar)
フィードバック:
GitHub w3c/vc-forgery-defense (プルリクエスト, 新しい課題, 未解決の課題)

概要

この仕様は、発行者検証可能な クレデンシャルについて、コンパクトな暗号学的 ウィットネスのインデックス付きリストを公開するための仕組みを記述する。 検証者はこれらのリストを使用して、 検証可能なクレデンシャルが 主張された発行者によって真正に発行されたことを 確認できる。これは、発行者の署名鍵を侵害した攻撃者によって 偽造されたクレデンシャルとは区別される。ウィットネスリスト自体が 検証可能なクレデンシャルであるため、保護対象のクレデンシャルとは 異なるアルゴリズムで署名でき、ポスト量子署名方式も含めることができる。この 仕組みは、従来型の署名鍵が量子能力を持つ敵対者によって 侵害されたシナリオにおいて特に有用である。

この作業は、耐量子暗号スイート 1.0の作業を補完するものであり、 暗号学的に関連する量子コンピューターによる 従来型の署名鍵の侵害という同じ脅威を動機としている。 これらの暗号スイートは、発行者が新しい証明をポスト量子 署名で保護できるようにする。この仕様は、ポスト量子方式で 署名されたウィットネスリストを公開することにより、発行者が 従来型の量子脆弱なアルゴリズムで署名された、または今後署名される クレデンシャルについて、ポスト量子に裏付けられた真正性を 確立できるようにする。

この仕様は、3つの利用 モードに関するデータモデルとアルゴリズムを定義する。既存の 検証可能なクレデンシャル・ビット文字列ステータス リストに相乗りし、 保護対象のクレデンシャルを変更しない暗黙モード、保護対象のクレデンシャルに credentialStatusエントリを追加する明示モード、および独自のインデックス 割り当てを定義するユースケース向けの スタンドアロンモードである。

この文書の状態

このセクションは、この 文書の公開時点における状態を記述する。現在のW3C 公開物の一覧と、この技術報告書の最新改訂版は、 W3C標準および草案 インデックスにある。

この文書は、Verifiable Credentials Working Groupにより、 勧告 トラックを使用して、第一公開作業草案として 公開された。

第一公開作業草案としての公開は、 W3Cおよびそのメンバーによる支持を 意味しない。

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

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

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

1. 序論

このセクションは非規範的である。

検証可能な クレデンシャルは、その内容に対するデジタル署名によって保護されることが多い。 発行者の秘密署名鍵が侵害された場合、それがインフラストラクチャ侵害によるものか、 暗号学的に関連する量子コンピューターの開発などの暗号解析の進展によるものかを問わず、 攻撃者は、標準的な署名検証だけでは発行者によって作成されたものと区別できない クレデンシャルを偽造できる。

この仕様は、 検証可能なクレデンシャル・ビット文字列ステータス リスト に類似した仕組みを提供し、発行者が自分の秘密鍵素材を用いて発行された クレデンシャルのうち、実際に発行したサブセットを表明できるようにする。 これは、発行者がクレデンシャルとともに公開するウィットネスリストの形をとる。 発行された各クレデンシャルについて、発行者は、ランダムシードとリスト内の クレデンシャルの位置から導出される短い暗号学的ウィットネスを計算する。 リストを取得した検証者は、検証しているクレデンシャルのウィットネスが、 発行者によって公開されたウィットネスと一致することを確認できる。

ウィットネスリスト自体は検証可能なクレデンシャルであり、 リスト上のクレデンシャルとは異なるデジタル署名アルゴリズムを使用して 署名されてもよい。重要な点として、ウィットネスリストは、 耐量子暗号スイート 1.0仕様に含まれるものなど、 耐量子デジタル署名で署名されてもよい。このようにして、発行者は、 従来型かつ耐量子ではないデジタル署名で発行されたクレデンシャルについて、 耐量子の真正性を確立できる。

この仕様は、 耐量子暗号スイート 1.0を補完するものである。どちらも、同じ脅威、 すなわち従来型の署名鍵の侵害、とりわけ暗号学的に関連する量子コンピューターによる 侵害への対応である。耐量子暗号スイートは、今後に向けてこの脅威に対応し、 ポスト量子環境でも偽造不能な証明を生成する。ウィットネスリストは、既存基盤と移行期間に対応する。 これは、発行者が、すでに発行された、または再発行せずに従来型署名の下で 発行し続けなければならないクレデンシャルについて、ポスト量子署名の下で 保証できるようにする。2つの仕組みは併用されることを意図している。

1.1 設計目標

このセクションは非規範的である。

1.2 利用概要

このセクションは非規範的である。

検証可能なクレデンシャル の発行時に、発行者はクレデンシャルデータを使用して 暗号学的ウィットネスを作成する。これらのウィットネスの集合はランダム シードと組み合わされ、配列にパックされ、ウィットネスリスト・ クレデンシャルとしてまとめて公開される。 このクレデンシャルは署名され、任意でポスト量子アルゴリズムを使用し、 検証者がアクセスできるように公開される。

検証時に、検証者ウィットネスリスト・クレデンシャルを取得し、公開されたランダム シードとクレデンシャルデータを使用して、検証している クレデンシャルのウィットネスを再導出し、それをクレデンシャルの ウィットネスインデックスに格納された値と比較する。不一致は、 そのクレデンシャルが主張された主体によって発行されていないことを示す。

2. 適合性

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

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

適合文書とは、セクション 4. データモデルの規範的要件に従う データモデルの任意の具体的表現である。適合 プロセッサとは、セクション 4. データモデルおよび5. アルゴリズムの規範的要件に従って、 適合文書を生成または消費する、ソフトウェアおよび/またはハードウェアとして実現された 任意のアルゴリズムである。

適合プロセッサは、不適合文書が消費されたときにエラーを生成しなければならない(MUST)。

3. 用語

次の用語は、この文書全体で使用される。 [VC-DATA-MODEL-2.0]で定義される用語は、 そこで定義された意味で使用される。

ウィットネス
ウィットネスシードおよびクレデンシャルハッシュから、 SHA-256(seedBytes || credentialHash)を計算し、その出力の最上位 ウィットネス長ビットを取ることによって導出される、 固定長の疑似ランダムビット列。
ウィットネスリスト
連続したビット配列にパックされ、multibase文字列としてエンコードされた ウィットネスの順序付きシーケンス。
ウィットネス リスト・クレデンシャル
credentialSubjectWitnessList型であり、 ウィットネスリストのプロパティを含む、WitnessListCredential型の 検証可能なクレデンシャル
ウィットネスリスト・エントリ
明示モードにおいて、保護対象の 検証可能なクレデンシャルcredentialStatusに現れてもよい(MAYWitnessListEntry型のオブジェクトであり、そのクレデンシャルを ウィットネスリスト・クレデンシャル内の位置に結び付ける。 これは、明示的なwitnessListCredentialプロパティを通じて参照される。
ウィットネスシード
リスト内のすべてのウィットネスを生成するための秘密ソルトとして機能する UUID v4 [RFC4122]値。 シードは暗号学的に安全な乱数生成器を使用して生成されなければならない(MUST)。
ウィットネスインデックス
ウィットネスリスト内の クレデンシャルの位置を識別する正の整数(1始まり)。
ウィットネス長
ウィットネスのビット数。デフォルト値は128である。 値を大きくすると、偽陽性一致の確率が低下する。 7.3 偽陽性率を参照。
ウィットネス数
ウィットネスリスト内の ウィットネスの総数。
エンコード済みウィットネス
ウィットネスリスト内のすべての ウィットネスを含むパック済みビット配列を、 The Multibase Encoding Schemeでエンコードしたもの(base64url、接頭辞 u)であり、JSON-LDコンテキスト内では https://w3id.org/security#multibaseとして型付けされる。
暗黙モード
保護対象のクレデンシャルにウィットネスリストへの参照を含めない利用モード。 リストの場所とウィットネスインデックスは、 クレデンシャルの既存のcredentialStatusエントリから推論され、 ステータスリストインデックスがウィットネスインデックスとして再利用される。
明示モード
保護対象のクレデンシャルのcredentialStatusウィットネスリスト・エントリが含まれ、 それがウィットネスリスト・クレデンシャルおよび ウィットネスインデックスを 直接参照する利用モード。
スタンドアロンモード
ウィットネスインデックスの割り当てが、 アプリケーションまたはユースケースによって定義され、 いかなるステータスリスト基盤からも独立している利用モード。

4. データモデル

4.1 ウィットネスリスト・クレデンシャル

ウィットネスリスト・クレデンシャルは、 credentialSubjectWitnessList型であり、 ウィットネスリストのプロパティ (witnessSeedwitnessLengthwitnessCount、およびencodedWitnesses)を直接保持する 検証可能な クレデンシャルである。発行者は、ウィットネスリスト・クレデンシャルに署名するために 別の鍵ペアを使用するべきであり(SHOULD)、かつ ポスト量子署名方式を使用してもよい(MAY)。 これは、それが提供する保護は、通常の署名鍵が侵害された後でも検証できる場合にのみ 意味を持つためである。

クレデンシャルのtype配列は、 WitnessListCredentialを含まなければならない(MUST)。

1: ウィットネスリスト・クレデンシャル
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/vc-forgery-defense/v1rc1"
  ],
  "id": "https://issuer.example/witnesses/1",
  "type": ["VerifiableCredential", "WitnessListCredential"],
  "issuer": "did:example:issuer",
  "validFrom": "2024-01-15T00:00:00Z",
  "credentialSubject": {
    "type": "WitnessList",
    "witnessSeed": "26ea4078-968d-4d98-aba7-695610c0dfb6",
    "witnessLength": 128,
    "witnessCount": 131072,
    "encodedWitnesses": "uQYF16SSSbR_LrMZFbFvbGkn8B7ggEZtov3KVL..."
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "comment": "MAY use a post-quantum cryptosuite here",
    "verificationMethod": "did:example:issuer#pq-key-1",
    "proofPurpose": "assertionMethod",
    "proofValue": "z..."
  }
}

WitnessListCredentialsが発行者によって 空間制約のある媒体(大規模なクレデンシャルをWeb経由で配布する場合など)で配布される場合、 それらをCBOR-LD でエンコードし、バイトとして送信することが推奨される(RECOMMENDED)。

4.1.1 ウィットネスリストのプロパティ

WitnessListcredentialSubjectは、 次のプロパティを直接含まなければならない(MUST)。

witnessSeed
REQUIREDウィットネスシードとして使用される UUID v4文字列[RFC4122]。 実装は、WitnessListCredentialを発行するたびに、 新しいwitnessSeed値を生成しなければならない(MUST)。
witnessLength
REQUIREDウィットネスごとのビット数を指定する正の整数。 少なくとも32でなければならない(MUST)。 少なくとも128であるべきである(SHOULD)。 デフォルトは128である。
witnessCount
REQUIRED。リスト内のウィットネスの総数を指定する正の整数であり、 エンコード済みウィットネス値の期待長を決定する。 グループプライバシーは十分に大きな witnessCountに依存することに注意し、 実装は131072以上の値を選択しなければならない(MUST)。
encodedWitnesses
REQUIREDThe Multibase Encoding Schemeでエンコードされた文字列 (base64url、接頭辞u)であり、 https://w3id.org/security#multibaseとして型付けされ、 すべてのウィットネスのパック済みビット配列を表す。 ウィットネスインデックスiのウィットネスは、 最上位ビット優先の順序で、 (i − 1) × witnessLengthから i × witnessLength − 1まで(両端を含む)のビットを占める。

4.2 ウィットネスリスト・エントリ

明示モードで使用される場合、保護対象の 検証可能な クレデンシャルは、その credentialStatus配列内に(または唯一の credentialStatus値として) ウィットネスリスト・ エントリを含んでもよい(MAY)。

エントリのtypeWitnessListEntryでなければならない(MUST)。 検証可能なクレデンシャル・ビット文字列ステータス リストstatusListCredentialプロパティのパターンに従い、このエントリは、 明示的なwitnessListCredentialプロパティを通じて ウィットネスリスト・クレデンシャルを参照し、 その値はそのクレデンシャルのURLである。エントリのidが存在する場合、 それはエントリの任意の(OPTIONAL)一意識別子であり、 リストの場所の特定には使用されない。

witnessListCredential
REQUIRED。このクレデンシャルのウィットネスリスト・ クレデンシャルへ逆参照されるURL。このプロパティは、 検証可能なクレデンシャル・ビット文字列 ステータスリストにおける statusListCredentialに相当する。
witnessIndex
REQUIRED。参照されるリスト内におけるこのクレデンシャルの ウィットネスの位置を指定する正の整数(1始まり)。 0より大きくなければならず(MUST)、 witnessCountを超えてはならない(MUST NOT)。
2: Bitstring Statusと並ぶ明示的なWitness List Entryを持つ クレデンシャル
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/vc-forgery-defense/v1rc1"
  ],
  "id": "https://issuer.example/credentials/1234",
  "type": ["VerifiableCredential", "ExampleDegreeCredential"],
  "issuer": "did:example:issuer",
  "validFrom": "2024-01-15T00:00:00Z",
  "credentialStatus": [
    {
      "id": "https://issuer.example/status/1#94567",
      "type": "BitstringStatusListEntry",
      "statusPurpose": "revocation",
      "statusListIndex": "94567",
      "statusListCredential": "https://issuer.example/status/1"
    },
    {
      "type": "WitnessListEntry",
      "witnessListCredential": "https://issuer.example/witnesses/1",
      "witnessIndex": 94567
    }
  ],
  "credentialSubject": {
    "id": "did:example:holder",
    "degree": {"type": "BachelorDegree", "name": "Computer Science"}
  },
  "proof": { ... }
}

5. アルゴリズム

5.1 ウィットネスリストの生成

次のアルゴリズムは、N個のクレデンシャルハッシュの集合に対する ウィットネスリストを生成する。 入力は、望ましいwitnessIndex値の順序に並べられた N個のハッシュの配列、およびウィットネス長b(デフォルト128)である。 出力は、ウィットネスシードおよびエンコード済みウィットネスである。

  1. 暗号学的に安全な乱数生成器を使用して、UUID v4値seedを生成する [RFC4122]。
  2. seedBytesを、seedの16バイト表現とする。 これは、ハイフンを除去した16進数字をビッグエンディアンのバイト列として デコードすることによって得られる。
  3. dataを、N × bビットのゼロ化されたビット配列とする。
  4. 0からN-1まで(両端を含む)の各整数iについて:
    1. msgを、入力配列のi番目のクレデンシャルハッシュとする。
    2. hashを、連結seedBytes || msgに適用された SHA-256 [FIPS-180-4]の出力とする。
    3. wを、 hashの最上位bビットとする。
    4. wを、dataのビットオフセット (i − 1) × bに、最上位ビット優先で書き込む。
  5. encodedWitnessesを、dataのmultibase-base64urlエンコードとし、 接頭辞文字uを前置したものとする [MULTIBASE]。
  6. seedおよびencodedWitnessesを返す。

5.2 ウィットネスリスト・ クレデンシャルの生成

次のアルゴリズムは、 ウィットネスリストの生成の出力を、 署名済みの検証可能なクレデンシャルにラップする。

  1. 入力Nおよびbを用いて ウィットネスリストの生成を実行し、 seedおよびencodedWitnessesを生成する。
  2. 次を持つ未署名のクレデンシャルを構築する:
    • typeWitnessListCredentialを含む
    • credentialSubject.typeWitnessListに設定する
    • credentialSubject.witnessSeedseedに設定する
    • credentialSubject.witnessLengthbに設定する
    • credentialSubject.witnessCountNに設定する
    • credentialSubject.encodedWitnessesencodedWitnessesに設定する
  3. クレデンシャルに署名する。量子鍵侵害を含む鍵侵害に対する保護が必要な場合、 発行者は、ポスト量子署名方式と、保護対象のクレデンシャルに署名するために 使用されるものとは別の鍵ペアを使用するべきである(SHOULD)。
  4. 署名済みクレデンシャルを返す。

5.3 クレデンシャル・ウィットネスの検証

次のアルゴリズムは、指定されたクレデンシャルのウィットネスが 有効であることを検証する。入力は、解決済みの ウィットネスリスト・クレデンシャル、 クレデンシャルハッシュ、および ウィットネスインデックスiである。

  1. ウィットネスリスト・クレデンシャル上の すべての証明を検証する。いずれかの証明が失敗した場合、エラーを返す。
  2. subjectを、ウィットネスリスト・クレデンシャルの credentialSubjectとする。
  3. seedsubject.witnessSeedとする。
  4. bsubject.witnessLengthとする。
  5. Nsubject.witnessCountとする。
  6. i < 1またはi > Nの場合、 インデックスが範囲外であることを示すエラーを返す。
  7. encodedWitnessessubject.encodedWitnessesとする。
  8. encodedWitnessesが文字 uで始まることを検証する。そうでなければ、エラーを返す。
  9. dataを、encodedWitnessesの最初の文字の後の部分文字列を base64urlデコードした結果とする。
  10. dataから、オフセット(i − 1) × bから i × b − 1までのビットを、最上位ビット優先で抽出する。 これをstoredWとする。
  11. seedBytesを、seedの16バイト表現とする。 これは、ハイフンを除去した16進数字をビッグエンディアンのバイト列として デコードすることによって得られる。
  12. msgを入力クレデンシャルハッシュとする。
  13. hashを、 seedBytes || msgのSHA-256 [FIPS-180-4]とする。
  14. computedWを、 hashの最上位bビットとする。
  15. storedWcomputedWと等しい場合、 validを返す。そうでなければinvalidを返す。

6. 利用モード

6.1 暗黙モード

暗黙モードでは、保護対象のクレデンシャルは変更されない。 クレデンシャル自体にはウィットネスリストへの参照は現れない。 検証者は、通常はクレデンシャルの既存の credentialStatusエントリから導出される帯域外情報を使用して、 ウィットネスリストの場所を特定し、ステータスリストインデックスを ウィットネスインデックスとして再利用する。

このモードでは次が要求される(REQUIRES):

3: 暗黙モードでのウィットネスリストの解決
// Protected credential has:
//   credentialStatus.statusListCredential = "https://issuer.example/status/1"
//   credentialStatus.statusListIndex      = "94567"

// Verifier discovers witness list URL from issuer metadata:
// GET https://issuer.example/.well-known/witness-lists
// -> { "https://issuer.example/status/1":
//      "https://issuer.example/witnesses/1" }

// Witness index = 94567 (same as status list index)
// Run: Verify a Credential Witness with i = 94567

6.2 明示モード

明示モードでは、保護対象のクレデンシャルは そのcredentialStatus内に ウィットネスリスト・エントリを含む。 そのエントリのwitnessListCredentialプロパティは ウィットネスリスト・クレデンシャルURLを与え、 witnessIndexはリスト内の1始まりの位置を指定する。 発見機構は必要ない。

明示モードは、(失効用のBitstringStatusListEntryなどの) 他のcredentialStatusエントリと共存してもよい(MAY)。 両方が存在する場合、witnessIndexはステータスリストインデックスと 等しくなくてもよい。

6.2.1 明示モードでの 検証

  1. 型がWitnessListEntryである credentialStatusエントリを見つける。
  2. ウィットネスリスト・クレデンシャルURLを、 そのエントリのwitnessListCredentialプロパティの値とする。
  3. そのURLを逆参照して、ウィットネスリスト・クレデンシャルを取得する。
  4. witnessIndexの値をiとして、 クレデンシャル・ウィットネスの検証を実行する。

6.3 スタンドアロンモード

スタンドアロンモードでは、ウィットネスリストは いかなるステータスリスト基盤からも独立して使用される。 クレデンシャルへのウィットネスインデックスの割り当ては、 特定のアプリケーションまたはユースケースによって定義される。 ウィットネスリスト・クレデンシャルは、クレデンシャル、アプリケーション層のレコード、 または外部レジストリから参照されてもよい(MAY)が、 参照機構はこの仕様の範囲外である。

7. セキュリティ考慮事項

7.1 量子による鍵侵害

量子能力を持つ敵対者は、従来型(たとえばECDSA)の公開鍵に対応する秘密鍵を 復元できる。発行者がウィットネスリスト・クレデンシャルを ポスト量子署名方式で署名している場合、ポスト量子鍵が安全なままである限り、 検証者は、そのリスト上のクレデンシャルの署名鍵が破られた後でも ウィットネスリストを信頼できる。

発行者は、それが対象とするクレデンシャルが高い価値または長い有効期間を持つ場合、 ウィットネスリスト・クレデンシャルにポスト量子署名方式で署名するべきである (SHOULD)。

7.2 シードの機密性

ウィットネスシードは、ウィットネスリスト・クレデンシャルの credentialSubject内に現れ、そのウィットネスリスト・クレデンシャルを取得する 任意の主体に見える。これは設計上のものであり、検証者はウィットネスを再計算するために シードを必要とする。検証を特定の検証者集合に制限したい発行者は、 ウィットネスリスト・クレデンシャルの配布をそれに応じて制限するべきである(SHOULD)。

7.3 偽陽性率

インデックスiにある偽造クレデンシャルは、 bウィットネス長とすると、 確率2bでウィットネス検証に合格する。 デフォルトのb = 128では、この確率はおよそ2.9 × 10−39である。

実装は、bが32未満の値を受け入れてはならない(MUST NOT)。 高価値のクレデンシャルには、最小値64が推奨される(RECOMMENDED)。

ウィットネスは、一般に衝突耐性を持つように計算されるべきである (SHOULD)が、第二原像耐性を持つように計算されなければならない (MUST)。

7.4 ウィットネスリストの完全性

検証者は、その内容を信頼する前に、ウィットネスリスト・ クレデンシャル上の証明を検証しなければならない(MUST)。 検証者は、ネットワーク露出およびサービス拒否リスクを低減するため、 解決済みウィットネスリスト・クレデンシャルをその有効期間中キャッシュするべきである (SHOULD)。

7.5 発行者情報の漏えい

リストが対象とする発行済み 検証可能なクレデンシャルの数に witnessCountを正確に合わせると、 発行者のプロセスに関する情報が2つの方法で漏えいする:

最初の漏えいを軽減するため、発行者は固定されたwitnessCount 値を使用するべきであり(SHOULD)、すべてのウィットネスリスト全体で ウィットネスの総数が変化しないようにし、任意データのウィットネスプレースホルダーを、 時間の経過とともにVCに対応するウィットネスで置き換えていく。

これは最初の漏えいを軽減するには十分である。しかし、攻撃者は依然として、 時間の経過に伴いどのウィットネス値が変化するかを追跡することで、 いくつのウィットネスが「本物」であり、いくつのVCが発行されているかを 追跡できる。この問題に対処するため、発行者はWitnessListCredentialを更新するたびに、 ランダムウィットネスシードを再生成しなければならない(MUST)。

7.6 リストの置換とロールバック

公開されたウィットネスリスト・クレデンシャルを、攻撃者が改変版に置き換えられる場合、 その攻撃者は偽造防止機構を迂回できる。発行者は、完全性が保護されたチャネル上で ウィットネスリスト・クレデンシャルを公開しなければならず(MUST)、 短い有効期間と頻繁な再発行を組み合わせて使用するべきである(SHOULD)。

7.7 ウィットネス置換による 発行者の否認

発行者はウィットネスリスト・クレデンシャルの 唯一の作成者であり、 リストが更新されるたびにウィットネスシードを 再生成することが要求される(REQUIRED) (7.5 発行者情報の漏えいを参照)。したがって、発行者は、 以前に発行したクレデンシャルについて、そのクレデンシャルの ウィットネスが存在しない、または変更された 新しいウィットネスリスト・クレデンシャルを公開することで、 そのクレデンシャルを否認できる。検証者が最新のリストに対して ウィットネスを再計算すると不一致となり、 他の点では真正なクレデンシャルを拒否する。偽造とは異なり、この動作は 正当な発行者に可能であり、公開された各リストは有効に署名されたクレデンシャルであるため、 この仕組みだけでは防止できない。

後の否認を超えて発行の証拠を残す必要がある依拠当事者は、 依拠したウィットネスリスト・クレデンシャルを、 その証明および有効期間とともに保持(キャッシュまたはアーカイブ)するべきである (SHOULD)。各 ウィットネスリスト・クレデンシャルは、それ自体が validFrom値を持つ署名済みの 検証可能なクレデンシャルであるため、 否認に公開されたリストに対して検証されたクレデンシャルは、 その以前のリスト時点では真正であったことを引き続き示すことができる。 キャッシュされた署名済みリストは、発行者がその時点でクレデンシャルを証明したことを示す 持続的な証拠である。公開リストに対する独立したアーカイブ、公証、または透明性ログによる ウィットネスは、発行者の公開履歴を否認不能にすることで、この保証を強化する。

8. プライバシー考慮事項

8.1 グループプライバシーとリストサイズ

witnessCount値は、バッチ内のクレデンシャルの最大数を明らかにする。 発行者は、個々の保持者がリスト内の位置によって識別されないように、 大きな集合サイズ(少なくとも131072エントリ)を使用しなければならない (MUST)。そのような集合内のすべてのスロットは、 ウィットネスを作成するために使用されるハッシュが検証可能なクレデンシャルに 対応しているかどうかにかかわらず、埋められていなければならない。

8.2 相関リスク

ウィットネスリスト・クレデンシャルを取得することは、 検証が行われていることをホストに明らかにする可能性のあるネットワーク要求を生成する。 検証者は、ウィットネスリスト・クレデンシャルをキャッシュするべきであり(SHOULD)、 リストを取得する際にプライバシー保護ネットワークトランスポートを使用してもよい (MAY)。発行者は、相関能力を低減するため、CDNまたは コンテンツアドレス指定システムを通じてウィットネスリストを提供するべきである (SHOULD)。

9. JSON-LDコンテキスト

この文書の例は、vc-forgery-defense JSON-LD コンテキストのv1rc1バージョンを参照している。 このコンテキストを参考のため以下に再掲する。

4: Forgery Defense JSON-LD Context (v1rc1)
{
  "@context": {
    "@protected": true,
    "id":   "@id",
    "type": "@type",

    "WitnessListCredential": "https://w3id.org/vc-forgery-defense#WitnessListCredential",
    "WitnessList":           "https://w3id.org/vc-forgery-defense#WitnessList",
    "WitnessListEntry":      "https://w3id.org/vc-forgery-defense#WitnessListEntry",

    "witnessSeed": {
      "@id": "https://w3id.org/vc-forgery-defense#witnessSeed"
    },
    "encodedWitnesses": {
      "@id":   "https://w3id.org/vc-forgery-defense#encodedWitnesses",
      "@type": "https://w3id.org/security#multibase"
    },
    "witnessLength": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessLength",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
    "witnessCount": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessCount",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
    "witnessIndex": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessIndex",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
    "witnessListCredential": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessListCredential",
      "@type": "@id"
    }
  }
}

A. 参考文献

A.1 規範的参考文献

[FIPS-180-4]
Secure Hash Standard (SHS). NIST. URL: https://csrc.nist.gov/publications/detail/fips/180/4/final
[MULTIBASE]
The Multibase Encoding Scheme. Juan Benet; Manu Sporny. URL: https://datatracker.ietf.org/doc/html/draft-multiformats-multibase
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[VC-BITSTRING-STATUS-LIST]
Verifiable Credential Bitstring Status List. Manu Sporny; Dave Longley; Markus Sabadello. W3C. W3C Recommendation. URL: https://www.w3.org/TR/vc-bitstring-status-list/
[VC-DATA-MODEL-2.0]
Verifiable Credentials Data Model 2.0. Manu Sporny; Ted Thibodeau Jr; Ivan Herman; Michael B. Jones; Gabe Cohen. W3C. W3C Recommendation. URL: https://www.w3.org/TR/vc-data-model-2.0/

A.2 参考情報文献

[VC-DI-QUANTUM-RESISTANT]
Quantum-Resistant Cryptosuites 1.0. Manu Sporny; Dave Longley; Markus Sabadello. W3C. W3C Recommendation. URL: https://www.w3.org/TR/vc-di-quantum-resistant-1.0/