Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本仕様は、暗号技術を用いて、特にデジタル 署名および関連する数学的証明の使用を通じて、 検証可能なクレデンシャルおよび 同様の種類の制約付きデジタル 文書の真正性と完全性を確保するための仕組みについて記述する。
この節では、この文書の公開時点における ステータスについて説明する。現在のW3C 公開物の一覧と、この技術報告の最新改訂版は、 W3C 標準および草案 索引で確認できる。
この仕様に関するコメントは、いつでも歓迎する。 課題は直接 GitHub に提出するか、 それができない場合は public-vc-comments@w3.org に送信してほしい。 (購読, アーカイブ)。
この文書は、検証可能なクレデンシャル作業 グループにより、 勧告トラックを用いた 最初の公開作業草案として公開された。
最初の公開作業草案としての公開は、 W3Cおよびその会員による承認を意味しない。
これは草案文書であり、いつでも他の文書によって更新、置換、 または廃止される可能性がある。この文書を進行中の作業以外のものとして 引用することは適切ではない。
この文書は、 W3C 特許 ポリシーの下で運営される グループによって作成された。 W3Cは、 グループの成果物に関連して行われた 特許開示の公開リスト を維持している。そのページには、 特許を開示するための手順も含まれている。個人が、 必須クレーム を含むとその個人が考える特許について実際の知識を有する場合、 W3C 特許ポリシー第6節に従って、 その情報を開示しなければならない。
この文書は、 2025年8月18日版 W3C プロセス文書に準拠する。
この節は非規範的である。
本仕様は、暗号技術を用いて、特にデジタル署名 および関連する数学的証明の使用を通じて、検証可能なクレデンシャルおよび 同様の種類の制約付きデジタル 文書の真正性と完全性を確保するための仕組みについて記述する。暗号学的証明は、 分散システムの実装者にとって有用な機能を可能にする。たとえば、証明は 次の用途に使用できる:
この節は非規範的である。
データ完全性の動作は概念的には単純である。 暗号学的証明を作成するには、次の手順が実行される: 1) 変換、 2) ハッシュ化、3) 証明生成。
変換とは、入力データを受け取り、ハッシュ化処理のために 準備する変換 アルゴリズムによって記述される処理である。 可能な変換の一例は、会議に出席した人々の名前の記録を取り、 個人の姓でリストをアルファベット順に並べ、名前を紙に 1行に1つずつ、整列済み順序で書き直すことである。 変換の例には、 正規化 および バイナリからテキストへの符号化が含まれる。
ハッシュ化とは、 暗号学的ハッシュ関数を用いて、変換済みデータの識別子を計算する ハッシュ化アルゴリズムによって 記述される処理である。この処理は、電話帳が機能する方法と概念的に似ており、 ある人物の名前 (入力データ) を受け取り、その名前をその人物の電話番号 (ハッシュ) に対応付ける。暗号学的ハッシュ関数の例には、 SHA-3 および BLAKE-3 が含まれる。
証明生成とは、入力データの 完全性を変更から保護する、または一定の望ましい信頼しきい値を証明する 値を計算する 証明シリアル化アルゴリズムによって記述される処理である。 この処理は、手紙を入れた封筒に蝋封を用いることで、差出人への 信頼を確立し、手紙が輸送中に改ざんされていないことを示す方法と 概念的に似ている。証明シリアル化関数の例には、 デジタル署名、 ステークの証明、および 知識の証明一般が含まれる。
暗号学的証明を検証するには、次の手順が実行される: 1) 変換、2) ハッシュ化、3) 証明検証。
検証中、変換およびハッシュ化の手順は、 上記で説明したものと概念的に同じである。
証明検証とは、入力データを信頼できるかどうかを確認するために、 暗号学的証明検証関数を適用する 証明検証アルゴリズムによって 記述される処理である。可能な証明検証関数には、 デジタル署名、 ステークの証明、および 知識の証明一般が含まれる。
本仕様は、暗号ソフトウェアの設計者および実装者が、これらの処理を 暗号スイートと呼ばれるものにまとめ、 転送中および保存中のアプリケーションデータの完全性を保護する目的で、 それらをアプリケーション開発者に提供する方法を詳述する。
この節は非規範的である。
本仕様は、次の設計目標に向けて最適化されている:
本仕様は主に検証可能な クレデンシャルに焦点を当てているが、この技術の設計は一般化されており、 他のユースケースにも使用できる。これらの場合、実装者は、その技術が 自身のユースケースに適用可能であるかどうかについて、独自の デューデリジェンスおよび専門的レビューを行うことが期待される。
非規範的として示された節に加えて、本仕様におけるすべての作成ガイドライン、図、例、および注記は 非規範的である。本仕様のそれ以外のすべては規範的である。
この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、および SHOULD は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されているように解釈されるものとする。
適合する保護済み文書とは、 バイト列であって、 関連する規範的要件に従う JSON 文書へ変換できる任意のものをいう。 その要件は、2.1 証明、2.2 証明の目的、2.3 リソース 完全性、 2.4 コンテキストと語彙、および3.1 DataIntegrityProofの各節に含まれる。
適合する暗号スイート仕様とは、 3. 暗号スイート節の関連する規範的要件に従う 任意の仕様をいう。
適合するプロセッサとは、 ソフトウェアおよび/またはハードウェアとして実現される任意のアルゴリズムであって、 適合する保護済み文書を生成および/または消費し、 4. アルゴリズム節の関連する規範的記述に従うものをいう。 適合するプロセッサは、不適合な文書が消費された場合に エラーを生成しなければならない (MUST)。
この文書全体で使用される一部の用語は、 検証可能なクレデンシャル・データモデル v2.0仕様の 用語節、および 制御識別子 v1.0仕様の 用語節で定義されている。 この節では、本仕様全体で使用される追加の用語を定義する。
この節では、データ完全性証明および関連リソースの完全性を表現するために 使用されるデータモデルを規定する。
本仕様におけるすべてのデータモデルのプロパティおよび型は 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
の
型固有処理に関する節を参照。
データ完全性証明は、 証明機構、その証明を検証するために必要なパラメータ、および証明値そのものに関する 情報を提供する。この情報はすべて、 The Security Vocabulary などのリンクトデータ語彙を使用して提供される。
オブジェクト上でデータ完全性証明を表現する場合、
proof プロパティを使用しなければならない (MUST)。
検証可能なクレデンシャル
内の proof プロパティは名前付きグラフである。存在する場合、
その値は、以下のプロパティを使用して表現される、単一のオブジェクト、または
順序なしのオブジェクト集合のいずれかでなければならない (MUST):
urn:uuid:6a1676b8-b51f-11ed-937b-d76685a20ff5) などである。
このプロパティの使用法は、2.1.2 証明
チェーン節でさらに説明される。
DataIntegrityProof および
Ed25519Signature2020 が含まれる。証明型は、証明を保護および検証するために
他にどのフィールドが必要かを決定する。
authentication) の間に、通常は検証可能な
クレデンシャル (assertionMethod) を作成するために使用される暗号材料を
使用するようだまされる可能性があり、その結果、単に Web サイトにログインするという
意図された行為ではなく、作成するつもりのなかった
検証可能な
クレデンシャルが作成されてしまう。
verificationMethod の包含は任意である (OPTIONAL) が、
含まれない場合は、cryptosuite などの他のプロパティが、
証明を検証するために必要な情報を取得するための仕組みを提供する可能性がある。
verificationMethod がデータ完全性証明内で
表現される場合、その値はデータの実際の場所を指すことに注意する。すなわち、
verificationMethod は、URL を介して、証明を検証するために使用できる
公開鍵の場所を参照する。この
公開鍵データは、
検証メソッドの完全な説明を含む
制御識別子
文書に格納される。
type が
DataIntegrityProof である場合、cryptosuite は
指定されなければならない (MUST)。それ以外の場合、
cryptosuite は指定してもよい (MAY)。指定される場合、
その値は文字列でなければならない (MUST)。
dateTimeStamp 文字列として指定されなければならない (MUST)。これは、値の末尾に Z で示される協定世界時
(UTC)、または UTC に対するタイムゾーンオフセット付きのいずれかである。
適合するプロセッサは、
オフセットなしで誤ってシリアル化された時刻値を消費することを選択してもよい
(MAY)。オフセットなしで誤ってシリアル化された時刻値は
UTC として解釈されるものとする。
expires プロパティは任意であり (OPTIONAL)、存在する場合は、
証明がいつ失効するかを指定する。存在する場合、それは [XMLSCHEMA11-2]
dateTimeStamp 文字列でなければならない (MUST)。
これは、値の末尾に Z で示される協定世界時 (UTC)、または UTC に対する
タイムゾーンオフセット付きのいずれかである。適合するプロセッサは、
オフセットなしで誤ってシリアル化された時刻値を消費することを選択してもよい
(MAY)。オフセットなしで誤ってシリアル化された時刻値は
UTC として解釈されるものとする。
domain プロパティは任意である (OPTIONAL)。
これは、証明が使用されることを意図された1つ以上のセキュリティドメインを伝える。
指定される場合、関連する値は文字列、または順序なしの文字列集合のいずれかで
なければならない (MUST)。検証者は、その値を用いて、
証明が検証者の動作するセキュリティドメインで使用されることを意図していたことを
確保するべきである (SHOULD)。domain パラメータの指定は、
検証者が証明の作成者に知られているセキュリティドメイン内で動作している
チャレンジレスポンスプロトコルで有用である。ドメイン値の例には、
domain.example (DNS ドメイン)、https://domain.example:8443
(Web オリジン)、mycorp-intranet (独自のテキスト文字列)、および
b31d37d4-dd59-47d3-9dd8-c973da43b63a (UUID) が含まれる。
domain が指定される場合、証明に含めるべきである
(SHOULD)。この値は、特定の
ドメインおよび時間枠に対して一度だけ
使用される。この値はリプレイ攻撃を軽減するために使用される。
challenge 値の例には、
1235abcd6789、79d34551-ae81-44ae-823b-6dadbab9ebd4、および ruby
が含まれる。
verificationMethod を使用してデジタル証明を検証するために
必要な、base 符号化されたバイナリデータを表す
文字列値。
この値は、バイナリデータを表すために
制御識別子
v1.0仕様の
2.4 Multibase節で説明される
ヘッダーおよび符号化を使用しなければならない (MUST)。
この値の内容は、特定の暗号スイートによって決定され、その暗号スイートの
証明追加アルゴリズムによって生成された
証明値に設定される。暗号スイートによって異なる符号化が指定された
代替プロパティは、デジタル証明を検証するために必要なデータを符号化するため、
このプロパティの代わりに使用してもよい (MAY)。
previousProof プロパティは任意である (OPTIONAL)。
存在する場合、それは文字列値または順序なしの文字列値リストでなければならない
(MUST)。各値は別の
データ完全性証明を識別し、それらすべては、
現在の証明が検証済みと見なされるために、同じく検証されなければならない
(MUST)。このプロパティは
2.1.2 証明チェーン節で使用される。
次のように、JSON 文書に証明を追加できる:
{
"myWebsite": "https://hello.world.example/"
};
次の証明は、上記の文書を eddsa-jcs-2022
暗号スイート [DI-EDDSA] を
使用して保護する。この暗号スイートは、JSON Canonicalization Scheme (JCS)
[RFC8785] を使用して入力データを変換し、
その後 Edwards Digital Signature Algorithm (EdDSA) を使用してデジタル署名することで、
検証可能なデジタル証明を生成する。
{
"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 データ文書に証明を追加できる:
{
"@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) を使用してデジタル署名することで、
検証可能なデジタル証明を生成する。
{
"@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を参照。
{
"@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種類がある。
証明セットは、
同じデータを複数のエンティティによって保護する必要があるが、証明の順序が
問題にならない場合、たとえば契約上の署名集合の場合に有用である。
順序を持たない証明セットは、文書内の proof キーに
証明の集合を関連付けることで表現される。
{
"@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"
}]
}
証明
チェーンは、同じデータを複数のエンティティが署名する必要があり、
かつ証明が発生した順序が重要である場合、たとえば公証人が文書上に作成された
証明に副署する場合に有用である。証明順序を保持する必要がある証明チェーンは、
UUID [RFC9562] などの
id を持つ少なくとも1つの証明、および前の証明を識別する
previousProof 値を持つ別の証明を提供することで表現される。
{
"@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"
}]
}
文書内のデータを保護する場合、保護対象のデータを明確に区分することが重要である。 これは、保護機構に関連付けられたデータを含むグラフを除く、文書内で表現される すべてのグラフであり、その除外されるグラフは 証明グラフと呼ばれる。この分離を作ることで、 処理アルゴリズムは保護済み文書を決定論的に保護および検証できる。
データ完全性証明が文書に追加される前に
入力文書に含まれる情報は、1つ以上のグラフで表現される。異なる
データ完全性証明からの情報が
誤って混在しないようにするため、
証明グラフの概念が、
各データ完全性証明をカプセル化するために使用される。
文書の proof プロパティに関連付けられた各値は、別個のグラフを識別する。
これは時に
名前付きグラフと呼ばれ、
型
ProofGraphであり、単一のデータ完全性証明を含む。
これらのグラフを使用することは、JSON-LD 処理を行う際に具体的な効果を持つ。
これは、あるグラフで表現された文を別のグラフの文から適切に分離するためである。
JSON、YAML、CBOR など他のメディアタイプに処理を限定する実装者は、
たとえば id 値文字列が両方の文書で同じ場合など、一つの文書のデータを
別の文書のデータとマージする場合に、この点を念頭に置く必要がある。
似たようなプロパティを持っているように見えるオブジェクトであっても、それらの
オブジェクトが id プロパティを持たない場合、および/または URL などの
グローバル識別子型を使用しない場合、マージしないことが重要である。
それらがないと、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 とは
異なる仕組みであることに注意することが重要である。証明の目的は、
証明が作成された理由とその意図された利用ドメインを表すものである一方、
上記の他の仕組みは、私有鍵を何に使用できるかを制限することを意図している。
証明の目的は
証明とともに「移動」するが、鍵制限はそうではない。
次に、一般的に使用される証明の目的値の一覧を示す。
外部リソースへのリンクが 適合する保護済み文書に含まれる場合、 識別されたリソースが証明の作成後に変更されたかどうかを知ることが望ましい。 これは、外部リソースがリモートから取得される場合だけでなく、 検証者が そのリソースのローカルにキャッシュされたコピーを持っている可能性がある場合にも適用される。
適合する保護済み文書によって参照される
リソースが、その文書が保護されてから変更されていないことを確認できるようにするため、
実装者は、id プロパティを含む任意のオブジェクトに
digestMultibase という名前のプロパティを含めてもよい
(MAY)。存在する場合、digestMultibase 値は、
単一の文字列値、
または文字列値の
リストでなければならず
(MUST)、各値は
Multibase 符号化された
Multihash 値である。
JSON-LD コンテキストの著者は、他のリソースを参照する文書で使用される
コンテキストに digestMultibase を追加し、関連する暗号学的ダイジェストを
含めることが期待される。たとえば、
検証可能なクレデンシャル・データモデル
v2.0 の基本コンテキスト
(https://www.w3.org/ns/credentials/v2) は
digestMultibase プロパティを含む。
リソース完全性で保護されたオブジェクトの例を以下に示す:
{
...
"image": {
"id": "https://university.example.org/images/58473",
"digestMultibase": "zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n"
},
...
}
実装者は、自身のユースケースに適したハッシュアルゴリズムを選択していることを 確保するため、 FIPS 180-4 Secure Hash Standard および Commercial National Security Algorithm Suite 2.0 などの 適切な情報源を参照することが強く求められる。
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: 語彙を参照。
消費側アプリケーションが処理する入力文書の型、したがってその意味論を 明示的に承認していることを確保する必要がある。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 へ「圧縮」される。
@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)。
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)。
この節では、本仕様で使用されるデータ型を定義する。
本仕様は、暗号スイート識別子を列挙可能な文字列として符号化する。これは、
圧縮アルゴリズムなど、そのような文字列を効率的に符号化する必要がある処理で
有用である。RDF [RDF-CONCEPTS]
など、文字列値に対する
データ型をサポートする環境では、暗号識別子内容は、データ型が
https://w3id.org/security#cryptosuiteString に設定された
リテラル値を用いて示される。
cryptosuiteString データ型は次のように定義される:
https://w3id.org/security#cryptosuiteString
cryptosuite プロパティを用いて表現されるすべての暗号スイート型の和集合。
Linked Data という用語は、URL などの標準を用いて、ものおよびそのプロパティを 識別し、Web 上で情報を公開、共有、接続するための推奨されるベストプラクティスを 説明するために使用される。情報が Linked Data として提示される場合、 他の関連情報を容易に発見でき、新しい情報を容易にそれへリンクできる。 Linked Data は分散的な方法で拡張可能であり、大規模統合への障壁を大幅に低減する。
Linked Data のさまざまなアプリケーションでの利用が増加するにつれ、 Linked Data 文書の真正性と完全性を検証できる必要がある。本仕様は、 Linked Data の拡張性および合成可能性などの機能を犠牲にすることなく、 数学的証明の使用を通じてデータ文書に認証および完全性保護を追加する。
本仕様は Linked Data にデジタル署名するための仕組みを提供するが、 本仕様が提供する利点の一部を得るために Linked Data を使用する必要はない。
本仕様を実装する暗号スイートは、 検証可能なクレデンシャル および検証可能な プレゼンテーションを保護するために使用できる。これらのユースケースに 対応する実装者は、その種類の文書を処理する際に追加の確認が適切である可能性が あることに注意すべきである。
証明で使用される
検証
メソッドが、
issuer と
検証可能なクレデンシャルにおいて関連付けられていること、または
holder と
検証可能なプレゼンテーションにおいて、
妥当性確認の過程で
関連付けられていることを確保することが重要なユースケースがある。
そのような関連付けを確認する一つの方法は、証明の
検証メソッドの
controller プロパティの値が、
issuer または
holder を識別するために
使用される URL 値とそれぞれ一致し、
かつ検証メソッドが、証明の目的を踏まえて受け入れ可能な検証関係の下に
表現されていることを確保することである。この特定の関連付けは、
issuer または
holder がそれぞれ、
証明を検証するために使用される
検証
メソッドの controller であることを示す。
文書著者および実装者には、証明の有効期間と
クレデンシャルの
有効期間の違いを理解することが助言される。前者は
created および
expires プロパティを用いて表現され、
後者は
validFrom および
validUntil
プロパティを用いて表現される。
これらのプロパティは同じ有効期間を表す場合もあるが、
必ずしも一致するとは限らない。証明を検証する場合、
関心時刻 (現在時刻または任意の他の時刻であり得る) が証明の有効期間内、
すなわち
created と
expires の間にあることを確保することが重要である。
妥当性確認によって
検証可能なクレデンシャルを
検証する場合、関心時刻が
クレデンシャルの
有効期間内、すなわち
validFrom と
validUntil の間に
あることを確保することが重要である。証明の有効期間、
または
クレデンシャルの有効期間の
いずれかを検証し損なうと、本来拒否されるべきデータを受け入れる結果になる可能性が
あることに注意する。
最後に、実装者には、
検証可能なクレデンシャルに
関連付けられた失効情報と、
検証
メソッドの
失効
および有効期限時刻との間には
違いがあることも理解することが強く求められる。
検証
メソッドの
失効および
有効期限時刻は、それぞれ
revocation および expires プロパティを用いて表現される。
それらは、秘密鍵が
危殆化した、または期限切れになったなどの事象に関連し、controller の詳細、
たとえばそのセキュリティ慣行や危殆化された可能性のある時期などを明らかにし得る
タイミング情報を提供できる。検証可能なクレデンシャルの
失効情報は credentialStatus プロパティを用いて表現される。
これは、個人が
検証可能なクレデンシャルによって
付与される特権を失うなどの事象に関連し、プライバシーを高めるため、
タイミング情報を提供しない。
データ完全性証明は、開発者が容易に使用できるように
設計されているため、証明を生成するために覚える必要のある情報量を最小化するよう
努めている。多くの場合、証明の作成を開始するために開発者から必要とされるのは、
暗号スイート名
(たとえば eddsa-rdfc-2022) だけである。これらの
暗号スイートは、安全な暗号プリミティブの組み合わせが
使用されることを確保するために必要な暗号技術の訓練を受けた人々によって作成および
レビューされることが多い。この節では、暗号スイート仕様を作成するための要件を規定する。
すべてのデータ完全性暗号スイート仕様に対する要件は次のとおりである:
type およびそのスイートで使用できる任意の
パラメータを識別しなければならない (MUST)。
true、そうでない場合は false である
ブール値。
true の場合は、検証済みの証明が除去された
保護済みデータ
文書を表す
map、
そうでない場合は
null。
@protected キーワードの使用により、その用語が安全でない再定義から
保護されていなければならない (MUST)。
cryptosuite instance は、 cryptosuite instantiation algorithm を 使用してインスタンス化され、実装固有の方法でアルゴリズムに利用可能にされる。 実装は、既知の cryptosuite instantiation algorithmsを発見するために、 検証可能な クレデンシャル拡張文書を使用してもよい (MAY)。
多くの暗号スイートは、
データ完全性証明を表現する際に同じ基本パターンに
従う。この節では、その一般的な設計パターン、すなわち
DataIntegrityProof と呼ばれる
暗号スイート型を規定する。
これは、設計プリミティブおよびソースコードの再利用を通じて、
暗号スイートの
作成および実装の負担を軽減する。
この設計パターンを利用する暗号スイートを指定する場合、
proof 値は次の形式をとる:
type プロパティは、文字列
DataIntegrityProof を含まなければならない (MUST)。
cryptosuite プロパティの値は、
暗号スイートを識別する
文字列で
なければならない (MUST)。処理環境が
文字列
サブタイプをサポートする場合、cryptosuite 値のサブタイプは
https://w3id.org/security#cryptosuiteString サブタイプでなければならない
(MUST)。
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)。すなわち、
type を DataIntegrityProof に設定し、
cryptosuite プロパティが暗号スイートの識別子を担い、
暗号スイート固有の暗号データは proofValue 内にカプセル化される
(すなわち、アプリケーション層データとして直接公開されない) パターンである。
このパターンに従うことが知られている暗号スイート仕様の一覧は、
検証可能なクレデンシャル拡張文書の Securing Mechanisms 節に示されている。
以下で定義されるアルゴリズムは、JSON オブジェクトとして表現される文書を対象に動作する。本仕様は、 JSON オブジェクトをmapとして表現する点で、 JSON-LD 1.1 Processing Algorithms and API仕様に従う。 未保護データ文書とは、証明値を含まない mapである。 入力文書とは、現在の証明がまだ追加されていない mapであるが、以前の処理によって追加された 証明値を含んでもよい (MAY)。保護済みデータ 文書 とは、1つ以上の証明値を含むmapである。
実装者は、開発者の誤り、過度なリソース消費、特定の保護が存在する新たに発見された 攻撃モデル、およびその他の改善を軽減するため、以下のアルゴリズムに加えて、 妥当なデフォルトおよび保護手段を実装してもよい (MAY)。 以下で提供されるアルゴリズムは、相互運用可能な実装のための 最小要件であり、開発者には、より安全で効率的なエコシステムに 寄与し得る追加の対策を含めることが強く求められる。
適合するプロセッサおよびその アプリケーション固有ソフトウェアによって使用される処理モデルは、この節で説明される。 ソフトウェアが情報を改ざん検出可能にする必要がある場合、次の手順を実行する:
@context プロパティを用いて表現する。
ソフトウェアが、本仕様で説明される仕組みを使用して送信された情報を使用する必要が ある場合、次の手順を実行する:
次のアルゴリズムは、デジタル証明を入力文書に追加し、その後、出力文書の真正性 および完全性を検証するために使用できる方法を規定する。必須入力は、 入力文書 (map inputDocument)、cryptosuite instance (struct cryptosuite)、および オプションの集合 (map options) である。出力は、保護済みデータ文書 (map) またはエラーである。 このアルゴリズムが文字列を符号化する場合は常に、UTF-8 符号化を 使用しなければならない (MUST)。
次のアルゴリズムは、証明または証明セット/チェーンのいずれかを含む保護済み文書から開始して、 証明セットまたは証明チェーンに証明を段階的に追加する方法を規定する。必須入力は、 保護済みデータ文書 (map securedDocument)、暗号スイート (cryptosuite instance suite)、およびオプションの集合 (map options) である。出力は新しい 保護済みデータ文書 (map) である。このアルゴリズムが文字列を符号化する場合は常に、 UTF-8 符号化を使用しなければならない (MUST)。
previousProof
itemを持つ場合、
previousProof と一致する id 属性を持つ
allProofs 内の要素を
matchingProofs に追加する。previousProof に等しい id を持つ証明が
allProofs 内に存在しない場合、エラーを発生させなければならず
(MUST)、
PROOF_GENERATION_ERROR
のエラー型を伝えるべきである (SHOULD)。
previousProof
itemを持つ場合、その配列の要素と一致する
id 属性を持つ allProofs 内の各要素を追加する。
previousProof list のいずれかの要素が、
allProofs のいずれの要素の id 属性にも一致しない
id 属性を持つ場合、エラーを発生させなければならず (MUST)、
PROOF_GENERATION_ERROR
のエラー型を伝えるべきである (SHOULD)。
次のアルゴリズムは、デジタル証明を検証することによって、 保護済みデータ文書の真正性および完全性を 確認する方法を規定する。このアルゴリズムは次を入力として受け取る:
このアルゴリズムは、検証結果、すなわち structを返す。その 項目は次のとおりである:
true または falsefalse の場合は Null。そうでない場合は、
入力文書
false の場合は Null。そうでない場合は、
メディアタイプであり、
パラメータを含んでもよい
(MAY)。
手順が「エラーを発生させなければならない (MUST)」という場合、
それは検証結果が、
verified 値
false および空でない
errors リストを伴って
返されなければならないことを意味する。
証明セットまたは
証明チェーンでは、
保護済みデータ文書は、
証明のリスト
(allProofs) を含む proof 属性を持つ。次のアルゴリズムは、
allProofs 内のすべての証明を検証することで達成される、
保護済みデータ文書の真正性および完全性を
確認する一つの方法を提供する。
他のアプローチも可能であり、特に allProofs に含まれる証明の一部のみを
検証したい場合がある。証明の一部のみを検証する別のアプローチを採る場合、
その部分集合に含まれる previousProof を持つ任意の証明は、それが参照する
証明も検証済みと見なされる場合にのみ、検証済みと見なせることに注意することが重要である。
必須入力は保護済みデータ文書 (securedDocument) である。 allProofs 内の各証明に対応する 検証結果のリストが生成され、 単一の結合された検証結果が出力として返される。 実装は、結合された検証結果とともに、 その他の検証結果および/または任意の その他のメタデータを返してもよい (MAY)。
previousProof 属性を含み、その属性の値が
文字列である場合、
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)。
この手順がどの文書プロパティおよび以前の証明を保護するかについては、 4.3 証明セット/チェーンの追加の手順6の注記を参照。
true に、combinedVerificationResult.document を
null に、そして
combinedVerificationResult.mediaType を null に設定する。
false の場合、
combinedVerificationResult.verified
を false に設定する。
false の場合、
combinedVerificationResult.document を null に設定し、
combinedVerificationResult.mediaType を null に設定する。
次のアルゴリズムは、アプリケーションが文書内の入力に固有のビジネスルールを 実行する前に、文書に関連付けられたコンテキストを理解していることを確保するために 使用できる一つの仕組みを提供する。このアルゴリズムに関連するさらなる根拠については、 2.4.1 コンテキストの検証を参照。 このアルゴリズムは、文書 (map inputDocument)、 既知の JSON-LD Context の集合 (list knownContext)、および未知のコンテキストが検出された場合に 再圧縮するかどうかを示すブール値 (boolean recompact) を入力とする。
このアルゴリズムは、コンテキスト検証結果、 すなわちstructを返す。 その項目は次のとおりである:
true または falsefalse の場合は Null。そうでない場合は、
入力文書
コンテキスト検証アルゴリズムは次のとおりである:
false に、
result.warnings を空のリストに、
result.errors を空のリストに、compactionContext を空のリストに設定し、
inputDocument を result.validatedDocument に複製する。
@context プロパティの値とする。
これは未定義である可能性がある。
@context プロパティを含む場合、または
contextValue 内の任意の URI が、既知の正しい値または暗号学的ハッシュに
一致しない JSON-LD Context ファイルへ参照解除される場合、該当するアクションを実行する:
true である場合、
result.validatedDocument を、
inputDocument および
knownContext を入力として
JSON-LD Compaction Algorithmを実行した結果に設定する。圧縮が失敗した場合、
少なくとも1つのエラーを result.errors に追加する。
true ではない場合、少なくとも1つのエラーを
result.errors に追加する。
true に設定する。そうでない場合、
result.validated を false に設定し、
result から document プロパティを削除する。
実装は、実装または特定のユースケースに固有のさらなる検証規則を強制する 追加の警告またはエラーを含めてもよい (MAY)。
本仕様およびさまざまな暗号スイート仕様で説明されるアルゴリズムは、 特定の種類のエラーを投げる。実装者は、これらのエラーを他のライブラリまたは ソフトウェアシステムへ伝えることが有用であると考えるかもしれない。 この節は、エラーが発生したときに、本仕様で説明される技術を実装する エコシステムがより効果的に相互運用できるように、これらのエラーに対する 具体的な URL および説明を提供する。
これらのエラーを HTTP インターフェイスを通じて公開する場合、実装者は [RFC9457] を使用して、エラーデータ構造を ProblemDetails mapとして 符号化すべきである (SHOULD)。[RFC9457] が使用される場合:
type 値は、
https://w3id.org/security# の値で始まり、以下に列挙される節の値で
終わる URL でなければならない (MUST)。
title 値は、エラーについて短いが具体的な、人間が読める
文字列を
提供すべきである (SHOULD)。
detail 値は、エラーについてより長い、人間が読める
文字列を
提供すべきである (SHOULD)。
domain 値が期待値と一致しなかった。4.4
証明の検証を参照。
challenge 値が期待値と一致しなかった。4.4
証明の検証を参照。
次の節では、この仕様を実装する開発者が安全なソフトウェアを作成するために 認識しておくべきセキュリティ上の考慮事項について説明する。
暗号技術は、秘密の使用を通じて情報を保護する。必要な秘密を知っていれば、 特定の情報にアクセスすることは計算上容易になる。同じ情報は、 計算上困難な総当たりの試みがその秘密を推測することに成功した場合にも アクセスできる。すべての現代的な暗号技術は、その計算上困難なアプローチが 時間を通じて困難であり続けることを必要とするが、科学および数学の突破口により、 それが常に成り立つとは限らない。つまり、暗号技術には寿命があるということである。
本仕様は、現在使用されている暗号技術が時間の経過とともに破られる可能性が 非常に高いと主張することで、すべての暗号学的アプローチの陳腐化を見込んでいる。 ソフトウェアシステムは、情報を継続して保護するために、時間の経過に応じて 使用中の暗号技術を変更できなければならない。そのような変更には、必要な秘密の サイズを大きくすることや、使用される暗号プリミティブの変更が含まれる可能性がある。 しかし、暗号パラメータの組み合わせによっては、実際にはセキュリティを低下させる 可能性がある。これらの前提を踏まえると、システムは、安全な暗号パラメータの 異なる組み合わせ、すなわち暗号スイートを互いに区別できる必要がある。 暗号スイートを識別またはバージョン管理する場合、パラメータ、番号、日付などを 含むいくつかのアプローチを採ることができる。
パラメータ方式のバージョン管理は、暗号スイートで用いられる特定の暗号パラメータを
指定する。たとえば、RSASSA-PKCS1-v1_5-SHA1 のような識別子を
使用できる。この方式の利点は、十分に訓練された暗号技術者が、その識別子によって
使われているすべてのパラメータを判断できることである。この方式の欠点は、
この種の識別子を使用する人々の大半が十分に訓練されておらず、したがって
前述の識別子がもはや安全に使用できない暗号スイートであることを理解しないことである。
さらに、この知識不足により、ソフトウェア開発者が暗号スイート識別子の解析を
一般化し、暗号プリミティブの任意の組み合わせを受け入れ可能にしてしまい、
セキュリティ低下につながる可能性がある。理想的には、暗号スイートは、特定の
受け入れ可能な暗号パラメータのプロファイルとしてソフトウェアに実装されるべきである。
番号方式のバージョン管理は、1.0 や 2.1 のような
メジャーおよびマイナーバージョン番号を指定する場合がある。番号方式の
バージョン管理は、特定の順序を伝え、より高いバージョン番号がより低い
バージョン番号より高機能であることを示唆する。このアプローチの利点は、
専門性の低い開発者には理解できない可能性がある複雑なパラメータを取り除き、
アップグレードが適切である可能性を伝える、より単純なモデルにできることである。
このアプローチの欠点は、アップグレードが必要かどうかが明確ではないことである。
ソフトウェアのバージョン番号の増加は、そのソフトウェアが機能し続けるために
アップグレードを必要としないことが多いからである。これにより、開発者は
特定のバージョンの使用が安全であると考える可能性があるが、実際にはそうではない。
理想的には、暗号スイートをソフトウェアで使用する開発者に対し、そのスイートの
継続的なセキュリティについて定期的なレビューが必要であることを示す追加の
シグナルが与えられるべきである。
日付ベースのバージョン管理は、特定の暗号スイートに対する特定のリリース日を 指定する。年などの日付の利点は、その日付が比較的古いのか新しいのかが 開発者にすぐ分かることである。古い日付を見ることで、開発者はより新しい 暗号スイートを探しに行く可能性があるが、パラメータ方式または番号方式の バージョン管理ではそうならない可能性がある。日付ベースのバージョンの欠点は、 一部の暗号スイートが5〜10年は失効しない可能性があり、開発者がより新しい 暗号スイートを探しに行っても、より新しいものが見つからない可能性があることである。 これは不便かもしれないが、より安全なエコシステムの挙動につながる不便である。
現代的な暗号アルゴリズムは、さまざまなユースケースの多様な要件を満たせるように、 多数の調整可能なパラメータおよびオプションを提供する。たとえば、組み込みシステムは 処理能力とメモリ環境が限られており、特定のアルゴリズムで最強のデジタル署名を 生成するためのリソースを持たない可能性がある。金融取引システムのような 他の環境では、取引が行われている1日だけデータを保護すればよい場合がある一方、 他の環境ではデータを複数十年保護する必要がある場合がある。これらのニーズを 満たすため、暗号アルゴリズム設計者は、多くの場合、暗号アルゴリズムを設定する 複数の方法を提供する。
暗号ライブラリ実装者は、多くの場合、暗号アルゴリズム設計者および仕様著者が 作成した仕様を受け取り、それらのライブラリを使用するアプリケーション開発者に すべてのオプションが利用可能となるように実装する。これは、特定の アプリケーション開発者が特定の暗号配備で必要とする機能の組み合わせが 分からないためである可能性がある。すべてのオプションがアプリケーション開発者に 公開されることが多い。
暗号ライブラリを使用するアプリケーション開発者は、多くの場合、特定の アプリケーションに対して暗号パラメータおよびオプションを適切に選択するために 必要な暗号に関する専門知識および知識を持っていない。この専門知識の不足は、 特定のアプリケーションに対して暗号パラメータおよびオプションを不適切に選択する ことにつながる可能性がある。
本仕様は、暗号ライブラリ実装者よりもアプリケーション開発者を、暗号仕様著者よりも 暗号ライブラリ実装者を、暗号アルゴリズム設計者よりも暗号仕様著者を保護する という構成員の優先順位を設定する。これらの優先順位を踏まえ、次の推奨を行う:
上記の指針は、有用な暗号オプションおよびパラメータがアーキテクチャの下位層で 提供される一方で、各オプションの利点と欠点のバランスを十分に理解していない 可能性のあるアプリケーション開発者に、それらのオプションおよびパラメータを 公開しないことを意図している。
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つだけである。
セキュリティレベルおよび対応する曲線とハッシュは、妥当性確認で使用される
公開鍵のマルチキー形式から決定される。
暗号アジリティとは、 頻繁に接続される情報セキュリティシステムを、 複数の暗号プリミティブおよび/またはアルゴリズム間で切り替えられるように 設計する実践である。暗号アジリティの主な目標は、システムのインフラストラクチャに 破壊的な変更を加えることなく、新しい暗号プリミティブおよびアルゴリズムへ システムが迅速に適応できるようにすることである。したがって、SHA-1 アルゴリズムなどの 特定の暗号プリミティブがもはや安全に使用できないと判断された場合、システムは 単純な設定ファイルの変更を通じて、より新しいプリミティブを使用するように 再設定できる。
暗号アジリティは、情報セキュリティシステム内のクライアントとサーバーが 定期的に接触している場合に最も効果的である。しかし、特定の暗号アルゴリズムによって 保護されるメッセージが、検証可能な クレデンシャルのように長寿命である場合、および/またはクライアント (holder) が サーバー (issuer) に容易に再接触できない可能性がある場合、暗号アジリティは 望ましい保護を提供しない。
暗号レイヤリングとは、 まれに接続される情報セキュリティシステムを、 複数のプリミティブおよび/またはアルゴリズムを同時に用いるように 設計する実践である。暗号レイヤリングの主な目標は、1つ以上の暗号アルゴリズムまたは プリミティブが失敗しても、ペイロード上の暗号学的保護を失うことなくシステムが 生き残れるようにすることである。たとえば、単一の情報片に対して RSA、ECDSA、 Falcon アルゴリズムを並列に使用してデジタル署名することは、これら3つの デジタル署名アルゴリズムのうち2つが失敗しても生き残れる仕組みを提供する。 768ビット鍵を使用する RSA デジタル署名など、特定の暗号学的保護が危殆化した場合でも、 システムは危殆化していない暗号学的保護を引き続き利用して情報を保護できる。 開発者には、1年以上保護する必要がある可能性のあるすべての署名済みコンテンツについて、 この機能を活用することが強く求められる。
本仕様は、両方の形態のアジリティを提供する。一つは暗号アジリティであり、 あるアルゴリズムから別のアルゴリズムへ容易に切り替えられるようにする。 もう一つは暗号レイヤリングであり、複数の暗号アルゴリズムを通常は並列に 同時使用できるようにし、情報を保護するために使用されたそれらのいずれも、 他のものに依存せず、また他のものを必要とせずに使用できるようにしつつ、 デジタル証明形式を開発者にとって使いやすく保つ。
証明には proofValue が含まれ、その中には
暗号学的証明に関連する多数のパラメータを埋め込むことができる。たとえば、
Data Integrity
ECDSA Cryptosuites v1.0
仕様の選択的開示アルゴリズムは、
proofValue 内に、選択的に開示可能な各項目につき1つの複数の
暗号署名を含む。これは、アプリケーション開発者にとって技術をより簡単かつ
安全に使用できるようにするために行われている。
本仕様は、仕様著者に対し、アプリケーション層でほとんど必要とされない情報を
抽象化するために単一の値を使用することを強く求める。画像を表す data:
URL が、画像レンダリングの多くのパラメータを単一の値にカプセル化するのと
同様に、proofValue プロパティ (および他の類似プロパティ) は、
アプリケーション開発者にとって有用ではない情報を抽象化し、アプリケーションに
とって重要であるフィールドの識別を簡素化する。このように情報を抽象化することで、
開発者が扱いやすいデータ構造となり、たとえば、重要なプロパティを追加または
削除するプログラミングエラーによる偶発的な破損によって暗号層に悪影響を与える
ことに対して、より影響を受けにくくなる。
本仕様におけるデータ完全性の設計は、一般に暗号層にのみ有用な情報を 単一のプロパティへ抽象化し、アプリケーション開発者の負担を軽減し、 システムのセキュリティを高める。
暗号学的保護処理の間に、保護対象のデータを変換することが有益な場合がある。 このような「インライン」変換により、特定の種類の暗号学的保護が、そのデータが 搬送されるデータ形式に依存しないものになり得る。たとえば、一部の 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 クライアントなど、あらゆるリソース枯渇攻撃と 同じ一般的なカテゴリに属する。実装者には、防御的なセキュリティ戦略を 実装する際に、この種の攻撃を考慮することが助言される。
任意のデータ完全性証明によって 保護されるデータは、変換済みデータである。 変換済みデータは、 特定の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 など、さまざまな異なる構文へ、署名を無効にすることなく 移植可能であることである。より伝統的な暗号署名機構にはこの能力がない。
実装者および開発者には、データ完全性証明を含む情報を、 その証明が検証済みであり、 かつ返されるすべてのデータが正常に保護されていることを確認したソフトウェアライブラリの 戻り値として検証済みデータが提供されている場合を除き、信頼しないことが強く求められる。
アプリケーションデータの検査可能性は、システム効率および開発者生産性に影響を与える。 base 符号化されたバイナリデータなど、暗号学的に保護されたアプリケーションデータが、 データベースなどのアプリケーションサブシステムによって容易に処理できない場合、 暗号学的に保護された情報を扱う労力が増加する。たとえば、データベースによって ネイティブに保存およびインデックス化できる暗号学的に保護されたペイロードは、 次のようなより単純なシステムをもたらす:
同様に、複数の上流ネットワークシステムによって処理可能な暗号学的に保護された ペイロードは、セキュリティアーキテクチャを適切に階層化する能力を高める。 たとえば、上流システムが受信ペイロードを繰り返し復号する必要がない場合、 攻撃に能動的に対抗することに特化した上流サブシステムによって処理負荷を分散する システムの能力が高まる。実質的なアクションを行う前には常にデジタル署名を 確認する必要があるが、明らかに不正なリクエストを拒否するために、識別子ベースの レート制限、署名期限の確認、nonce/challenge の確認など、透明なペイロードに対して 他の上流チェックを実行できる。
さらに、開発者がシステム内のデータを容易に閲覧できない場合、システムの正しさを 容易に監査またはデバッグする能力が妨げられる。たとえば、アプリケーション開発者に base 符号化されたアプリケーションデータの切り貼りを要求すると、開発がより困難になり、 すべてのメッセージが手動操作の base 復号ツールを通過する必要があるため、 明らかなバグが見逃される可能性が高まる。
しかし、データを不透明にすることが正しい設計判断である場合もある。 他のアプリケーションサブシステムによって処理される必要のないデータ、および アプリケーション開発者によって変更またはアクセスされる必要のないデータは、 不透明な形式へシリアル化できる。例として、デジタル署名値、暗号鍵パラメータ、 および暗号ライブラリだけがアクセスする必要があり、アプリケーション開発者が 変更する必要のないその他のデータフィールドがある。保存時暗号化を行うデータベースなど、 基盤となるサブシステムが不透明データの基盤となる複雑さをアプリケーション開発者に 露出しない場合にも、データの不透明性が適切である例がある。これらの場合、 アプリケーション開発者は透明なアプリケーションデータ形式を対象に開発を続け、 データベースが長期保存との間でアプリケーションデータを暗号化および復号する 複雑さを管理する。
本仕様は、アプリケーションデータがネイティブ形式のまま残り、不透明化されない一方で、 デジタル署名などの他の暗号データは不透明なバイナリ符号化形式のまま保持される アーキテクチャを提供することを目指す。暗号スイート実装者には、スイートを設計する際に データの不透明性の適切な使用を検討し、アプリケーションデータを不透明にすることと、 アプリケーション層で暗号データへのアクセスを提供することの設計上のトレードオフを 比較検討することが強く求められる。
実装者は、検証メソッドの定義から 制御識別子 文書へ進み、その後、その制御識別子 文書にもその 検証メソッドへの参照が 含まれていることを確保することで、検証メソッドが特定の controller に束縛されていることを確保する。この処理は、 検証メソッドの取得のアルゴリズムで説明される。
実装が証明を検証する場合、証明を生成するために使用された 検証メソッドが 制御識別子 文書に列挙されていることだけでなく、それが検証されている証明を生成するために 使用されることを意図していたことも検証することが不可欠である。この処理は 「検証関係の妥当性確認」として知られる。
検証関係を妥当性確認する処理は、 制御識別子 v1.0 仕様の 3.3 Retrieve Verification Method節で概説されている。
この処理は、私有暗号鍵などの暗号材料が、意図しない目的にアプリケーションによって 誤用されないことを確保するために使用される。暗号材料の誤用の例として、 検証可能なクレデンシャル を発行するために使用されることを意図した私有暗号鍵が、代わりに Web サイトへ ログインするため (すなわち認証のため) に使用される場合がある。検証関係を確認しないことは 危険である。なぜなら、ある暗号材料に対する制限および保護プロファイルは、その 意図された用途によって決定され得るからである。たとえば、一部のアプリケーションは 暗号材料を1つの目的にのみ使用することを信頼されている場合があり、また一部の 暗号材料は、ラップトップ上の暗号化されていないファイルではなく、データセンター内の ハードウェアセキュリティモジュールに保存されるなど、より保護されている場合がある。
実装が証明を検証する場合、 証明の目的が意図された用途と 一致することを検証することが不可欠である。
この処理は、証明がアプリケーションによって意図しない目的に誤用されないことを 確保するために使用される。これは証明作成者にとって危険である。誤用の例として、 検証可能なクレデンシャル における主張を保護するための目的であると記載された証明が、代わりに Web サイトへ ログインするためのauthenticationに使用される場合がある。この場合、 証明作成者は、無制限の数の他の当事者に配布されることを期待して、任意の数の 検証可能なクレデンシャル に証明を添付している。これらの当事者のいずれかが、Web サイトがそのような証明を 意図された目的ではなくauthenticationとして誤って受け入れた場合、 証明作成者として Web サイトにログインできてしまう。
正規化などの変換が実行される方法は、システムのセキュリティ特性に影響を与える 可能性がある。最良の正規化機構の選択は、ユースケースに依存する。多くの場合、 望ましいセキュリティ要件を満たす最も単純な機構が最良の選択である。 この節は、本仕様で参照される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] がある。 これらのアプローチは、一部のユースケースでは単純さの利点を持つが、本仕様で詳述される アプローチが提供する利点の一部を犠牲にする。
本仕様で使用されるアルゴリズム処理の一つは正規化であり、これは 変換の一種である。正規化とは、意味論的に 等価なさまざまな方法で表現され得る情報を入力として受け取り、すべての出力を 「正規形」と呼ばれる単一の方法で表現する処理である。
正規化を利用する結果として得られる データ完全性証明の セキュリティは、アルゴリズムの正確性に大きく依存する。たとえば、正規化 アルゴリズムが、異なる意味を持つ2つの入力を同じ出力へ変換する場合、著者の意図が 検証者に対して 誤って表現される可能性がある。これは攻撃者によって攻撃ベクトルとして使用され得る。
さらに、入力内の意味論的に関連する情報が出力に存在しない場合、攻撃者は 証明検証を失敗させることなく、そのような情報をメッセージに挿入できる可能性がある。 これは、暗号学的にメッセージへ署名する際によく使用される別の変換である 暗号学的ハッシュ化に似ている。攻撃者が異なる入力から同じ暗号学的ハッシュを 生成できる場合、その暗号学的ハッシュアルゴリズムは安全であるとは見なされない。
実装者には、入力をハッシュ化処理へ 変換するために使用される任意の 正規化アルゴリズムについて、適切な精査を確保することが強く求められる。 適切な精査には、少なくとも、アルゴリズムの正確性に関する査読済み数学的証明との 関連付けが含まれる。複数の実装、および標準化団体における専門家による精査が 望ましい。実装者には、情報正規化に関する正式な訓練を受けている場合、および/または アルゴリズムの正確性に関する査読済み数学的証明を作成できる分野の専門家へ アクセスできる場合を除き、新しい仕組みを考案または使用しないことが強く求められる。
本仕様は、適合する保護済み文書上の証明を 検証する際に、ネットワークリクエストを必要としないように設計されている。 しかし読者は、JSON-LD contexts および 検証 メソッドが、ネットワーク接続を介して取得される可能性のある URL を含み得ることに 注意するかもしれない。この懸念は、検証中または検証後にネットワークから読み込まれる 可能性のある任意の URL に存在する。
可能な限り、実装者には、そのような情報を永続的または積極的にキャッシュし、
ネットワーク経由でそのような URL を取得する必要がある実装の攻撃面を低減することが
強く求められる。たとえば、JSON-LD contexts のキャッシュ手法は、
2.4 コンテキストと語彙節で説明されており、
did:key [DID-KEY] など一部の
検証
メソッドは、ネットワークから取得する必要がまったくない。
特定の HTTP URL ベースの 検証メソッドの インスタンスに初めて遭遇する場合など、キャッシュ済み情報を使用できない場合、 実装者には、ネットワークからリソースを取得する可能性のある任意の処理中に、 サービス拒否攻撃を緩和するための防御策を使用することが注意喚起される。
本仕様で説明される文書を保護する技術は一般化された性質を持つため、 その使用に伴うセキュリティ上の影響は、読者にすぐ明らかではない可能性がある。 完全なソフトウェアシステムで考慮する必要があり得る種類のセキュリティ上の懸念を 理解するため、実装者には、この技術が 検証可能なクレデンシャル エコシステム [VC-DATA-MODEL-2.0] で どのように使用されるかを読むことが強く求められる。詳細については 検証可能なクレデンシャルのセキュリティ上の考慮事項に関する節を参照。
次の節では、この仕様を実装する開発者がプライバシーを高めるソフトウェアを作成するために 認識しておくべきプライバシー上の考慮事項について説明する。
デジタル署名されたペイロードに、複数の検証者によって見られるデータが含まれる場合、 それは相関の点となる。そのようなデータの例は、買い物のロイヤルティカード番号である。 相関可能なデータは検証者による追跡目的に使用でき、場合によってはプライバシー期待に 反する可能性がある。一部のデータが追跡に使用できるという事実は、すぐには明らかで ない可能性がある。そのような相関可能データの例には、静的なデジタル署名や画像の 暗号学的ハッシュが含まれるが、これらに限定されない。
相関可能な追跡データを持たず、同時に特定のやり取りに対してペイロードが信頼できる ことについて一定程度の保証を提供する、デジタル署名されたペイロードを作成することは 可能である。この特性は 非リンク可能性と呼ばれ、デジタル署名されたペイロードに 相関可能なデータが使用されないことを確保しつつ、一定程度の信頼を提供する。 その十分性は各検証者が判断しなければならない。
すべてのユースケースが非リンク可能性を必要とする、または許可するわけではないことを 理解することが重要である。危険物を輸送および保管する組織や個人を相関させる場合など、 規制上または安全上の理由によりリンク可能性および相関が必要となるユースケースがある。 非リンク可能性は、特定のやり取りに対するプライバシー期待がある場合に有用である。
一定程度の非リンク可能性を提供できる仕組みは少なくとも2つある。 第1の方法は、メッセージで使用されるデータ値が将来のメッセージで決して 繰り返されないようにすることである。第2の方法は、繰り返される任意のデータ値が 十分な群衆プライバシーを提供し、そのやり取りにおいて一定程度のプライバシーを 期待するエンティティを相関させることが実質的に不可能になるようにすることである。
非リンク可能性を達成するために、さまざまな方法を使用できる。これらの方法には、 メッセージを、相関目的に使用できる情報を持たない単回使用のベアラートークンにすること、 十分なレベルの群衆プライバシーを確保する属性を使用すること、および、提示される メッセージへの信頼を損なうことなく、メッセージを提示するエンティティが新しい署名を 再生成できる暗号スイートを使用することが含まれる。
選択的開示とは、以前に署名されたメッセージ (すなわち、その作成者によって署名された メッセージ) の受信者が、その部分の検証可能性を損なうことなく、メッセージの一部だけを 明らかにできる技術である。たとえば、車を借りる目的でデジタル運転免許証を 選択的に開示する場合がある。これには、免許証から発行機関、免許番号、生年月日、 および許可された自動車クラスのみを明らかにすることが含まれ得る。この場合、 免許番号は相関可能な情報であるが、運転者の氏名および住所が共有されないため、 ある程度のプライバシーが保持されることに注意する。
すべてのソフトウェアまたは暗号スイートが選択的開示を提供できるわけではない。
メッセージの著者が、その受信者によって選択的に開示可能であることを望む場合、
特定のメッセージで選択的開示を有効にする必要があり、両者は対応可能な
暗号スイートを使用する必要がある。著者はまた、メッセージの特定部分の開示を
必須にする場合もある。メッセージの部分的な内容を選択的に開示したい受信者は、
その技術を実行できるソフトウェアを利用する必要がある。選択的開示をサポートする
暗号スイートの例は bbs-2023 である。
非リンク可能性を保持しない方法で情報を選択的に開示することも可能である。 たとえば、出荷に関連する検査結果を開示したい場合があり、その検査結果には 規制要件により相関可能である必要がある出荷識別子またはロット番号が含まれる 可能性がある。しかし、検査結果全体の開示は必要ではない場合があり、合格/不合格 状態だけを選択的に開示することで十分と見なされる可能性がある。プライバシーを 保持しながら情報を開示することに関する詳細については、 6.1 非リンク可能性を参照。
2.1.2
証明
チェーンで定義される previousProof 機能を使用する場合、
実装は、1つ以上の以前の証明に対してデジタル署名することを要求される。
これは、それらを保護済みペイロードに含めるためである。これにより必然的に、
以前の証明を追加した各エンティティに関連する情報が露出する。
少なくとも、以前の証明の 検証メソッド、たとえば 公開鍵は、証明チェーン内の次の証明の作成者に見られる。これは、以前の証明の作成者が 証明チェーンに含まれることを意図していなかった場合にはプライバシー上の懸念となり得るが、 あらゆる種類の文書に否認不能なデジタル署名を追加する場合には避けられない結果である。
グループ署名など、 より高度な暗号機構を使用して、メッセージ署名者の身元を隠すことは可能であり、 Data Integrity 暗号スイートがこのプライバシー上の懸念を緩和することも可能である。
フィンガープリンティングの懸念は、証明検証中またはその後に ネットワークから読み込まれる可能性のある任意の URL に存在する。本仕様は、 適合する保護済み文書上の 証明を検証する際に、ネットワークリクエストが必要ないように設計されている。 しかし読者は、JSON-LD contexts および 検証 メソッドが、ネットワーク接続を介して取得される可能性のあるリソース URL を含み、 フィンガープリンティングの懸念につながり得ることに注意するかもしれない。
たとえば、適合する保護済み文書の 作成者は、JSON-LD contexts および 検証 メソッドについて、文書ごとに一意の URL を作成する可能性がある。 そのような文書を検証する際、検証者がその情報をネットワークから取得すると、 その文書に対する関心を文書の作成者に明らかにしてしまい、文書の作成者ではない 任意のエンティティに対するプライバシー期待との不一致につながる可能性がある。
実装者には、URL のキャッシュおよびネットワークから URL を取得する際の防御的実装に ついて、5.14 ネットワーク リクエスト節の指針に従うことが強く求められる。 リクエストを行っているクライアントを明らかにせずにネットワークからリソースを 取得するために、 Oblivious HTTP などの技術を使用することが奨励される。さらに、 適合する保護済み文書の作成者が、 プライバシー期待に反する可能性のある方法でフィンガープリンティング URL を 使用しているかどうかを判断するために、ヒューリスティックを使用してもよい。 これらのヒューリスティックは、フィンガープリンティングが疑われる URL を含む文書を 処理する可能性のあるエンティティに警告を表示するために使用できる。
変換、すなわち正規化が実行される方法は、システムのプライバシー特性に影響を与える 可能性がある。最良の正規化機構の選択は、ユースケースに依存する。 この節は、本仕様で参照される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] がある。このアプローチは、 一部のユースケースでは単純さの利点を持つが、本仕様で詳述されるアプローチが提供する 利点の一部を犠牲にする。
本仕様で説明される文書を保護する技術は一般化された性質を持つため、 その使用に伴うプライバシー上の影響は、読者にすぐ明らかではない可能性がある。 完全なソフトウェアシステムで考慮する必要があり得る種類のプライバシー上の懸念を 理解するため、実装者には、この技術が 検証可能なクレデンシャル エコシステム [VC-DATA-MODEL-2.0] で どのように使用されるかを読むことが強く求められる。詳細については 検証可能なクレデンシャルのプライバシー上の考慮事項に関する節を参照。
次の節では、この仕様を実装する開発者が、自身のソフトウェアをさまざまな認知、 運動、および視覚上のニーズを持つ人々にとって利用可能にするために考慮することが 強く求められるアクセシビリティ上の考慮事項について説明する。一般的な規則として、 本仕様はシステムソフトウェアによって使用され、アクセシビリティ上の考慮事項の対象となる 情報を個人に直接公開するものではない。しかし、本仕様によって表現される情報に 個人が間接的にさらされる場合があり、そのような状況のために以下の指針が提供される。
本仕様は、暗号学的証明の有効期間に関連する日付および時刻の表現を可能にする。 この情報は、証明が処理され、許容される時間範囲外であると検出された場合、 個人に間接的に公開される可能性がある。これらの日付および時刻を個人に公開する場合、 実装者には、表示ソフトウェアにおいて 日付および時刻を表現する際の 文化的規範とロケールを考慮に入れることが強く求められる。これらの考慮事項に加え、 情報を受け取る個人の認知的負担を軽減する方法で時刻値を提示することは、推奨される ベストプラクティスである。
たとえば、特定のデジタル署名済み情報集合の有効期限を伝える場合、実装者には、 正確性を最適化する表現ではなく、理解しやすい言葉を使用して有効期限を提示することが 強く求められる。有効期限を「このチケットは3日前に期限切れになりました。」として 提示することは、「このチケットは2023年7月25日午後3時43分に期限切れになりました。」 のような表現よりも望ましい。前者は、後者の時刻よりも理解しやすい相対時刻を提供する。 後者は、個人が頭の中で計算することを必要とし、そのような計算が可能であることを 前提としている。
この節は非規範的である。
2.1.1 証明セットおよび2.1.2 証明チェーン の各節では、複数の証明を 保護済みデータ文書で 表現する方法を説明する。すなわち、 保護済みデータ文書に含まれる単一の 証明 の代わりに、例 6および 例 7に示すように、複数の証明を リストで表現できる。 このリストの要素は、 証明セットのメンバーであり、任意で 証明チェーンの メンバーでもある。この節の目的は、これらの各機能の意図された使用法、 特にそれらの異なるセキュリティ特性を説明することである。これらの異なる セキュリティ特性は、 4.3 証明セット/チェーンの追加節における処理の違いにつながる。
この節では、重要なセキュリティ特性を観察できるように、 証明を含む保護済みデータ文書を 簡略化した形で表現する。
CEO、CFO、およびエンジニアリング担当副社長という3人の署名者がいる シナリオを考える。それぞれが文書へ署名するための公開鍵と秘密鍵の ペアを持つ必要がある。これらの署名者それぞれの秘密鍵/公開鍵を、 それぞれ secretCEO/publicCEO、secretCFO/publicCFO、および secretVPE/publicVPE と表す。
各署名者がinputDocumentへ個別に署名する 証明セットを構築する場合、証明を記号的に次のように構築する:
{
"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) は、特定の秘密鍵を使用し、特定の文書に対して、
特定のデータ完全性暗号スイートによってデジタル署名を計算することを表す。
type、cryptosuite、created、および
proofPurpose
属性はこの議論に影響しないため省略する。特に、以下では、
エンジニアリング担当副社長、CFO、および CEO によって署名された文書上の
証明セット内のすべての証明を示す:
{
// 保護済みデータ文書の残りは示していない (上記)
"proof": [{
"verificationMethod": publicVPE,
"proofValue": signature(secretVPE, inputDocument)
}, {
"verificationMethod": publicCFO,
"proofValue": signature(secretCFO, inputDocument)
}, {
"verificationMethod": publicCEO,
"proofValue": signature(secretCEO, inputDocument)
}]
}
holderまたは
証明セットを含む
保護済みデータ文書を受け取る
その他の仲介者は、それを別のエンティティへ渡す前に、そのセット内の
proof 値のいずれかを削除でき、それでもその
保護済み
データ文書は検証に成功する。これは意図されたことである場合もあれば、
そうでない場合もある。大切な従業員へ誕生日カードを送る署名者の場合、
証明セットを使うことは
おそらく問題ない。承認が会社の階層を上っていく業務プロセスをモデル化しようと
している場合には、これは理想的ではない。なぜなら、任意の仲介者が
証明セットから署名を削除しても、
それをなお検証可能にできるからである。たとえば、以下の例では、
エンジニアリング担当副社長の同意なしに、CFO と CEO が何かを承認したように見える。
{
// 保護済みデータ文書の残りは示していない (上記)
"proof": [{
"verificationMethod": publicCFO,
"proofValue": signature(secretCFO, inputDocument)
}, {
"verificationMethod": publicCEO,
"proofValue": signature(secretCEO, inputDocument)
}]
}
各証明の id プロパティを設定して別の証明から参照できるようにすることで、
証明セット内の
証明間に依存関係を導入できる。
つまり、依存される証明は、
previousProof プロパティを用いて、他の
依存する証明から参照される。このような
依存チェーンは任意の深さを持つことができる。このような
証明チェーンの意図は、
業務プロセスにおける承認チェーン、またはアナログ署名を目撃する公証人を
モデル化することである。
以下の例は、エンジニアリング担当副社長が最初に文書を承認署名し、
そのエンジニアリング担当副社長の署名とレビューに基づいて CFO が文書を承認署名し、
最後にそれ以前の両方の署名とレビューに基づいて CEO が文書を承認署名する場合に、
証明チェーンをどのように構築できるかを
示す。ほかの者がエンジニアリング担当副社長の署名を参照することになるため、
その証明に id を追加する必要がある。まず、エンジニアリング担当副社長が
入力文書に署名する:
{
// 保護済みデータ文書の残りは示していない (上記)
"proof": {
"id": "urn:proof-1",
"verificationMethod": publicVPE,
"proofValue": signature(secretVPE, inputDocument)
}
}
次に、CFO は文書を受け取り、エンジニアリング担当副社長がそれに署名したことを
検証し、レビューとエンジニアリング担当副社長の署名に基づいてそれに署名する。
そのためには、受け取ったばかりの文書内の証明への依存関係を示すことで、
証明チェーンを設定する必要がある。
これは、第2の証明の previousProof プロパティを
urn:proof-1 という値に設定することで行う。これにより、第2の証明が
第1の証明へ「束縛」され、その後署名される。次の例は、第1の証明への依存関係が
どのように作成されるかを示している:
{
// 保護済みデータ文書の残りは示していない (上記)
"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 を含む文書に対する証明を生成する。最終的な
証明チェーンは次のようになる:
{
// 保護済みデータ文書の残りは示していない (上記)
"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)
}]
}
この保護済みデータ文書の受信者は、 その後、同様の方法でそれを妥当性確認し、チェーン内の各証明を確認する。
この節は非規範的である。
この節には、この仕様に対して時間の経過とともに行われた実質的な変更を含む。
第2候補勧告以降の変更:
第1候補勧告以降の変更:
created 証明オプションが必須でないことを確保し、
追加の証明オプションが生成される証明に含まれるようにした。
最初の公開作業草案以降の変更:
JsonWebKey および Multikey の定義とコンテキストファイルを追加した。
Ed25519Signature2020 を非推奨にし、別仕様へ移動した。
nonce および expires を追加した。
revoked および expires を追加した。
domain プロパティを更新し、値の配列を許可した。
cryptosuiteString 型を証明に追加した。
digestMultibase プロパティおよび
multibase データ型を追加し、コンテキストに digestMultibase を
追加する指針を追加した。
dateTimeStamp を使用するように限定した。
DataIntegrityProof オブジェクトが
cryptosuite プロパティを含む必要があるという要件を追加した。
この節は非規範的である。
この仕様に関する作業は、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.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: