【注意】 このドキュメントは、W3CのDecentralized Identifiers (DIDs) v1.0 W3C Recommendation 19 July 2022の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2022年9月21日
翻訳版も参照してください。
Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
分散型識別子(DID)は、検証可能な分散型デジタルIDを実現する新しいタイプの識別子です。DIDとは、DIDコントローラが決定する任意のサブジェクト(人、組織、物、データ・モデル、抽象的なエンティティーなど)を指します。典型的な連携型の識別子とは対照的に、DIDは、集中型レジストリ、IDの提供者および認証機関から切り離すことができるように設計されています。具体的には、他の関係者を用いてDIDに関する情報を発見できるようにすることがありますが、この設計では、DIDコントローラは他の関係者からの許可を必要とせずにDIDの管理を証明することができます。DIDは、DIDサブジェクトをDIDドキュメントに関連付けるURIであり、そのサブジェクトに関連付けられた信頼できるインタラクションを可能にします。
個々のDIDドキュメントは、DIDコントローラがDIDの管理を証明するための一連のメカニズムを提供する、暗号化材料、検証メソッドまたはサービスを表現できます。サービスは、DIDサブジェクトに関連付けられている信頼できるインタラクションを可能にします。DIDサブジェクトがデータ・モデルなどの情報資源である場合、DIDは、DIDサブジェクト自体を返す手段を提供することができます。
このドキュメントでは、DIDの構文、共通のデータ・モデル、コア・プロパティー、シリアル化表現、DIDの操作およびDIDをDIDが表現する資源に解決する処理の説明を規定しています。
この項は、このドキュメントの公開時のステータスについて記述しています。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、https://www.w3.org/TR/のW3C技術報告インデックスにあります。
公開時点で、103の実験的なDIDメソッド仕様、32の実験的なDIDメソッドのドライバー実装、特定の実装がこの仕様に適合しているかどうかを判断するテスト・スイート、適合性テスト・スイートに提出された46の実装が存在していました。DIDコアテスト・スイートの課題には、この仕様の変更につながる可能性のある懸念事項や変更案の最新リストが含まれていますので、留意されることをお勧めします。公開時点では、実質的な課題、変更、修正の追加は予定されていません。
このドキュメントに関するコメントを歓迎します。課題は、GitHubで直接提出するか、public-did-wg@w3.org(購読、アーカイブ)にお送りください。
このドキュメントは、分散型識別子ワーキンググループ(Decentralized Identifier Working Group)が勧告トラックを用いて勧告として公開しました。
W3Cは、この仕様をウェブの標準として広く展開することを推奨します。
W3C勧告は、広範な合意形成の後、W3Cとそのメンバーの協賛を得、ワーキンググループのメンバーから、実装のためのロイヤルティ・フリーのライセンスを約束された仕様です。
このドキュメントは、W3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。
このドキュメントは、2021年11月2日のW3Cプロセス・ドキュメントによって管理されています。
この項は非規範的です。
個人でも組織でも、我々の多くは、様々な状況でグローバルに一意な識別子を用いています。これらの識別子は、通信アドレス(電話番号、電子メール・アドレス、ソーシャル・メディア上のユーザ名)、ID番号(パスポート、運転免許証、納税者番号、健康保険用)、製品の識別子(シリアル番号、バーコード、RFID)などの役割を果たしています。URI(Uniform Resource Identifier)は、ウェブ上の資源に用いられ、ブラウザで閲覧する個々のウェブ・ページは、グローバルに一意なURL(Uniform Resource Locator)を持っています。
これらのグローバルに一意な識別子の大部分は、我々の管理下にはありません。それらは、誰をまたは何を参照し、いつ失効させることができるのかを決定する外部機関によって発行されます。それらは、特定の状況でのみ有用であり、我々が選択したわけではない特定の機関によってのみ認識されています。それらは、組織の失敗により、消滅したり有効でなくなったりする可能性があります。個人情報が不必要に開示される可能性もあります。多くの場合、悪意のある第三者によって不正に複製されたり言明されたりする可能性があり、これは一般的に「なりすまし犯罪」(identity theft)として知られています。
この仕様で定義しているDID(Decentralized Identifier)は、新しいタイプのグローバルに一意な識別子です。個人や組織が、信頼できるシステムを用いて自身の識別子を生成できるように設計されています。この新しい識別子により、エンティティーは、デジタル署名などの暗号による証明を用いて認証することで、識別子に対する管理を証明することができます。
分散型識別子の生成と言明はエンティティーによって管理されるため、各エンティティーは、ID、ペルソナ、インタラクションの望ましい分離を維持するために必要な数のDIDを持つことができます。この識別子の使用範囲は、様々な状況に応じて適切に指定できます。これにより、個人のデータやプライベートなデータをどの程度公開するかを管理しつつ、識別子の存続を保証する中央機関に依存することなく、自身や自身が管理する事物をエンティティーによって識別する必要がある他の人々、機関、システムとのインタラクションがサポートされます。これらの概念については、DIDユースケース・ドキュメント[DID-USE-CASES]で検討されています。
この仕様は、DIDの生成、永続性、解決および解釈をサポートする特定の技術や暗号を前提としていません。例えば、実装者は、連携型または集中型のID管理システムに登録された識別子に基づいて分散型識別子を作成することができます。実際、ほぼすべての種類の識別子システムがDIDのサポートを追加できます。これにより、集中型、連携型および分散型の識別子の世界の間に相互運用性の懸け橋を築くことができます。これにより、実装者は、分散型台帳、分散型ファイル・システム、分散型データベース、ピア・ツー・ピア・ネットワークなど、信頼できるコンピューティング・インフラストラクチャと連携する特定の種類のDIDを設計することもできます。
この仕様は、次の人を対象としています。
この仕様に加えて、分散型識別子のユースケースおよび要件[DID-USE-CASES]ドキュメントも有用かもしれません。
この項は非規範的です。
DIDは、1) did
というURIスキーム識別子、2) DIDメソッドの識別子、3) DIDメソッド固有の識別子の3つの部分で構成されるシンプルなテキスト文字列です。
上記のDIDの例は、DIDドキュメントに対して解決されます。DIDドキュメントには、DIDコントローラを暗号で認証する方法など、DIDに関連付けられている情報が含まれています。
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2020/v1"
]
"id": "did:example:123456789abcdefghi",
"authentication": [{
// didとして認証するために使用:...fghi
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Ed25519VerificationKey2020",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}]
}
この項は非規範的です。
分散型識別子は、検証可能な資格証明エコシステム[VC-DATA-MODEL]などの大規模システムの構成要素であり、この仕様の設計目標に影響を与えました。分散型識別子の設計目標の要約を下記に示します。
目標 | 説明 |
---|---|
分散化 | グローバルに一意な識別子、公開検証キー、サービス、その他の情報の登録を含む、識別子管理における中央機関や単一障害点の要件を排除する。 |
管理 | 人間と人間以外の両方のエンティティーに、外部機関に依存する必要なく、自身のデジタル識別子を直接管理できる権限を与える。 |
プライバシー | 属性やその他のデータの最小限、選択的および段階的な開示を含め、エンティティーが情報のプライバシーを管理できるようにする。 |
セキュリティ | 要求側が必要な保証レベルをDIDドキュメントに依存するのに十分なセキュリティを実現する。 |
証拠に基づく | DIDコントローラが、他のエンティティーとインタラクションを行う際に、暗号による証明を提供できるようにする。 |
発見性 | エンティティーが他のエンティティーのDIDを発見し、そのエンティティーについてさらに学習したりインタラクションを行ったりすることを可能にする。 |
相互運用性 | DIDのインフラストラクチャが相互運用性のために設計された既存のツールやソフトウェア・ライブラリを利用できるように、相互運用可能な標準を用いる。 |
移植性 | システムやネットワークに依存せず、エンティティーが、DIDとDIDメソッドをサポートするあらゆるシステムで自身のデジタル識別子を使用できるようにする。 |
簡潔さ | 技術の理解、実装、展開を容易にするために、機能を削減し、シンプルにすることを奨励する。 |
拡張性 | 可能であれば、相互運用性、移植性または簡潔さを大きく損なわない範囲で、拡張性を持たせる。 |
この項は非規範的です。
この項では、分散型識別子アーキテクチャの主要構成要素の基本的な概要を提供します。
次のように、内部でラベル付けされた6つの図形が図で示され、それらの間にはラベル付きの矢印があります。図の中央には、DID URLとラベル付けされた長方形があり、「did:example:123/path/to/rsrc」という小さな文字で書かれたテキストが含まれています。図の中央上部には、「DID」とラベル付けされた長方形があり、「did:example:123」という小さな文字のテキストが含まれています。図の左上には、「DIDサブジェクト」とラベル付けされた楕円形があります。図の中央下には、「DIDドキュメント」とラベル付けされた長方形があります。左下には、「DIDコントローラ」とラベル付けされた楕円形があります。図の中央右には、「検証可能なデータ・レジストリ」とラベル付けされた円柱の2次元表示があります。
「DID URL」の長方形の上から、「含む」とラベル付けされた矢印が上に向かって伸び、「DID」の長方形を指し示しています。「DID URL」の長方形の下から、「~を参照、および~を逆参照」とラベル付けされた矢印が下に向かって伸び、「DID document」の長方形を指し示しています。「~に解決」とラベル付けされた「DID」の長方形からの矢印は、下方の「DIDドキュメント」の長方形を指し示しています「~を参照」とラベル付けされた「DID」の長方形からの矢印は、左側の「DIDサブジェクト」の楕円形を左に指し示しています。「管理」とラベル付けされた「DIDコントローラ」の楕円形からの矢印は、右の「DIDドキュメント」の長方形を指し示します。「~に記録」とラベル付けされた「DID」の長方形からの矢印は、右下の「検証可能なデータ・レジストリ」の円筒を指し示しています。「に記録される」とラベル付けされた「DIDドキュメント」の長方形からの矢印は、右上の「検証可能なデータ・レジストリ」の円柱を指し示しています。
did:
というスキーム、メソッドの識別子、DIDメソッドで指定される一意なメソッド固有の識別子の3つの部分で構成されるURIです。DIDは、DIDドキュメントに対して解決できます。DIDのURLは、基本的なDIDの構文を拡張し、特定の資源(DIDドキュメント内の暗号公開キーやDIDドキュメントの外部資源など)を示すために、パス、クエリ、フラグメントなどの他の標準的なURI構成要素を組み込んでいます。これらの概念については、3.1 DID構文と3.2 DID URL構文で詳しく説明しています。非規範的と記している項と同じく、この仕様のすべての作成ガイドライン、図、例、注は、非規範的です。この仕様のその他の部分はすべて規範的です。
このドキュメントの「することができる/してもよい(MAY)」、「しなければならない(MUST)」、「してはならない(MUST NOT)」、「選択できる/任意である(OPTIONAL)」、「推奨される(RECOMMENDED)」、「必須である/要求される(REQUIRED)」、「すべきである/する必要がある(SHOULD)」、「すべきでない/する必要がない(SHOULD NOT)」というキーワードは、ここで示しているように、すべて大文字で表示されている場合にのみ、BCP 14[RFC2119] [RFC8174]で記述されているように解釈されるべきです。
このドキュメントには、JSONとJSON-LDのコンテンツを含む例が含まれています。これらの例には、インライン・コメント(//
)や、例の価値をほとんど高めることのない情報を示す省略記号(...
)の使用など、無効な文字が含まれているものもあります。実装者がこの情報を有効なJSONやJSON-LDとして用いたい場合は、このコンテンツを削除するように注意してください。
一部の例には、この仕様では定義していない用語(プロパティー名と値の両方)が含まれています。それらは、(// 外部(プロパティー名|値)
)というコメントで示しています。このような用語をDIDドキュメントで用いた場合には、形式的な定義とJSON-LDコンテキストの両方へのリンクとともに、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録することが期待されます。
DIDとDIDドキュメントの実装の相互運用性は、この仕様に準拠したDIDとDIDドキュメントを作成、解析する実装の機能を評価することによってテストされます。DIDとDIDドキュメントのプロデューサとコンシューマの相互運用性は、DIDとDIDドキュメントの適合性を確保することによって提供されます。DIDメソッド仕様の相互運用性は、個々のDIDメソッド仕様の詳細によって提供されます。ウエブ・ブラウザがすべての既知のURIスキームを実装する必要がないのと同様に、DIDと連携する適合ソフトウェアがすべての既知のDIDメソッドを実装する必要はないものと理解されています。しかし、特定のDIDメソッドのすべての実装は、そのメソッドに対して相互運用可能であることが期待されます。
適合DID(conforming DID)は、3. 識別子で規定している規則を具体的に表したもので、同項の関連する規範的なステートメントに準拠しています。
適合DIDドキュメント(conforming DID document)は、この仕様で記載しているデータ・モデルを具体的に表したもので、4. データ・モデルと5. コア・プロパティーの関連する規範的なステートメントに準拠しています。適合ドキュメントのシリアル化形式は、6. 表現で記述しているように、確定的で、双方向的で、ロスのないものです。
適合プロデューサ(conforming producer)は、適合DIDまたは適合DIDドキュメントを生成し、6. 表現の関連する規範的なステートメントに準拠したソフトウェアおよび/またはハードウェアとして実現される任意のアルゴリズムです。
適合コンシューマ(conforming consumer)は、適合DIDまたは適合DIDドキュメントを利用し、6. 表現の関連する規範的なステートメントに準拠したソフトウェアおよび/またはハードウェアとして実現される任意のアルゴリズムです。
適合DIDリゾルバ(conforming DID resolver)は、7.1 DID解決の関連する規範的なステートメントに準拠したソフトウェアおよび/またはハードウェアとして実現される任意のアルゴリズムです。
適合DID URLデリファレンサ(conforming DID URL dereferencer)は、7.2 DID URL逆参照の関連する規範的なステートメントに準拠したソフトウェアおよび/またはハードウェアとして実現される任意のアルゴリズムです。
適合DIDメソッド(conforming DID method)は、8. メソッドの関連する規範的なステートメントに準拠した任意の仕様です。
この項は非規範的です。
この項では、この仕様および分散型識別子のインフラストラクチャ全体で用いる用語を定義します。これらの用語がこの仕様で出現する場合は常にこれらの用語にリンクを貼っています。
controller
プロパティーで示すことができます。DIDコントローラがDIDサブジェクトでありえることに注意してください。#
)以後の部分。DIDフラグメント構文は、URIのフラグメント構文と同じです。/
)から始まり(それを含む)、疑問符(?
)、フラグメントのハッシュ記号(#
)またはDID URLの終わりのいずれかで終わる部分。DIDパス構文は、URIのパス構文と同じです。詳細は、パスを参照してください。?
)以後の(それを含む)部分。DIDクエリ構文は、URIのクエリ構文と同じです。詳細は、クエリを参照してください。did:
という接頭辞で始まります。個々のDIDメソッド仕様は、その特定のDIDメソッドで動作する特定のDIDメソッドのスキームを定義します。特定のDIDメソッドでは、did:example:
のように、コロンを先頭にDIDメソッド名が続き、2つ目のコロンで終了します。/
という文字が付く)、オプションのDIDクエリ(先頭に?
という文字が付く)、オプションのDIDフラグメント(先頭に#
という文字が付く)が含まれます。@context
は、表現固有のエントリーです。証明を個別に検証する処理とともに使用できるパラメータの集合。例えば、暗号公開キーは、デジタル署名に関する検証メソッドとして使用でき、このような使用においては、署名者が関連付けられている暗号秘密キーを所有していることを検証します。
この定義における「検証」と「証明」は、広く適用されることを目的としています。例えば、暗号公開キーは、ディフィー・ヘルマン(Diffie-Hellman)キーの交換中に、暗号化用の共有対称キーを交渉するために用いられる場合があります。これにより、キー共有(key agreement)処理の完全性が保証されます。したがって、この処理の記述で「検証」や「証明」という言葉が使われていなくても、これも検証メソッドの一種です。
この仕様では、上記の用語に加えて、[INFRA]仕様の用語を用いて、データ・モデルを形式的に定義しています。文字列、集合、マップなど、[INFRA]仕様の用語を用いている場合は、その仕様に直接リンクしています。
この項では、DIDとDID URLの形式構文について説明します。ここで定義している構文を、特定のDIDメソッドでそれぞれの仕様で定義されている構文と区別するために「汎用的」という用語を用います。DIDとDID URLの作成処理とそのタイミングについては、8.2 メソッドの操作とB.2 DIDの作成で記述しています。
汎用的なDIDスキームは、[RFC3986]に準拠したURIスキームです。ABNFの定義は下記のとおりで、[RFC5234]の構文と、ALPHA
とDIGIT
の対応する定義を用いています。下記のABNFで定義されていない他のすべての規則名は、[RFC3986]で定義されています。すべてのDIDは、DID構文のABNF規則に準拠しなければなりません(MUST)。
DID構文のABNF規則 |
---|
did = "did:" method-name ":" method-specific-id method-name = 1*method-char method-char = %x61-7A / DIGIT method-specific-id = *( *idchar ":" ) 1*idchar idchar = ALPHA / DIGIT / "." / "-" / "_" / pct-encoded pct-encoded = "%" HEXDIG HEXDIG |
DID構文に関連するDIDメソッドの要件については、8.1 メソッドの構文の項を参照してください。
DID URLは、特定の資源のネットワーク・ロケーション識別子です。これは、DIDサブジェクトの表現、検証メソッド、サービス、DIDドキュメントの特定の部分、その他の資源などを取得するために使用できます。
下記は、[RFC5234]の構文を用いたABNF定義です。これは、3.1 DID構文で定義しているdid
スキームに基づいています。path-abempty
、query
、fragment
という構成要素は、[RFC3986]で定義されています。すべてのDID URLは、DID URL構文のABNF規則に準拠しなければなりません(MUST)。DIDメソッドは、8.1 メソッドの構文で説明しているように、これらの規則をさらに制限することができます。
DID URL構文のABNF規則 |
---|
did-url = did path-abempty [ "?" query ] [ "#" fragment ] |
セミコロン(;
)は、DID URL構文の規則に従って使用できますが、この仕様の将来のバージョンでは、[MATRIX-URIS]で説明されているように、パラメータのサブデリミタとして用いられる可能性があります。将来の競合を避けるために、開発者はこの文字の使用を控えるべきです。
DIDパスは、汎用的なURIパスと同じであり、RFC 3986の3.3項のpath-abempty
ABNF規則に準拠しています。URIと同様に、パスのセマンティクスは、DIDメソッドで指定することができ、これにより、DIDコントローラはそのセマンティクスをさらに特殊化できるようになる可能性があります。
did:example:123456/path
DIDクエリは、汎用的なURIクエリと同じであり、RFC 3986の3.4項のquery
のABNF規則に準拠しています。この構文の機能は、3.2.1 DIDパラメータで詳しく説明しています。
did:example:123456?versionId=1
DIDフラグメントの構文とセマンティクスは、汎用的なURIフラグメントと同じであり、RFC 3986の3.5項のfragment
のABNF規則に準拠しています。
DIDフラグメントは、メソッドに依存しないDIDドキュメントや外部資源への参照として用いられます。DIDフラグメントの識別子の一部の例を下記に示します。
did:example:123#public-key-0
did:example:123#agent
did:example:123?service=agent&relativeRef=/credentials#degree
相互運用性を最大限に高めるために、実装者は、DIDフラグメントが表現全体で同じように解釈されるようにすることが求められます(6. 表現を参照)。例えば、JSON指示子[RFC6901]は、DIDフラグメントで使用できますが、それはJSON以外の表現全体では同じように解釈されないでしょう。
この項のセマンティクスと互換性があり、その上にレイヤー化されるフラグメント識別子の追加のセマンティクスは、E.2 application/did+ld+jsonでJSON-LD表現に関して記述しています。DIDフラグメントを逆参照する方法については、7.2 DID URL逆参照を参照してください。
DID URLの構文は、クエリで説明しているquery
構成要素に基づくシンプルな形式のパラメータをサポートしています。DIDパラメータをDID URLに追加することは、そのパラメータが資源の識別子の一部になることを意味します。
did:example:123?versionTime=2021-05-10T17:00:00Z
did:example:123?service=files&relativeRef=/resume.pdf
一部のDIDパラメータは、特定のDIDメソッドとは完全に独立しており、すべてのDIDで同じように機能します。その他のDIDパラメータは、すべてのDIDメソッドでサポートされているわけではありません。オプションのパラメータがサポートされている場合は、それをサポートしているDIDメソッド全体で統一的に動作することが期待されます。次の表は、すべてのDIDメソッドで同じように機能する一般的なDIDパラメータを示しています。すべてのDIDパラメータに対するサポートはオプションです(OPTIONAL)。
一般的に、DID URLデリファレンサの実装は、追加の実装の詳細に関して[DID-RESOLUTION]を参照することが期待されます。この仕様の範囲では、最も一般的なクエリ・パラメータのコントラクトのみを定義しています。
パラメータ名 | 説明 |
---|---|
service |
サービスIDにより、DIDドキュメントからサービスを識別します。存在する場合、関連付けられている値は、ASCII文字列でなければなりません(MUST)。 |
relativeRef |
サービス・エンドポイントの資源を識別する、RFC3986の4.2項に従った相対URI参照です。service パラメータを用いてDIDドキュメントから選択されます。存在する場合、関連付けられている値は、ASCII文字列でなければならず(MUST)、RFC3986の2.1項で規定されているように、特定の文字に対してパーセント・エンコードを用いなければなりません(MUST)。 |
versionId |
解決するDIDドキュメントの特定のバージョンを識別します(バージョンIDは、シーケンシャルまたはUUIDまたはメソッド固有でありえる)。存在する場合、関連付けられている値は、ASCII文字列でなければなりません(MUST)。 |
versionTime |
解決するDIDドキュメントの特定のバージョンのタイムスタンプを識別します。つまり、特定の時点でDIDに対して有効だったDIDドキュメントです。存在する場合、関連付けられている値は、W3CのXMLスキーマ定義言語(XSD)1.1パート2: データ型[XMLSCHEMA11-2]の3.3.7項で定義されているように、有効なXMLデータの日時の値であるASCII文字列でなければなりません(MUST)。この日時の値は、UTC 00:00:00に正規化され、小数点以下の精度は1秒未満でなければなりません(MUST)。例えば、2020-12-20T19:17:47Z です。 |
hl |
[HASHLINK]で規定されている、整合性保護を追加するためのDIDドキュメントの資源ハッシュです。このパラメータは規範的ではありません。存在する場合、関連付けられている値は、ASCII文字列でなければなりません(MUST)。 |
DIDメソッド仕様の作成者のみならず実装者も、ここで記載していない追加のDIDパラメータを用いる可能性があります。最大限の相互運用性を確保するために、DIDパラメータは、DID仕様レジストリ・メカニズム[DID-SPEC-REGISTRIES]を用いて、異なるセマンティクスで同じDIDパラメータを用いる他の用途との衝突を避けることが推奨されます(RECOMMENDED)。
DIDパラメータは、そのパラメータが、DIDを単独で用いるよりも正確に資源を参照するURLの一部である必要があるという明確なユースケースがある場合に用いられる可能性があります。入力メタデータをDIDリゾルバに渡すことで同じ機能を表現できる場合は、 DIDパラメータは用いないことが期待されます。これらのパラメータを処理するための追加的な留意点については[DID-RESOLUTION]で論じられています。
DID解決とDID URLの逆参照の関数は、入力メタデータをDID URLの一部ではないDIDリゾルバに渡すことで、影響を受ける可能性があります(7.1.1 DID解決オプションを参照)。これは、特定のパラメータをHTTP URLに含めるか、逆参照の処理中にHTTPヘッダーとして渡すことができるHTTPに相当します。重要な違いは、DID URLの一部であるDIDパラメータは、どの資源が識別されているかを指定するために用いるべきであるのに対し、DID URLの一部ではない入力メタデータは、どのようにその資源を解決または逆参照するかを管理するために用いるべきであるという点です。
相対DID URLは、did:<method-name>:<method-specific-id>
で始まらないDIDドキュメント内の任意のURL値です。より具体的には、3.1 DID構文で定義しているABNFで始まらないURL値です。このURLは、同じDIDドキュメント内の資源を参照することが期待されます。相対DID URLには、相対パス構成要素、クエリ・パラメータおよびフラグメント識別子を含むことができます(MAY)。
相対DID URL参照を解決する場合、RFC3986の5項: 参照解決で規定されているアルゴリズムを用いなければなりません(MUST)。基底URIの値は、DIDサブジェクトに関連付けられているDIDです(5.1.1 DIDサブジェクトを参照)。スキームはdid
です。権限は<method-name>:<method-specific-id>
の組み合わせであり、パス、クエリ、フラグメントの値は、それぞれパス、クエリ、フラグメントで定義しているものです。
相対DID URLは、絶対URLを用いずに、DIDドキュメント内の検証メソッドとサービスを参照するためによく用いられます。保存サイズに留意が必要なDIDメソッドは、相対URLを用いてDIDドキュメントの保存サイズを削減する場合があります。
{ "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ] "id": "did:example:123456789abcdefghi", "verificationMethod": [{ "id": "did:example:123456789abcdefghi#key-1", "type": "Ed25519VerificationKey2020", // 外部(プロパティー値) "controller": "did:example:123456789abcdefghi", "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" }, ...], "authentication": [ // 上記の検証方法を参照するために使用される相対DID URL "#key-1" ] }
上記の例では、相対DID URLの値は、did:example:123456789abcdefghi#key-1
という絶対DID URLの値に変換されます。
この仕様では、DIDドキュメントとDIDドキュメントのデータ構造を表すために使用できるデータ・モデルを定義しており、それは、複数の具体的な表現にシリル化することができます。この項では、データ・モデルの概要、様々な種類のプロパティーをデータ・モデルで表現する方法およびデータ・モデルを拡張するための手順について説明します。
DIDドキュメントは、エントリーのマップで構成され、各エントリーは、キー/値の対で構成されます。DIDドキュメントのデータ・モデルには、少なくとも2つの異なるクラスのエントリーが含まれています。エントリーの最初のクラスは、プロパティーと呼ばれ、5. コア・プロパティーの項で規定しています。2番目のクラスは、表現固有のエントリーで構成され、6. 表現の項で規定しています。
DIDドキュメントのデータ・モデル内のすべてのエントリー・キーは文字列です。すべてのエントリーの値は、下記の表の抽象的なデータ型の1つを用いて表され、個々の表現は、各データ型の具体的なシリアル化形式を規定します。
データ型 | 留意点 |
---|---|
map(マップ) | [INFRA]で規定されている、キーが2度出現することのない、キー/値の対の有限の順序付きシーケンス。[INFRA]ではマップを順序付きマップと呼ぶことがあります。 |
list(リスト) | [INFRA]で規定されている、項目の有限の順序付きシーケンス。 |
set(集合) | [INFRA]で規定されている、同じ項目が2度含まれることのない、項目の有限の順序付きシーケンス。 [INFRA]では、集合を順序付き集合と呼ぶことがあります。 |
datetime(日時) | [XMLSCHEMA11-2]で規定されている、dateTime で表現可能なすべての値をロスなく表現できる日付と時刻の値。 |
string(文字列) | [INFRA]で規定されている、人間が読める言語を表すためによく用いられるコード単位のシーケンス。 |
integer(整数) | [XMLSCHEMA11-2]で規定されている、小数部分のない実数。相互運用性を最大限に高めるために、実装者はRFC8259の6項: 数値の整数に関するアドバイスに留意することが求められます。 |
double(倍精度浮動小数点数) | [XMLSCHEMA11-2]で規定されている、任意の実数を近似値にするために用いられることが多い値。相互運用性を最大限に高めるために、実装者はRFC8259の6項: 数値の倍精度浮動小数点数に関するアドバイスに留意することが求められます。 |
boolean(ブール) | [INFRA]で定義されている、true(真)かfalse(偽)のいずれかの値。 |
null(ヌル) | [INFRA]で定義されている、値がないことを示すために用いられる値。 |
データ・モデルが[INFRA]の用語を用いて定義されている結果として、リスト、マップ、集合など、複数の項目を含むことができるプロパティーの値は、明示的に順序付けられます。[INFRA]のすべてのリスト状の値の構造は、その順序が重要であるかどうかにかかわらず、順序付きです。この仕様の目的上、特に明記されていない限り、マップや集合の順序付けは重要ではなく、実装では確定的に順序付きの値を生成したり利用したりすることは期待されません。
このデータ・モデルは、2種類の拡張性をサポートしています。
特定の2つの実装が、DID仕様レジストリ[DID-SPEC-REGISTRIES]に記録されていない、相互に理解できる拡張や表現を用いることにアウト・オブ・バンド(out-of-band)で合意することは常に可能です。このような実装とより大規模なエコシステムとの間の相互運用性は、信頼性が低いでしょう。
DIDは、DIDドキュメントに関連付けられます。DIDドキュメントは、データ・モデルを用いて表され、表現へとシリアル化することができます。次の項では、プロパティーが必須かオプションかを含む、DIDドキュメントのプロパティーを定義します。このプロパティーは、DIDサブジェクトとプロパティーの値との関係を表します。
次の表には、期待される値や必須か否かを含む、この仕様で定義しているコア・プロパティーに関する参考情報の参考文献が含まれています。表内のプロパティー名は、各プロパティーの規範的な定義やより詳細な説明にリンクしています。
id
、type
、controller
というプロパティー名は、制約が異なる可能性がある、様々な種類のマップに出現できます。
プロパティー | 必須? | 値の制約 |
---|---|---|
id |
はい | 3.1 DID構文の規則に準拠した文字列。 |
alsoKnownAs |
いいえ | URIに関する[RFC3986]の規則に準拠した文字列の集合。 |
controller |
いいえ | 3.1 DID構文の規則に準拠した文字列または文字列の集合。 |
verificationMethod |
いいえ | 検証メソッドのプロパティーの規則に準拠した検証メソッドのマップの集合。 |
authentication |
いいえ | 検証メソッドのプロパティーの規則に準拠した検証メソッドのマップまたは3.2 DID URL構文の規則に準拠した文字列のいずれかの集合。 |
assertionMethod |
いいえ | |
keyAgreement |
いいえ | |
capabilityInvocation |
いいえ | |
capabilityDelegation |
いいえ | |
service |
いいえ | サービスのプロパティーの規則に準拠したサービス・エンドポイントのマップの集合。 |
プロパティー | 必須? | 値の制約 |
---|---|---|
id |
はい | 3.2 DID URL構文の規則に準拠した文字列。 |
controller |
はい | 3.1 DID構文の規則に準拠した文字列。 |
type |
はい | 文字列。 |
publicKeyJwk
|
いいえ | [RFC7517]に準拠したJSONウェブ・キーを表すマップ。追加の制約については、publicKeyJwkの定義を参照。 |
publicKeyMultibase |
いいえ | [MULTIBASE]のエンコードされた公開キーに準拠した文字列。 |
プロパティー | 必須? | 値の制約 |
---|---|---|
id |
はい | URIに関する[RFC3986]の規則に準拠した文字列。 |
type |
はい | 文字列または文字列の集合。 |
serviceEndpoint |
はい | URI、マップまたはURIおよび/またはマップに関する[RFC3986]の規則に準拠した、1つ以上の文字列で構成される集合に関する[RFC3986]の規則に準拠した文字列。 |
この項では、DIDドキュメントにDIDサブジェクトとDIDコントローラの識別子を含めるメカニズムについて説明します。
特定のDIDサブジェクトのDIDは、DIDドキュメントのid
プロパティーを用いて表します。
id
の値は、3.1 DID構文の規則に準拠した文字列でなければならず(MUST)、DIDドキュメントのデータ・モデルのルートのマップに存在していなければなりません(MUST)。{ "id": "did:example:123456789abcdefghijk" }
DIDコントローラとは、DIDドキュメントに変更を加える権限を与えられたエンティティーです。DIDコントローラに権限を与える処理は、DIDメソッドによって定義されます。
controller
プロパティーは、オプションです(OPTIONAL)。存在する場合、その値は、3.1 DID構文の規則に準拠した文字列または文字列の集合でなければなりません(MUST)。対応するDIDドキュメントには、特定の目的のための特定の検証メソッドの使用を明示的に許可する検証関係を含めるべきです(SHOULD)。controller
プロパティーがDIDドキュメントに存在する場合、その値は、1つ以上のDIDを表します。このDIDのDIDドキュメントに含まれている検証メソッドは、信頼できるものとして受け入れられ、その検証メソッドを満たす証明は、DIDサブジェクトが提供する証明と同等であるとみなされるべきです(SHOULD)。
{ "@context": "https://www.w3.org/ns/did/v1", "id": "did:example:123456789abcdefghi", "controller": "did:example:bcehfew7h32f32h7af3", }
controller
という値によって提供される承認は、5.3.1 認証で説明しているように、認証とは別のものであることに注意してください。これは、DIDサブジェクトが暗号キーの紛失によりキーにアクセスできなった場合や、キーの侵害によりDIDコントローラの信頼できる第三者が攻撃者による悪意のある行為を無効化する必要があるが場合のキーの回復にとって特に重要です。脅威モデル(threat model)と攻撃ベクトル(attack vector)については、9. セキュリティに関する留意点を参照してください。
DIDサブジェクトは、様々な目的で、または様々な時点で複数の識別子を持つことができます。2つ以上のDID(または他の種類のURI)が同じDIDサブジェクトを参照しているという言明は、alsoKnownAs
プロパティーを用いて行うことができます。
alsoKnownAs
プロパティーは、オプションです(OPTIONAL)。存在する場合、その値は、集合でなければならず(MUST)、その場合、集合内の個々の項目は[RFC3986]に準拠したURIです。アプリケーションは、alsoKnownAs
の関係が逆方向にも相互一致する場合には、alsoKnownAs
で関連づけられている2つの識別子は同等であると見なすことを選択する場合があります。この逆方向の関係がない場合は同等とみなさないのがベスト・プラクティスです。言い換えれば、alsoKnownAs
の言明の存在は、この言明が真であることを証明するものではありません。したがって、要求側は、alsoKnownAs
の言明の独立した検証を取得することを強く推奨します。
DIDサブジェクトが様々な目的のために様々な識別子を用いる可能性があることを考慮すると、2つの識別子の間に強い同等性を期待することや、対応する2つのDIDドキュメントの情報を統合することは、たとえ相関関係があったとしても、必ずしも適切ではありません。
DIDドキュメントは、DIDサブジェクトや関連当事者とのインタラクションを認証または承認するために使用できる、暗号公開キーなどの検証メソッドを表すことができます。例えば、暗号公開キーは、デジタル署名に関する検証メソッドとして使用できます。このような使用方法では、署名者が関連付けられている暗号秘密キーを使用できることを検証します。検証メソッドは、多くのパラメータを取る可能性があります。その一例は、5つの暗号キーの集合のうち、任意の3つの暗号キーが暗号閾値署名に役立つ必要のあるケースです。
verificationMethod
プロパティーは、オプションです(OPTIONAL)。存在する場合、その値は、検証メソッドの集合でなければならず(MUST)、個々の検証メソッドはマップを用いて表されます。検証メソッドのマップには、id
、type
controller
およびtype
の値によって決定され、5.2.1 検証材料で定義している特定の検証材料のプロパティーが含まれなければなりません(MUST)。検証メソッドには、追加のプロパティーを含むことができます(MAY)。検証メソッドは、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。
検証メソッドのid
プロパティーの値は、3.2 DID URL構文の項の規則に準拠した文字列でなければなりません(MUST)。
type
プロパティーの値は、きっかり1つの検証メソッドの型を参照する文字列でなければなりません(MUST)。グローバルな相互運用性を最大限に高めるために、検証メソッドの型は、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。controller
プロパティーの値は、3.1 DID構文の規則に準拠した文字列でなければなりません(MUST)。{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/jws-2020/v1"
"https://w3id.org/security/suites/ed25519-2020/v1"
]
"id": "did:example:123456789abcdefghi",
...
"verificationMethod": [{
"id": ...,
"type": ...,
"controller": ...,
"publicKeyJwk": ...
}, {
"id": ...,
"type": ...,
"controller": ...,
"publicKeyMultibase": ...
}]
}
controller
プロパティーのセマンティクスは、関係のサブジェクトがDIDドキュメントである場合も、関係のサブジェクトが暗号公開キーなどの検証メソッドである場合も同じです。キーは、自身を管理することはできず、キーのコントローラはDIDドキュメントから推測することはできないため、キーのコントローラのIDを明示的に表す必要があります。違いは、検証メソッドのcontroller
の値は、必ずしもDIDコントローラではないということです。DIDコントローラは、DIDドキュメントの最上位(データ・モデルの最上位マップ)でcontroller
プロパティーを用いて表されます。5.1.2 DIDコントローラを参照。
検証材料とは、検証メソッドを適用する処理で用いられる任意の情報です。検証メソッドのtype
は、そのような処理との互換性を判断するために用いることが期待されます。検証材料のプロパティーの例は、publicKeyJwk
やpublicKeyMultibase
です。暗号スイート仕様は、検証メソッドのtype
とそれに関連付けられている検証材料を指定する責任があります。例えば、JSONウェブ署名2020とEd25519署名2020を参照してください。登録済みのすべての検証メソッドの型と、DIDで利用できる関連付けられている検証材料については、DID仕様レジストリ[DID-SPEC-REGISTRIES]を参照してください。
相互運用可能な実装の可能性を高めるために、この仕様では、DIDドキュメントで検証材料を表すための形式の数を制限しています。実装者が実装しなければならない形式が少なければ少ないほど、すべての形式をサポートする可能性が高くなります。このアプローチは、実装の容易さと、これまで広く展開されてきたサポート形式との間で微妙なバランスを取ろうとするものです。サポートされている2つの検証材料のプロパティーを以下に示します。
publicKeyJwk
プロパティーは、オプションです(OPTIONAL)。存在する場合、その値は、[RFC7517]に準拠したJSONウェブ・キーを表すマップでなければなりません(MUST)。マップには、「d」または登録テンプレートで記述されている個人情報クラスの他のメンバーを含めてはなりません(MUST NOT)。JWK[RFC7517]を用いて自身の公開キーを表す検証メソッドでは、kid
の値を自身のフラグメント識別子として用いることが推奨されます(RECOMMENDED)。JWKのkid
の値を公開キーのフィンガープリント[RFC7638]に設定することが推奨されます(RECOMMENDED)。複合的なキーの識別子を持つ公開キーの例については、例13の最初のキーを参照してください。
publicKeyMultibase
プロパティーは、オプションです(OPTIONAL)。この機能は非規範的です。存在する場合、その値は、[MULTIBASE]でエンコードされた公開キーの文字列表現でなければなりません(MUST)。
[MULTIBASE]の仕様は、まだ標準ではなく、変更される可能性があることに注意してください。このデータ形式には、公開キーの表現を可能にするためにpublicKeyMultibase
は定義されるけれども、秘密キーの不慮の漏洩を防ぐためのprivateKeyMultibase
は定義されないというユースケースがあるかもしれません。
検証メソッドには、同じ材料に対して複数の検証材料プロパティーを含めてはなりません(MUST NOT)。例えば、publicKeyJwk
とpublicKeyMultibase
の両方を同時に用いた検証メソッドでキー材料を表すことは禁止されています。
上記の両方のプロパティーを用いた検証メソッドを含むDIDドキュメントの例を以下に示します。
{ "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/jws-2020/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ] "id": "did:example:123456789abcdefghi", ... "verificationMethod": [{ "id": "did:example:123#_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A", "type": "JsonWebKey2020", // 外部(プロパティー値) "controller": "did:example:123", "publicKeyJwk": { "crv": "Ed25519", // 外部(プロパティー名) "x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ", // 外部(プロパティー名) "kty": "OKP", // 外部(プロパティー名) "kid": "_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A" // 外部(プロパティー名) } }, { "id": "did:example:123456789abcdefghi#keys-1", "type": "Ed25519VerificationKey2020", // 外部(プロパティー値) "controller": "did:example:pqrstuvwxyz0987654321", "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" }], ... }
検証メソッドは、5.3 検証関係で説明しているように、様々な検証関係に関連付けられているプロパティーに組み込むか、それらのプロパティーから参照することができます。検証メソッドを参照することにより、それらを複数の検証関係で使用できるようになります。
検証メソッドのプロパティーの値がマップであれば、検証メソッドは組み込まれており、そのプロパティーに直接アクセスすることができます。しかし、値がURLの文字列である場合には、検証メソッドは、参照によって含まれているため、そのプロパティーはDIDドキュメント内の他の場所または別のDIDドキュメントから取得する必要があります。これは、URLを逆参照し、結果の資源で、値がURLと一致するid
プロパティーを持つ検証メソッドのマップを検索することによって行われます。
{ ... "authentication": [ // このキーは参照され、複数の検証関係で // 使用される可能性がある "did:example:123456789abcdefghi#keys-1", // このキーは組み込まれており、認証に「のみ」使用することができる { "id": "did:example:123456789abcdefghi#keys-2", "type": "Ed25519VerificationKey2020", // 外部(プロパティー値) "controller": "did:example:123456789abcdefghi", "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" } ], ... }
検証関係は、DIDサブジェクトと検証メソッドとの関係を表します。
関連付けられている検証メソッドは、様々な検証関係により、様々な目的のために使用できます。用いられている検証メソッドがDIDドキュメントの適切な検証関係プロパティーに含まれていることを確認することにより、検証の試みの妥当性を確認するのは検証者の責任です。
DIDサブジェクトと検証メソッドとの間の検証関係は、DIDドキュメントで明示されます。特定の検証関係に関連付けられていない検証メソッドは、その検証関係には使用できません。例えば、authentication
プロパティーの値内の検証メソッドを用いてDIDサブジェクトとのキー合意プロトコルに携わることはできず、そのためには、keyAgreement
プロパティーの値を用いる必要があります。
DIDドキュメントが、検証関係を用いて失効したキーを表すことはありません。参照された検証メソッドが、それを逆参照するために用いられた最新のDIDドキュメントになければ、その検証メソッドは無効または失効となったと見なされます。個々のDIDメソッド仕様に、失効の実行方法と追跡方法が詳細に記載されていることが期待されます。
以下の項で、いくつかの有用な検証関係を定義しています。DIDドキュメントには、特定の検証関係を表すために、これらのプロパティーのいずれか、 または他のプロパティーを含めることができます(MAY)。グローバルな相互運用性を最大限に高めるために、このような用いられるプロパティーはすべて、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。
authentication
という検証関係は、ウェブサイトへのログインや、何らかのチャレンジ・レスポンス・プロトコルへの関与などの目的で、DIDサブジェクトをどのように認証することが期待されるかを指定するために用いられます
authentication
プロパティーは、オプションです(OPTIONAL)。存在する場合、関連付けられている値は、1つ以上の検証メソッドの集合でなければなりません(MUST)。個々の検証メソッドは、組み込むか参照することができます(MAY)。{ "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ], "id": "did:example:123456789abcdefghi", ... "authentication": [ // このメソッドは、didとして認証するために使用できる:...fghi "did:example:123456789abcdefghi#keys-1", // このメソッドは認証用に「のみ」承認されており、 // 他の証明目的には使用できないため、参照のみを用いる // のではなく、その完全な記述をここに組み込んでいる { "id": "did:example:123456789abcdefghi#keys-2", "type": "Ed25519VerificationKey2020", "controller": "did:example:123456789abcdefghi", "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" } ], ... }
認証が確立された場合、その情報をどのように扱うかの判断は、DIDメソッドまたはその他のアプリケーション次第です。特定のDIDメソッドでは、例えばDIDドキュメントを更新または削除するためであれば、DIDコントローラとして認証するだけで十分であると判断することができます。別のDIDメソッドでは、認証を行うために用いたものとは異なるDIDドキュメントを更新または削除するためには、様々なキーまたは完全に異なる検証メソッドを提示することが求められる可能性があります。言い換えれば、認証チェックの後に何が行われるかは、データ・モデルの範囲外です。DIDメソッドとアプリケーションは、自身でこれを定義することが期待されます。
これは、認証しようとしているエンティティーが、実際に有効な認証証明を提示しているかどうかを確認する必要がある認証の検証者にとって有用です。検証者が、「認証」を目的として作成された証明を含んでいる何らかのデータ(何らかのプロトコル固有の形式)を受信し、それが、エンティティーがDIDによって識別されることを示している場合、その検証者は、DIDドキュメントのauthentication
下に記載されている検証メソッド(例えば、公開キー)を用いてその証明を検証できることを確認します。
DIDドキュメントのauthentication
プロパティーで示される検証メソッドは、そのDIDサブジェクトの認証にのみ使用できることに注意してください。異なるDIDコントローラを認証するためには、5.1.2 DIDコントローラで定義しているように、controller
の値に関連付けられているエンティティーは、自身のDIDドキュメントと、関連付けられているauthentication
という検証関係を用いて認証する必要があります。
assertionMethod
という検証関係は、検証可能な資格証明[VC-DATA-MODEL]を発行する目的など、DIDサブジェクトがどのようにクレーム(claim)を表明することが期待されるかを指定するために用いられます。
assertionMethod
プロパティーは、オプションです(OPTIONAL)。存在する場合、関連付けられている値は、1つ以上の検証メソッドの集合でなければなりません(MUST)。個々の検証メソッドは、組み込むか参照することができます(MAY)。このプロパティーは、例えば、検証者による検証可能な資格証明の処理中に有用です。検証中、検証者は、証明の言明に用いられている検証メソッドが、対応するDIDドキュメントのassertionMethod
プロパティーに関連付けられているかどうかをチェックすることにより、検証可能な資格証明にDIDサブジェクトが作成した証明が含まれているかどうかを確認します。
{ "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ], "id": "did:example:123456789abcdefghi", ... "assertionMethod": [ // このメソッドは、didとしてステートメントを言明するために使用できる:...fghi "did:example:123456789abcdefghi#keys-1", // このメソッドはステートメントの言明用に「のみ」承認されており、 // 他の検証関係には用いられないため、参照を用いるのではなく、 // その完全な記述をここに組み込んでいる { "id": "did:example:123456789abcdefghi#keys-2", "type": "Ed25519VerificationKey2020", // 外部(プロパティー値) "controller": "did:example:123456789abcdefghi", "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" } ], ... }
keyAgreement
という検証関係は、受信者との安全な通信チャネルを確立する目的など、DIDサブジェクト向けの機密情報を送信するために、エンティティーが暗号化材料を生成する方法を指定するために用いられます。
keyAgreement
プロパティーは、オプションです(OPTIONAL)。存在する場合、関連付けられている値は、1つ以上の検証メソッドの集合でなければなりません(MUST)。個々の検証メソッドは、組み込むか参照することができます(MAY)。このプロパティーが有用である例としては、DIDサブジェクト向けのメッセージを暗号化する場合が挙げられます。この場合、相手は、検証メソッド内の暗号公開キー情報を用いて、受信者用の復号キーをラップします。
{ "@context": "https://www.w3.org/ns/did/v1", "id": "did:example:123456789abcdefghi", ... "keyAgreement": [ // このメソッドは、didとしキー共有を行うために私用できる:...fghi "did:example:123456789abcdefghi#keys-1", // このメソッドは、キー共有の用途に「のみ」承認されており、 // 他の検証関係には用いられないため、参照のみを用いるのではなく、 // その完全な記述をここに組み込んでいる { "id": "did:example:123#zC9ByQ8aJs8vrNXyDhPHHNNMSHPcaSgNpjjsBYpMMjsTdS", "type": "X25519KeyAgreementKey2019", // 外部(プロパティー値) "controller": "did:example:123", "publicKeyMultibase": "z9hFgmPVfmBZwRvFEyniQDBkz9LmV7gDEqytWyGZLmDXE" } ], ... }
capabilityInvocation
という検証関係は、DIDドキュメントを更新するための承認など、暗号化機能を呼び出すためにDIDサブジェクトが用いる可能性のある検証メソッドを指定するために用いられます。
capabilityInvocation
プロパティーは、オプションです(OPTIONAL)。存在する場合、関連付けられている値は、1つ以上の検証メソッドの集合でなければなりません(MUST)。個々の検証メソッドは、組み込むか参照することができます(MAY)。このプロパティーが有用である例としては、DIDサブジェクトが、保護されたHTTP APIにアクセスする必要があり、それを用いるためには承認が必要な場合が挙げられます。HTTP APIの使用時に承認を行うために、DIDサブジェクトは、HTTP APIを介して公開される特定のURLに関連付けられている機能を用います。機能の呼び出しは、HTTPヘッダに置かれるデジタル署名付きメッセージなど、様々な方法で表現できます。
HTTP APIを提供するサーバーは機能の検証者であり、呼び出された機能が参照している検証メソッドがDIDドキュメントのcapabilityInvocation
プロパティーに存在することを検証する必要があります。検証者は、実行されているアクションが有効であり、機能がアクセスされている資源に適していることも確認するでしょう。検証が成功したならば、呼び出し元が保護されている資源へのアクセスを承認されていることをサーバーが暗号で判断したということです。
{ "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ], "id": "did:example:123456789abcdefghi", ... "capabilityInvocation": [ // this method can be used to invoke capabilities as did:...fghi "did:example:123456789abcdefghi#keys-1", // this method is *only* approved for capability invocation usage, it will not // be used for any other verification relationship, so its full description is // embedded here rather than using only a reference { "id": "did:example:123456789abcdefghi#keys-2", "type": "Ed25519VerificationKey2020", // 外部(プロパティー値) "controller": "did:example:123456789abcdefghi", "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" } ], ... }
capabilityDelegation
という検証関係は、特定のHTTP APIにアクセスする権限を下位に委譲するなど、暗号機能を別の関係者に委譲するためにDIDサブジェクトが用いる可能性のあるメカニズムを指定するために用いられます。
capabilityDelegation
プロパティーは、オプションです(OPTIONAL)。存在する場合、関連付けられている値は、1つ以上の検証メソッドの集合でなければなりません(MUST)。個々の検証メソッドは、組み込むか参照することができます(MAY)。このプロパティーが有用である例としては、DIDコントローラが、保護されたHTTP APIにアクセスする機能を自分以外の関係者に委譲することを選択する場合が挙げられます。機能を委譲するために、DIDサブジェクトは、capabilityDelegation
という検証関係に関連付けられている検証メソッドを用いて、暗号で署名して機能を別のDIDサブジェクトに委譲します。委譲者はその後、5.3.4 機能の呼び出しで説明している例と同様の方法で機能を用います。
{ "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ], "id": "did:example:123456789abcdefghi", ... "capabilityDelegation": [ // this method can be used to perform capability delegation as did:...fghi "did:example:123456789abcdefghi#keys-1", // this method is *only* approved for granting capabilities; it will not // be used for any other verification relationship, so its full description is // embedded here rather than using only a reference { "id": "did:example:123456789abcdefghi#keys-2", "type": "Ed25519VerificationKey2020", // 外部(プロパティー値) "controller": "did:example:123456789abcdefghi", "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" } ], ... }
サービスは、DIDサブジェクトや関連付けられているエンティティーとの通信方法を表すために、DIDドキュメントで用いられます。サービスは、さらなる発見、認証、承認またはインタラクションのための分散型ID管理サービスを含む、DIDサブジェクトが公表したいあらゆる種類のサービスでありえます。
プライバシーの懸念から、ソーシャル・メディア・アカウント、個人のウェブサイト、電子メール・アドレスなどのサービスを通じて公開情報を公開することは推奨されません。プライバシーの懸念に関するさらなる探求については、10.1 個人情報の保護と10.6 サービスのプライバシーを参照してください。サービスに関連付けられている情報は、多くの場合、サービス固有のものです。例えば、暗号化されたメッセージ・サービスに関連付けられている情報は、メッセージの送受信が始まる前に暗号化されたリンクを開始する方法を表すことができます。
サービスは、下記のservice
プロパティーを用いて表されます。
service
プロパティーは、オプションです(OPTIONAL)。存在する場合、関連付けられている値はサービスの集合でなければならず(MUST)、個々のサービスはマップで記述されます。個々のサービスのマップには、id
、type
、serviceEndpoint
のプロパティーが含まれていなければなりません(MUST)。個々のサービスの拡張に追加のプロパティーを含むことができ(MAY)、拡張に関連付けられているプロパティーをさらに制限することができます(MAY)。
id
プロパティーの値は、[RFC3986]に準拠したURIでなければなりません(MUST)。適合プロデューサは、同じid
を持つ複数のservice
エントリーを生成してはなりません(MUST NOT)。適合コンシューマは、同じid
を持つ複数のservice
エントリーを検出した場合、エラーを出さなければなりません(MUST)。type
プロパティーの値は、文字列または文字列の集合でなければなりません(MUST)。相互運用性を最大限に高めるために、サービスの型とそれに関連付けられるプロパティーをDID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。serviceEndpoint
というプロパティーの値は、文字列、マップまたは1つ以上の文字列および/またはマップで構成される集合でなければなりません(MUST)。すべての文字列の値は、[RFC3986]に準拠した有効なURIでなければならず(MUST)、RFC3986の正規化と比較の規則および該当するURIスキーム仕様の正規化規則に従って正規化されなければなりません(MUST)。サービスに関連するプライバシーとセキュリティに関する留意点の詳細については、10.6 サービスのプライバシー、10.1 個人情報の保護、10.3 DIDドキュメントの相関関係のリスクおよび9.3 認証サービス・エンドポイントを参照してください。
{
"service": [{
"id":"did:example:123#linked-domain",
"type": "LinkedDomains", // 外部(プロパティー値)
"serviceEndpoint": "https://bar.example.com"
}]
}
この仕様のDIDドキュメントを具体的にシリアル化したもの表現と呼びます。表現は、プロダクションと呼ばれる処理によりデータ・モデルをシリアル化することで作成されます。表現は、コンサンプションと呼ばれる処理によりデータ・モデルに変換されます。プロダクションとコンサンプションという処理により、ある表現から別の表現への情報の変換が可能になります。この仕様では、JSONとJSON-LDの表現を定義していますが、開発者は、データ・モデルを表現できるXMLやYAMLなどのその他の表現も使用できます。以下の項では、プロダクションとコンサンプションの一般的な規則と、JSONとJSON-LDの表現を定義しています。
(DID仕様レジストリ[DID-SPEC-REGISTRIES]に掲載されていないプロパティーの相互運用可能な処理に関する規則を含め)個々の表現が適切に指定されていれば、実装者は、この仕様で定義している表現に加えて、他の表現を使用できます。詳細については、4.1 拡張性を参照してください。
すべての表現の要件は次のとおりです。
dateTime
字句シリアル化を用いて日時を表します。表現は、データ・モデルへと戻すコンサンプションの処理にロスがない限り、様々な字句シリアル化を用いてデータ・モデルのデータ型をシリアル化することを選択できます(MAY)。例えば、一部のCBORベースの表現は、整数を用いて日時の値を表し、Unixエポック以来の秒数を表します。すべての適合プロデューサの要件は次のとおりです。
すべての適合コンシューマの要件は次のとおりです。
図の左上の4分の1の部分には、灰色の破線で囲まれた長方形が含まれており、その中には青い線で囲まれた2つの長方形が上下に配置されています。上の大きな長方形は青字で「コアなプロパティー」とラベル付けされており、次のようなINFRA表記が含まれています。
≪[
"id" → "example:123",
"verificationMethod" → ≪ ≪[
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Ed25519VerificationKey2018",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVA"
]≫ ≫,
"authentication" → ≪
"did:example:123#keys-1"
≫
]≫
下の小さな長方形は青字で「コアな表現固有のエントリー(JSON-LD)」とラベル付けされており、次のような等幅のINFRA表記が含まれています。
≪[ "@context" → "https://www.w3.org/ns/did/v1" ]≫
灰色の線で囲まれた長方形から、3対の矢印が黒い線で囲まれた3つの長方形に向かって伸びています(図の右上に1つ、右下に1つ、左下に1つ)。対の矢印はそれぞれ、灰色の線で囲まれた長方形からそれぞれの黒い線で囲まれた長方形を指し示す1つの青い矢印(「作成する」とラベル付けされている)と、その逆方向を指し示す1つの赤い矢印(「利用する」とラベル付けされている)で構成されています。右上の黒い線の長方形は「application/did+cbor」とラベル付けされており、16進数のデータが含まれています。右下の長方形は「application/did+json」とラベル付けされており、次のJSONデータが含まれています。
{
"id": "did:example:123",
"verificationMethod": [{
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Ed25519VerificationKey2018",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVA"
}],
"authentication": [
"did:example:123#keys-1"
]
}
左下の長方形は「application/did+ld+json」とラベル付けされており、次のJSON-LDデータが含まれています。
{
"@context": ["https://www.w3.org/ns/did/v1"],
"id": "did:example:123",
"verificationMethod": [{
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Ed25519VerificationKey2018",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVA"
}],
"authentication": [
"did:example:123#keys-1"
]
}
この項では、JSON表現のプロダクションとコンサンプションの規則を定義します。
DIDドキュメント、DIDドキュメントのデータ構造および表現固有のエントリーのマップは、次のプロダクション規則に従ってJSON表現にシリアル化しなければなりません(MUST)。
データ型 | JSON表現型 |
---|---|
map(マップ) | JSONオブジェクト。この表で定義しているように、個々のエントリーは、エントリー・キーをJSON文字列のメンバー名として持ち、その型に応じたエントリー値を持つJSONオブジェクトのメンバーとしてシリアル化されます。 |
list(リスト) | JSON配列。この表で定義しているように、リストの個々の要素は、その型に応じた配列の値として順にシリアル化されます。 |
set(集合) | JSON配列。この表で定義しているように、集合の個々の要素は、その型に応じた配列の値として順に追加されます。 |
datetime(日時) | UTC 00:00:00に正規化され、一秒以内の小数精度を含まないXML日時としてシリアル化されたJSON文字列。例えば、2020-12-20T19:17:47Z 。 |
string(文字列) | JSON文字列。 |
integer(整数) | 小数点または分数の要素を含まないJSON数値。 |
double(倍精度浮動小数点数) | 小数点および分数の要素を含んだJSON数値。 |
boolean(ブール) | JSONブール値。 |
null(ヌル) | JSONnull(ヌル)のリテラル。 |
JSON表現を生成する適合プロデューサを作成するすべての実装者は、自身のアルゴリズムが[INFRA]仕様のJSONシリアル化規則とJSON[RFC8259]仕様の数値に関する精度の助言に沿っていることを確認することをお勧めします。
DIDドキュメントのすべてのエントリーは、ルートのJSONオブジェクトに含まれなければなりません(MUST)。エントリーには、上記リストの値の表現規則に従った追加のデータ部分構造を含めることができます(MAY)。DIDドキュメントをシリアル化する場合、適合プロデューサは、7.1.2 DID解決メタデータで説明しているような下流のアプリケーションに対しapplication/did+json
というメディア・タイプを指定しなければなりません(MUST)。
{ "id": "did:example:123456789abcdefghi", "authentication": [{ "id": "did:example:123456789abcdefghi#keys-1", "type": "Ed25519VerificationKey2018", "controller": "did:example:123456789abcdefghi", "publicKeyBase58": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" }] }
DIDドキュメントとDIDドキュメントのデータ構造のJSON表現は、次のコンサンプション規則に従ってデータ・モデルに逆シリアル化されなければなりません(MUST)。
JSON表現型 | データ型 |
---|---|
JSONオブジェクト | マップ。JSONオブジェクトの個々のメンバーがエントリーとしてマップに追加されます。個々のエントリー・キーは、JSONオブジェクトのメンバー名として設定されます。個々のエントリーの値は、JSONオブジェクトのメンバーの値を、この表で定義しているJSON表現型に従って変換することによって設定されます。JSONオブジェクトは順序を規定しないため、挿入の順序は保証されません。 |
データ・モデルのエントリー値がリストまたは不明であるJSON配列 | リスト。この表で定義しているように、JSON配列の個々の値は、配列値のJSON表現型に基づいて変換され、順にリストに追加されます。 |
データ・モデルのエントリー値が集合であるJSON配列 | 集合。この表で定義しているように、JSON配列の個々の値は、配列値のJSON表現型に基づいて変換され、順に集合に追加されます。 |
データ・モデルのエントリー値が日時であるJSON文字列 | datetime(日時)。 |
データ・モデルのエントリー値の型が文字列または不明であるJSON文字列 | string(文字列)。 |
小数点または分数の要素を含まないJSON数値 | integer(整数)。 |
小数点および分数の要素を含むJSON数値または分数の要素の有無にかかわらずエントリー値が倍精度浮動小数点数の場合 | double(倍精度浮動小数点数)。 |
JSONブール | boolean(ブール)。 |
JSONのnull(ヌル)リテラル | null(ヌル)値。 |
JSON表現を生成する適合コンシューマを作成するすべての実装者は、そのアルゴリズムが[INFRA]仕様のJSON変換規則とJSON[RFC8259]仕様の数値に関する精度の助言に沿っていることを確認することをお勧めします。
適合コンシューマがメディア・タイプ情報を利用でき、メディア・タイプの値がapplication/did+json
である場合、利用されているデータ構造はDIDドキュメントであり、ルート要素は、オブジェクトのすべてのメンバーがDIDドキュメントのエントリーであるJSONオブジェクトでなければなりません(MUST)。JSONオブジェクトではないルート要素を持つDIDドキュメントを利用しているJSON表現の適合コンシューマは、エラーを報告しなければなりません(MUST)。
JSON-LD[JSON-LD11]は、リンクト・データをシリアル化するために用いるJSONベースの形式です。この項では、JSON-LD表現のプロダクションとコンサンプションの規則を定義します。
JSON-LD表現は、次の表現固有のエントリーを定義しています。
DIDドキュメント、DIDドキュメントのデータ構造および表現固有のエントリーのマップは、6.2 JSONで定義しているように、JSON表現のプロダクション規則に従って、JSON-LD表現にシリアル化しなければなりません(MUST)。
JSON表現のプロダクション規則の使用に加えて、JSON-LDプロダクションには、表現固有の@context
エントリーを含めなければなりません(MUST)。@context
のシリアル化された値は、JSON文字列のhttps://www.w3.org/ns/did/v1
、または、最初の項目がJSON文字列のhttps://www.w3.org/ns/did/v1
で、その後の項目がJSON表現のプロダクション規則に従ってシリアル化されたJSON配列でなければなりません(MUST)。
{
"@context": "https://www.w3.org/ns/did/v1",
...
}
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://did-method-extension.example/v1"
],
...
}
JSON-LD表現を生成する適合プロデューサを作成するすべての実装者は、そのアルゴリズムが有効なJSON-LD[JSON-LD11]ドキュメントを生成することを確認することをお勧めします。無効なJSON-LDドキュメントは、JSON-LDプロセッサを停止させ、エラーを報告します。
様々な表現間の相互運用性を実現するために、すべてのJSON-LDコンテキストとその用語をDID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。
適合コンシューマが未知の用語を削除することが予期されるため、JSON-LD表現を生成する適合プロデューサは、@context
で定義されていない用語を含むDIDドキュメントを生成すべきではありません(SHOULD NOT)。DIDドキュメントのJSON-LD表現をシリアル化する場合、適合プロデューサは、7.1.2 DID解決メタデータで説明しているような下流のアプリケーションに対して、application/did+ld+json
というメディア・タイプを指定しなければなりません(MUST)。
JSON-LD表現で表されたDIDドキュメントとDIDドキュメントのデータ構造は、6.2 JSONで定義しているJSON表現のコンサンプション規則に従って、データ・モデルに逆シリアル化しなければなりません(MUST)。
JSON-LD表現を利用する適合コンシューマを作成するすべての実装者は、そのアルゴリズムが有効なJSON-LD[JSON-LD11]ドキュメントのみを受け入れることを確認することをお勧めします。無効なJSON-LDドキュメントは、JSON-LDプロセッサを停止させ、エラーを報告します。
JSON-LD表現を処理する適合コンシューマは、@context
で定義されていないすべての用語をDIDドキュメントから削除すべきです(SHOULD)。
この項では、DID解決とDID URL逆参照の入力と出力を定義します。これらの正確な実装は、この仕様の範囲外ですが、実装者用のいくつかの留意点について[DID-RESOLUTION]で論じています。
すべての適合DIDリゾルバは、少なくとも1つのDIDメソッドに対するDID解決関数を実装しなければならず(MUST)、少なくとも1つの適合する表現でDIDドキュメントを返すことができなければなりません(MUST)。
DID解決関数は、8.2 メソッドの操作で説明しているように、該当するDIDメソッドの「Read」の操作を用いて、DIDをDIDドキュメントに解決します。この処理がどのように達成されるかの詳細は、この仕様の範囲外ですが、すべての適合DIDリゾルバは、下記の抽象的な形式を持つ関数を実装しています。
resolve(did, resolutionOptions) →
≪ didResolutionMetadata, didDocument, didDocumentMetadata ≫
resolveRepresentation(did, resolutionOptions) →
≪ didResolutionMetadata, didDocumentStream, didDocumentMetadata ≫
resolve
関数は、DIDドキュメントをその抽象的な形式(マップ)で返します。resolveRepresentation
関数は、対応する表現でフォーマットされたDIDドキュメントのバイト・ストリームを返します。
図の中央上部には、灰色の破線で囲まれた長方形が含まれており、その中には青い線で囲まれた2つの長方形が上下に配置されています。上の大きい方の長方形は、青字で「コア・プロパティー」とラベル付けされており、次のようなINFRA表記が含まれています。
≪[
"id" → "example:123",
"verificationMethod" → ≪ ≪[
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Ed25519VerificationKey2018",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVA"
]≫ ≫,
"authentication" → ≪
"did:example:123#keys-1"
≫
]≫
下の小さい方の長方形は、青字で「コアな表現固有のエントリー(JSON-LD)」とラベル付けされており、次のような等幅のINFRA表記が含まれています。
≪[ "@context" → "https://www.w3.org/ns/did/v1" ]≫
灰色の線で囲まれた長方形から、3対の矢印が、図の下半分に横一列に並んでいる、黒い線で囲まれた3つの長方形に向かって伸びています。対の矢印はそれぞれ、灰色の線で囲まれた長方形からそれぞれの黒い線で囲まれた長方形を指し示す1つの青い矢印(「作成する」とラベル付けされている)と、その逆方向を指し示す1つの赤い矢印(「利用する」とラベル付けされている)で構成されています。最初の黒い線で囲まれた長方形は「application/did+ld+json」とラベル付けされており、次のJSON-LDデータが含まれています。
{
"@context": ["https://www.w3.org/ns/did/v1"],
"id": "did:example:123",
"verificationMethod": [{
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Ed25519VerificationKey2018",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVA"
}],
"authentication": [
"did:example:123#keys-1"
]
}
その横列の2番目の長方形は、「application/did+json」とラベル付けされており、次のJSONデータが含まれています。
{
"id": "did:example:123",
"verificationMethod": [{
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Ed25519VerificationKey2018",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVA"
}],
"authentication": [
"did:example:123#keys-1"
]
}
その横列の3番目の長方形は、「application/did+cbor」ととラベル付けされており、16進数のデータが含まれています。
図の左部分の中央には、黒い線で囲まれ、背景が薄い灰色のボックスがあります。このボックスは、「VERIFIABLE DATA REGISTRY」とラベル付けされており、ノードとアークを持つグラフを表すシンボルが含まれています。このボックスから、「resolve()」とラベル付けされた1つの矢印が上に向かって伸びており、灰色の線で囲まれた長方形が配置されている図の上半分を指し示しています。「resolveRepresentation()」とラベル付けされたもう1つの矢印が下に向かって伸びており、黒い線で囲まれた3つの長方形の列が配置されている図の下半分を指し示しています。
resolve
関数とresolveRepresentation
関数の入力変数は次のとおりです。
これらの関数はそれぞれ複数の値を返し、これらの値をまとめて返す方法に制限はありません。resolve
の返り値は、didResolutionMetadata、didDocumentおよびdidDocumentMetadataです。resolveRepresentation
の返り値は、didResolutionMetadata、didDocumentStreamおよびdidDocumentMetadataです。これらの値について以下で説明します。
resolve
関数の呼び出しとresolveRepresentation
関数の呼び出しとで変わります。この構造は必須であり(REQUIRED)、解決処理でエラーが発生した場合は、これを空にしてはなりません(MUST NOT)。このメタデータは、7.1.2 DID解決メタデータで定義しています。resolveRepresentation
が呼び出された場合、この構造には、didDocumentStream
で見つかった表現のメディア・タイプが含まれているcontentType
プロパティーが含まれていなければなりません(MUST)。解決が成功しなかった場合、この構造には、エラーについて記述したerror
プロパティーを含まなければなりません(MUST)。resolve
関数が呼び出された場合、これは、表現で指定されているプロダクション規則を用いて、適合DIDドキュメント(表現)に変換できる、4. データ・モデルで説明しているDIDドキュメントの抽象データ・モデル(マップ)でなければなりません(MUST)。解決されたDIDドキュメントのid
の値は、解決されたDIDと一致しなければなりません(MUST)。解決が成功しなかった場合、この値は空でなければなりません(MUST)。resolveRepresentation
関数が呼び出された場合、これは、適合する表現の1つにおける解決されたDIDドキュメントのバイト・ストリームでなければなりません(MUST)。次にこのバイト・ストリームは、resolveRepresentation
関数の呼び出し元で解析されてデータ・モデルとなり、検証や処理が可能となります。解決が成功しなかった場合、この値は空のストリームでなければなりません(MUST)。didDocument
プロパティーに含まれるDIDドキュメントに関するメタデータが含まれます。このメタデータは、DIDドキュメントに関するメタデータを表しているため、DIDドキュメントが変更されない限り、通常はresolve
関数の呼び出しとresolveRepresentation
関数の呼び出しとで変わりません。解決が成功しなかった場合、この出力は空のメタデータ構造でなければなりません(MUST)。この仕様で定義しているプロパティーは、7.1.3 DIDドキュメント・メタデータにあります。適合DIDリゾルバの実装は、これらの関数の署名をいかなる形でも変更しません。DIDリゾルバの実装では、実際のDID解決処理を行うために、resolve
とresolveRepresentation
の関数をメソッド固有の内部関数にマッピングする場合があります。DIDリゾルバの実装は、ここで規定しているresolve
とresolveRepresentation
の関数に加えて、様々なシグネチャを持つ追加の関数を実装して公開する場合があります。
この構造内で使用可能なプロパティーとその可能な値は、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録されています。この仕様では、次の共通プロパティーを定義しています。
didDocumentStream
に含まれている表現がサポートされていて利用可能であれば、この値を用いてその表現を判断すべきです(SHOULD)。このプロパティーは、resolveRepresentation
関数ではオプションであり(OPTIONAL)、resolve
関数では用いてはなりません(MUST NOT)。この構造内で使用可能なプロパティーとその可能な値は、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録されています。この仕様では、次のDID解決メタデータ・プロパティーを定義しています。
didDocumentStream
のMedia Typeです。このプロパティーは、解決が成功し、resolveRepresentation
関数が呼び出された場合には、必須です(REQUIRED)。resolve
関数が呼び出された場合、このプロパティーは存在してはなりません(MUST NOT)。このプロパティーの値は、適合する表現のメディア・タイプであるASCII文字列でなければなりません(MUST)。resolveRepresentation
関数の呼び出し元は、この関数が返すdidDocumentStream
をどのように解析してデータ・モデルへと処理するかを決定する際に、この値を用いなければなりません(MUST)。accept
入力メタデータ・プロパティーを介して要求された表現が、DIDメソッドおよび/またはDIDリゾルバの実装でサポートされていない場合に返されます。この構造内で使用可能なプロパティーとその可能な値は、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。この仕様では、次の共通プロパティーを定義しています。
created
プロパティーを含めるべきです(SHOULD)。このプロパティーの値は、UTC 00:00:00に正規化され、小数点以下の精度が1秒未満のXML日時としてフォーマットされた文字列でなければなりません(MUST)。例えば、2020-12-20T19:17:47Z
。updated
プロパティーを含むべきです(SHOULD)。このプロパティーの値は、created
プロパティーと同じフォーマット規則に従わなければなりません(MUST)。DIDドキュメントで一度もUpdate操作が行われていなければ、updated
プロパティーは省略されます。updated
プロパティーが存在する場合、2つのタイムスタンプの差が1秒未満であれば、created
プロパティーと同じ値になりえます。true
にしてこのプロパティーを含めなければならなりません(MUST)。DIDが無効化されていなければ、このプロパティーはオプションですが(OPTIONAL)、含まれている場合は、ブール値をfalse
にしなければなりません(MUST)。nextUpdate
プロパティーを含めることができます(MAY)。これは、次のUpdate操作のタイムスタンプを示します。このプロパティーの値は、created
プロパティーと同じフォーマット規則に従わなければなりません(MUST)。versionId
プロパティーを含めるべきです(SHOULD)。このプロパティーの値は、ASCII文字列でなければなりません(MUST)。nextVersionId
プロパティーを含めることができます(MAY)。これは、次のUpdate操作のバージョンを示します。プロパティーの値は、ASCII文字列でなければなりません(MUST)。DIDメソッドは、論理的に同等な様々な形式のDIDを定義することができます。1つの例として、DIDが検証可能なデータ・レジストリに登録する前に1つの形式を取り、その登録後に別の形式を取る場合が挙げられます。この場合、DIDメソッド仕様では、解決されたDIDと論理的に同等な1つ以上のDIDをDIDドキュメントのプロパティーとして表す必要がありえます。これが、equivalentId
プロパティーの目的です。
DIDドキュメントのメタデータにはequivalentId
プロパティーを含めることができます(MAY)。存在する場合、その値は、個々の項目が3.1 DID構文の項の規則に準拠した文字列である集合でなければなりません(MUST)。この関係は、個々のequivalentId
の値がid
プロパティーの値と論理的に同等であるため、同じDIDサブジェクトを参照しているというステートメントです。個々のequivalentId
というDIDの値は、id
プロパティーの値と同じDIDメソッドによって生成され、その形式でなければなりません(MUST)。(例: did:example:abc
== did:example:ABC
)
適合DIDメソッド仕様は、個々のequivalentId
の値がid
プロパティーの値と論理的に同等であることを保証しなければなりません(MUST)。
要求側は、id
とequivalentId
のプロパティーの値を保持し、それらに含まれる値とのその後のインタラクションが論理的に同等なものとして正しく処理されることを保証することが期待されます(例えば、データベース内のすべてのバリアントを保持し、どのバリアントとのインタラクションも同じ基礎となるアカウントにマッピングされるようにするなど)。
equivalentId
は、管理しているDIDメソッドによって同等性が保証されなければならないため(MUST)、alsoKnownAs
よりもはるかに強い同等性の形式です。同じDIDドキュメントにequivalentId
のDIDとid
プロパティーのDIDの両方が記述されるため、equivalentId
は、完全なグラフ統合を表します。
要求側が、id
とequivalentId
のプロパティーの値を保持せず、それらに含まれる値とのその後のインタラクションが論理的に同等なものとして正しく処理されることを保証する場合、良くないまたは予期しない問題が発生する可能性があります。実装者は、このメタデータ・プロパティーに関連する指示を遵守することを強くお勧めします。
canonicalId
プロパティーは、a) 集合ではなく1つの値に関連付けられていること、b) DIDが、含んでいるDIDドキュメントの範囲内のDIDサブジェクトに対する正規IDであると定義されていることを除いて、equivalentId
プロパティーと同じです。
DIDドキュメントのメタデータにはcanonicalId
プロパティーを含めることができます(MAY)。存在する場合、その値は、3.1 DID構文の項の規則に準拠した文字列でなければなりません(MUST)。この関係は、canonicalId
の値がid
プロパティーの値と論理的に同等であり、そのcanonicalId
の値は含んでいるDIDドキュメントの範囲内のDIDサブジェクトに対する正規IDであると、DIDメソッドによって定義されているというステートメントです。canonicalId
の値は、id
プロパティーの値と同じDIDメソッドによって生成され、その形式でなければなりません(MUST)。(例: did:example:abc
== did:example:ABC
)。
適合DIDメソッド仕様は、canonicalId
の値がid
プロパティーの値と論理的に同等であることを保証しなければなりません(MUST)。
要求側は、canonicalId
の値をDIDサブジェクトに対する一次的なIDの値として用い、他のすべての同等の値を二次的なエイリアスとして扱うことが期待されます(例えば、新しい正規IDの指示を反映させるために、システム内の対応する一次参照を更新するなど)。
canonicalId
は、DIDドキュメントの範囲内のDIDサブジェクトに対して正規であると定義されている1つの値に制約されていることを除いて、equivalentId
と同じ同等性のステートメントです。equivalentId
と同様に、同じDIDドキュメントにcanonicalId
のDIDとid
プロパティーのDIDの両方が記述されるため、canonicalId
は、完全なグラフ統合を表します。
解決側が、canonicalId
の値をDIDサブジェクトに対する一次的なIDの値として用いず、他のすべての同等の値を二次的なエイリアスとして扱う場合、ユーザ・エクスペリエンスに関して、良くないまたは予期しない問題が発生する可能性があります。実装者は、このメタデータ・プロパティーに関連する指示を遵守することを強くお勧めします。
DID URL逆参照関数は、DID URLを、DIDメソッド、メソッド固有の識別子、パス、クエリ、フラグメントを含む、DID URLの構成要素に応じた内容を持つ資源に逆参照します。この処理は、DID URLに含まれているDIDのDID解決に依存します。DID URL逆参照には複数のステップが含まれる場合があり(例えば、逆参照されるDID URLにフラグメントが含まれている場合)、その関数はすべてのステップが完了した後に最終的な資源を返すように定義されています。この処理がどのように達成されるかの詳細は、この仕様の範囲外です。次の図は、上記の関係を表しています。
図の左上には、「DID」とラベル付けされた黒い線で囲まれた長方形が含まれています。
図の左下には、「DID URL」とラベル付けされた黒い線で囲まれた長方形が含まれています。この長方形には、4つの小さな黒い線で囲まれた長方形が横一列に互いに隣接して並んでいます。これらの小さな長方形は、順に「DID」、「パス」、「クエリ」、「フラグメント」とラベル付けされています。
図の右上には、「DIDドキュメント」とラベル付けされた黒い線で囲まれた長方形が含まれています。この長方形には、黒い線で囲まれた小さな3つの長方形が含まれています。これらの小さな長方形は、「id」、「(プロパティーX)」、「(プロパティーY)」とラベルが付けされており、複数の一連の三点リーダ(省略記号)で囲まれています。「DIDドキュメント - 相対フラグメント逆参照」とラベル付けされた黒い曲線の矢印が、「(プロパティーX)」とラベル付けされた長方形から伸び、「(property Y)」と書かれた長方形を指し示しています。
図の右下部分には、「資源」とラベル付けされた黒い線で囲まれた楕円形が含まれています。
「DIDドキュメントに解決する」とラベル付けされた黒い矢印は、図の左上部分にある「DID」とラベル付けされた長方形から伸び、図の右上にある「DIDドキュメント」とラベル付けされた長方形を指し示しています。
「~を参照」とラベル付けされた黒い矢印は、図の右上部分にある「DIDドキュメント」とラベル付けされた長方形から伸び、図の右下部分にある「資源」とラベル付けされた楕円形を指し示しています。
「~を含む」とラベル付けされた黒い矢印は、図の左下部分にある「DID URL」とラベル付けされた長方形の中の「DID」とラベル付けされた小さな長方形から伸び、図の左上部分にある「DID」とラベル付けされた長方形を指し示しています。
「DIDドキュメントに逆参照する」とラベル付けされた黒い矢印は、「DID URL」とラベル付けされた図の左下部分にある長方形から伸び、「DIDドキュメント」とラベル付けされた図の右上部分にある長方形を指し示しています。
「資源に逆参照する」とラベル付けされた黒い矢印は、「DID URL」とラベル付けされた図の左下部分にある長方形から伸び、「資源」とラベル付けされた図の右下部分にある楕円形を指し示しています。
すべての適合DIDリゾルバは、次の抽象的な形式を持つ関数を実装します。
dereference(didUrl, dereferenceOptions) →
≪ dereferencingMetadata, contentStream, contentMetadata ≫
dereference
関数の入力変数は次のとおりです。
任意のdidUrl
をDID URLデリファレンサに渡すことは有効ですが、実装者は、[DID-RESOLUTION]を参照して、DID URLがどのようにして逆参照されるかについての一般的なパターンをさらに理解することが期待されます。
didUrl
自体に加えて、dereference
関数への入力オプションで構成されるメタデータ構造。この仕様で定義しているプロパティーは、7.2.1 DID URL逆参照オプションにあります。この入力は必須ですが(REQUIRED)、構造は空にすることもできます(MAY)。この関数は複数の値を返し、それらの値をまとめて返す方法に制限はありません。dereference
の返り値には、dereferencingMetadata
、contentStream
、contentMetadata
が含まれます。
error
プロパティーを含まなければなりません(MUST)。dereferencing
関数が呼び出されて成功した場合、これには、DID URLに対応する資源を含まなければなりません(MUST)。contentStream
は、適合する表現の1つでシリアル化可能なDIDドキュメント、検証メソッド、サービスまたはメディア・タイプを介して識別し、解決処理を通じて取得できるその他の資源形式などの資源にすることもできます(MAY)。逆参照が成功しなかった場合、この値は空でなければなりません(MUST)。contentStream
に関するメタデータが含まれます。contentStream
がDIDドキュメントであれば、これはDID解決で説明しているように、didDocumentMetadata構造でなければなりません(MUST)。逆参照が成功しなかった場合、この出力は空のメタデータ構造でなければなりません(MUST)。適合DID URL逆参照の実装は、これらの関数のシグネチャをいかなる形でも変更しません。DID URL逆参照の実装では、実際のDID URL逆参照処理を行うために、dereference
関数をメソッド固有の内部関数にマッピングする場合があります。DID URL逆参照の実装は、ここで規定しているdereference
関数に加えて、様々なシグネチャを持つ追加の関数を実装して公開する場合があります。
この構造内で使用可能なプロパティーとその可能な値は、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。この仕様では、次の逆参照オプションの共通プロパティーを定義しています。
contentStream
のメディア・タイプ。このメディア・タイプは、ASCII文字列で表さなければなりません(MUST)。DID URL逆参照の実装は、返された値に含まれている表現のcontentType
を、そのような表現がサポートされていて利用可能であれば、この値を用いて判断すべきです(SHOULD)。この構造内で使用可能なプロパティーとその可能な値は、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録されています。この仕様では、次の共通プロパティーを定義しています。
contentStream
のメディア・タイプは、このプロパティーを用いて表すべきです(SHOULD)。メディア・タイプの値は、ASCII文字列で表さなければなりません(MUST)。contentStream
を見つけることができませんでした。入力と出力のメタデータは、DID解決、DID URL逆参照およびその他のDID関連の処理中にしばしば関係します。このメタデータの通信に用いる構造は、プロパティーのマップでなければなりません(MUST)。個々のプロパティー名は、文字列でなければなりません(MUST)。個々のプロパティーの値は、文字列、マップ、リスト、集合、ブールまたはヌル(null)でなければなりません(MUST)。マップやリストなどの複雑なデータ構造内の値も、これらのデータ型の1つでなければなりません(MUST)。DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録されているすべてのメタデータ・プロパティーの定義では、値に対する追加の形式や制限(例えば、文字列の形式を日付や10進数の整数として設定するなど)を含む、値の型を定義しなければなりません(MUST)。プロパティーの定義では、文字列を値として用いることが推奨されます(RECOMMENDED)。メタデータ構造全体は、[INFRA]仕様のJSONシリアル化規則に従ってシリアル化できなければなりません(MUST)。実装では、メタデータ構造を他のデータ形式にシリアル化することができます(MAY)。
入力または出力としてメタデータ構造を用いる関数の実装はすべて、ここで説明しているすべてのデータ型を確定的な方法で完全に表すことができます。メタデータ構造を用いる入力と出力は、シリアル化ではなくデータ型の観点から定義されるため、表現のためのメソッドは関数の実装の内部であり、この仕様の範囲外です。
次の例は、DID解決の入力メタデータとして用いられる可能性のある、JSONエンコードされたメタデータ構造を示しています。
{
"accept": "application/did+ld+json"
}
この例は、次の形式のメタデータ構造に対応しています。
≪[
"accept" → "application/did+ld+json"
]≫
次の例は、DIDが見つからなかった場合にDID解決メタデータとして用いられる可能性のある、JSONエンコードされたメタデータ構造を示しています。
{
"error": "notFound"
}
この例は、次の形式のメタデータ構造に対応しています。
≪[
"error" → "notFound"
]≫
次の例は、DIDドキュメントに関連付けられているタイムスタンプを記述するために、DIDドキュメントのメタデータとして用いられる可能性のある、JSONエンコードされたメタデータ構造を示しています。
{
"created": "2019-03-23T06:35:22Z",
"updated": "2023-08-10T13:40:06Z"
}
この例は、次の形式のメタデータ構造に対応しています。
≪[
"created" → "2019-03-23T06:35:22Z",
"updated" → "2023-08-10T13:40:06Z"
]≫
DIDメソッドは、実装者がこの仕様で記述している機能を実現する方法を定義します。DIDメソッドは、多くの場合、特定の検証可能なデータ・レジストリに関連付けられています。新しいDIDメソッドは、同じDIDメソッドの様々な実装間の相互運用を可能とするために、独自の仕様で定義されます。
概念的には、この仕様とDIDメソッド仕様との関係は、IETF汎用URI仕様[RFC3986]と、http
スキーム[RFC7230]などの特定のURIスキーム[IANA-URI-SCHEMES]との関係に似ています。DIDメソッド仕様は、特定のDIDスキームの定義に加えて、特定の種類の検証可能なデータ・レジストリを用いてDIDとDIDドキュメントを作成、解決、更新、無効化するためのメカニズムも定義します。また、DIDに関連するすべての実装上の留意点や、セキュリティおよびプライバシーに関する留意点もドキュメント化します。
この項では、DIDメソッド仕様を記述するための要件を規定します。
メソッド固有のDID構文を定義する際の、すべてのDIDメソッド仕様の要件は次のとおりです。
method-name
規則で規定している、きっかり1つのメソッド名で識別される、きっかり1つのメソッド固有のDIDスキームを定義しなければなりません(MUST)。method-specific-id
構成要素の生成方法を規定しなければなりません(MUST)。method-specific-id
の値の大文字・小文字の区別(sensitivity)と正規化を定義しなければなりません(MUST)。method-specific-id
の値は、DIDメソッド内で一意でなければなりません(MUST)。method-specific-id
の値自体は、グローバルに一意でありえます。method-name
が衝突する可能性を削減するために、DIDメソッド仕様は、DID仕様レジストリ[DID-SPEC-REGISTRIES]に登録すべきです(SHOULD)。method-specific-id
の形式を定義できます(MAY)。method-specific-id
の形式にはコロンを含めることができます(MAY)。コロンの使用は、構文的にmethod-specific-id
のABNF規則に準拠しなければなりません(MUST)。method-specific-id
におけるコロンの意味は、完全にメソッド固有です。コロンは、階層的に分割された名前空間を確立するため、検証可能なデータ・レジストリの特定のインスタンスまたは部分を識別するため、またはその他の目的のために、DIDメソッドが用いる可能性があります。実装者は、すべてのDIDメソッドに一般的に該当する、コロンに関連付けられた意味や動作を想定しないようにすることお勧めします。
メソッドの操作を定義する際の、すべてのDIDメソッド仕様の要件は次のとおりです。
操作を実行するために認証を行う関係者の権限は、DIDメソッドに固有です。例えば、DIDメソッドは、次を行う場合があります。
controller
プロパティーを利用する。authentication
下に記載されている検証メソッドを用いる。capabilityInvocation
の検証関係で指定されている検証メソッドなど、DIDドキュメント内の他の構成要素を用いる。セキュリティに関する留意点の項を記述する際の、すべてのDIDメソッド仕様の要件は次のとおりです。
プライバシーに関する留意点の項を記述する際の、すべてのDIDメソッド仕様の要件は次のとおりです。
この項は非規範的です。
この項には、分散型識別子を用いる人が、実稼働環境でこの技術を展開する前に考慮することをお勧めする、様々なセキュリティに関する留意点が含まれています。DIDは、多くのIETF標準規格で用いられ、[RFC3552]でドキュメント化されている脅威モデルの下で動作するように設計されています。この項では、[RFC3552]の多数の留意点と、DIDアーキテクチャに固有のその他の留意点について詳しく説明します。
DID仕様レジストリ[DID-SPEC-REGISTRIES]には、DIDメソッド名とそれに対応するDIDメソッド仕様の参考となるリストが含まれています。実装者は、特定のDIDメソッド名でどのDIDメソッド仕様を用いるかを義務づける中央機関が存在しないことを念頭に置く必要があります。特定のDIDリゾルバがDIDメソッドを正しく実装しているかどうかに疑問がある場合、DID仕様レジストリを用いて登録済みの仕様を調べ、どのDIDリゾルバの実装を用いるべきかについて十分な情報を得た上で決定することができます。
デジタルの世界または物理的な世界のエンティティーをDID、DIDドキュメントまたは暗号材料にバインディングするには、この仕様書で検討しているセキュリティ・プロトコルを用いる必要があります。以下の項では、いくつかの考えられるシナリオと、その中のエンティティーが認証または承認を目的としてDIDまたはDIDドキュメントに対する管理を証明する方法について説明します。
DIDおよび/またはDIDドキュメントに対する管理を証明することは、検証可能なデータ・レジストリでの更新時または遠隔システムでの認証時のいずれかで有用です。暗号デジタル署名と検証可能なタイムスタンプにより、DIDドキュメントに関連する特定のセキュリティ・プロトコルを暗号で検証することができます。これらの目的のために、この仕様では、5.3.1 認証と5.3.4 機能の呼び出しで、有用な検証関係を定義しています。検証メソッドに関連付けられている秘密の暗号材料を用いて、認証または承認のセキュリティ・プロトコルの一部として、暗号デジタル署名を生成することができます。
DIDとDIDドキュメントには本来、個人データが含まれず、公的ではないエンティティーは、DIDドキュメントで個人データを公開しないことを強く推奨します。
政府などの信頼できる機関が証明可能な言明を行うような方法で、人または組織の物理IDへのDIDのバインディングを表すことは有用でありえます。この仕様では、この目的のために5.3.2 言明の検証関係を提供しています。この機能により、プライベートなインタラクションが可能になり、1つ以上の法域下で法的強制力があるとみなすことができます。このようなバインディングを確立するには、プライバシーに関する留意点と慎重にバランスを取らなければなりません(10. プライバシーに関する留意点を参照)。
DIDを人や組織などの物理的な世界の事物にバインディングする処理は(例えば、そのDIDと同じサブジェクトを持つ検証可能な資格証明を用いて)、この仕様で検討しており、検証可能な資格証明データ・モデル[VC-DATA-MODEL]でさらに定義されています。
DIDドキュメントが、DIDサブジェクトの認証や承認を目的としたサービスを公開する場合に(5.4 サービスの項を参照)、そのサービス・エンドポイントでサポートされる認証プロトコルの要件に準拠する責任は、サービス・エンドポイントの提供者、サブジェクトまたは要求側にあります。
DIDとDIDドキュメントの更新の否認防止は、次の場合にサポートされます。
DIDドキュメントに対する不正な変更に対する1つの軽減策は、DIDサブジェクトを監視し、変更があった場合に積極的に通知することです。これは、登録済みの電子メール・アドレスにパスワードのリセット通知を送信することで、従来のユーザ名/パスワードのアカウントの乗っ取りを防止するのに似ています。
DIDの場合、そのような通知を生成する中間登録機関やアカウントの提供者は存在しません。しかし、DIDが登録されている検証可能なデータ・レジストリが変更通知を直接サポートしている場合は、サブスクリプション・サービスをDIDコントローラに提供することができます。通知は、既存のDIDに記載されている関連するサービス・エンドポイントに直接送信することができます。
DIDコントローラが(検証可能なデータ・レジストリ自体以外の)第三者監視サービスに依存することを選択した場合、別の攻撃進路が導入されることになります。
分散型識別子のアーキテクチャでは、暗号材料や暗号デジタル署名の有効期限ポリシーを実施する中央機関が存在しない可能性があります。したがって、要求側は、DIDリゾルバや検証ライブラリなどの支援ソフトウェアを用いて、暗号材料が使用時に有効期限切れでなかったことを検証します。要求側は、検証処理への入力に加えて、独自の有効期限ポリシーを採用する場合があります。例えば、要求側によって、5分前までの認証を受け入れる場合もあれば、高精度の時間資源にアクセスできる要求側が、最新の500ミリ秒以内のタイムスタンプ付き認証を求める場合もあります。
要求側が、従来の暗号デジタル署名の検証など、既に有効期限切れとなった暗号材料の使用を延長する正当なニーズを持っている場合もあります。このような状況では、要求側は、検証ソフトウェアに、暗号キー材料の有効期限切れを無視するか、使用した時に暗号キー材料が有効期限切れだったかどうかを判断するように指示することができます。
ローテーションとは、DIDドキュメントに新しい検証メソッドが追加されたときに、既存の検証メソッドに関連づけられている秘密の暗号材料を無効化または廃止できるようにする管理処理です。以後、コントローラが古い秘密の暗号材料を用いて生成した新しい証明は、代わりに新しい暗号材料を用いて生成し、新しい検証メソッドを用いて検証できるようになります。
コントローラが検証メソッドを頻繁にローテーションすることで、侵害された1つの検証メソッドの攻撃者にとっての価値を下げることができるため、ローテーションは、検証メソッドの侵害を防ぐための有効なメカニズムです。ローテーションの直後に失効を行うことは、メッセージの暗号化や認証に関するものなど、コントローラが短期間の検証用に指定する検証メソッドに有効です。
検証メソッドのローテーショの使用を検討する際には、次の留意点が役立つ可能性があります。
失効とは、既存の検証メソッドに関連付けられている秘密の暗号材料を無効化し、デジタル署名の新しい証明を作成するための有効な形式ではなくなるようにする管理処理です。
失効は、検証メソッドの侵害に対応するために有用なメカニズムです。ローテーションの直後に失効を行うことは、メッセージの暗号化や認証に関わるものなど、コントローラが短期間の検証用に指定する検証メソッドに有用です。
検証メソッドに関連付けられている秘密が侵害されると、攻撃者は、コントローラがDIDドキュメントで表している検証関係に従って、例えば、認証のためにそれを使用できます。攻撃者による秘密の使用は、検証メソッドが登録されてから失効となる時点までの、正当なコントローラの使用と区別できない可能性があります。
検証メソッドの失効の使用を検討する際には、次の留意点が役立つ可能性があります。
検証者は、失効した検証メソッドからの証明や署名を受け入れないことを選択するかもしれませんが、失効した検証メソッドで検証が行われたかどうかを知ることは、思ったより難しいです。一部のDIDメソッドは、ある時点でのDIDの状態またはDIDドキュメントの特定のバージョンを振り返る機能を提供します。このような機能と、暗号で検証可能なステートメントが作成されたときに存在していた時間やDIDのバージョンを判断する信頼できる方法とが組み合わされた場合、失効によってそのステートメントが取り消されることはありません。これは、例えば、住宅ローンに署名するなど、DIDを用いて拘束力のあるコミットメントを行うための基礎となりえます。
これらの条件が満たされていれば、失効は遡及されず、メソッドの将来の使用が無効になるだけです。
しかし、そのようなセマンティクスが安全であるためには、2つ目の条件である、言明が行われた時点のDIDドキュメントの状態を知る機能が適用されることが期待されます。その保証がなければ、失効したキーを誰かが発見し、それを用いて過去の日付を装って、暗号で検証可能なステートメントを作成することができます。
一部のDIDメソッドでは、DIDの現在の状態のみを検索できます。これが当てはまる場合または暗号で検証可能なステートメントの時点のDIDの状態を確実には判断できない場合、唯一の安全な方法は、現時点を除いて、時間に関するDIDの状態を考慮しないことです。このアプローチを採用するDIDのエコシステムは、基本的に、暗号で検証可能なステートメントを、DIDコントローラがいつでも無効にできる一時的なトークンとして提供します。
トラストレス・システムとは、すべての信頼が暗号で証明可能な言明から得られるシステムで、より具体的には、そのシステム内の信頼性の判断において、暗号システムの外部にあるメタデータを考慮に入れないシステムです。トラストレス・システムで失効となった検証メソッドの証明の署名を検証するためには、DIDメソッドは、versionId
かversionTime
の一方または両方およびupdated
とnextUpdate
の両方のDIDドキュメントのメタデータ・プロパティーをサポートする必要があります。検証者は、次のすべてを満たす場合に限り、失効したキーの署名や証明を検証することができます。
versionId
またはversionTime
が含まれます。updated
タイムスタンプは、署名や証明が作成された時点の前であり、nextUpdate
タイムスタンプはその時点の後です。暗号の入力となるメタデータ以外のメタデータを積極的に受け入れるシステムでは、同様の信頼を達成できるかもしれませんが、常に同じ基準で、署名イベントの時点でDIDドキュメントの内容に期待されるコンテンツが含まれていたかどうかについて慎重な判断が行われます。
リカバリーとは、デバイスの紛失などによりDIDの操作を行う機能を失ったコントローラが、DIDの操作を行う機能を回復するための事後対応的なセキュリティ対策です。
DIDリカバリーの使用を検討する際には、次の留意点が役立つ可能性があります。
DIDは、中央登録機関を必要とせずに、グローバルな一意性を実現します。これは、人間の記憶力を犠牲にしてもたらされます。グローバルに明確な識別子を生成できるアルゴリズムは、人間にとっては意味のないランダムな文字列を生成します。このトレードオフの関係はしばしば、Zookoの三角形と呼ばれます。
人間に分かりやすい識別子から始める場合に、DIDを発見することが望ましいユースケースがあります。例えば、携帯電話番号、電子メール・アドレス、ソーシャル・メディアのユーザ名、ブログのURLなどの、自然言語の名称、ドメイン名またはDIDコントローラの従来のアドレスが挙げられます。しかし、人間に分かりやすい識別子をDIDにマッピングすると同時に、それを検証かつ信頼可能な方法で行うという問題は、この仕様の範囲外です。
この問題に対する解決策は、この仕様を参照する[DNS-DID]などの別の仕様で定義されています。そのような仕様では、次の点を慎重に検討することを強く推奨します。
DIDコントローラが必要とする場合、DIDまたはDID URLは、永続的な、ロケーションに依存しない資源識別子として機能することができます。この種の識別子は、URN(Uniform Resource Names)として分類されており、[RFC8141]で定義されています。DIDはURNの拡張形式であり、デジタル資源に対して、暗号によって安全で、ロケーションに依存しない識別子を提供すると同時に、検索を可能にするメタデータも提供します。DIDドキュメントとDID自体の間には間接性があるため、DIDコントローラは、DIDを調整することなく、資源の実際のロケーションを調整したり、資源を直接提供したりすることさえできます。この種のDIDは、検索された資源が、実際に識別された資源であることを明確に検証することができます。
この目的でDIDを使用しようとするDIDコントローラは、特に、次の点について、[RFC8141]のセキュリティに関する留意点に従うことをお勧めします。
サイバー・セキュリティの悪用の多くは、現実と、合理的で誠実な当事者の想定との間のギャップを利用することに依存しています。DIDドキュメントの不変性により、セキュリティ上の利点が得られます。個々のDIDメソッドは、不要な動作やセマンティクスを排除するような制約を検討すべきです。DIDメソッドがロックダウン(locked down)されていればいるほど、一連の同じ機能を提供しながらも、悪意のある当事者に操作される可能性は低くなります。
例として、DIDドキュメントを1回編集すれば、ドキュメントのルートid
プロパティー以外のすべてを変更できると考えてみましょう。しかし、サービスが定義された後にそのtype
を変更することは、実際に望ましいのでしょうか?あるいは、キーの値を変更することは望ましいでしょうか?それとも、オブジェクトの特定の基本的なプロパティーが変更されたときに、新しいid
を要求する方がよいのでしょうか?ウェブサイトの悪意のある乗っ取りでは、サイトのホスト名の識別子はそのままにして、その下の部分を微妙に変更させるという結果を狙うことがよくあります。IPアドレスに関連付けられているASNのように、サイトの特定のプロパティーが不変であることを仕様で必須とすれば、異常の検知はより容易になり、攻撃の実行ははるかに困難で費用がかかるでしょう。
グローバルな信頼できる情報源に結びつけられているDIDメソッドの場合、最新バージョンのDIDドキュメントを直接、ジャスト・イン・タイムで検索することは常に可能です。しかし、DIDリゾルバとその信頼できる情報源の間には、いずれはキャッシュの層が置かれる可能性が高いと考えられます。その場合、DIDドキュメント内のオブジェクトの属性が、実際には微妙に異なっているにもかかわらず、特定の状態であると信じてしまうと、悪用される可能性があります。これは特に、検索が、完全なDIDドキュメントを対象とすることもあれば、より大きなコンテキストが想定される部分的なデータを対象とすることもある場合に当てはまります。
暗号化アルゴリズムは、暗号技術や計算能力の進歩により、機能しなくなることが知られています。実装者は、DIDドキュメントに置かれた暗号化されたデータは、暗号化されたデータを利用できるのと同じ対象者が、最終的に平文(clear text)で利用できるようになる可能性があると想定することをお勧めします。これは、DIDドキュメントが公開されている場合に特に該当します。
DIDドキュメントの全部または一部を暗号化することは、長期的にデータを保護するための適切な手段ではありません。同様に、暗号化されたデータをDIDドキュメントに置くことは、個人データを保護するための適切な手段ではありません。
上記の注意点を踏まえ、暗号化されたデータがDIDドキュメントに含まれていれば、実装者は、暗号化されたデータと関連当事者との関係を推測するために用いられる可能性のある相関付け可能な情報を関連付けないことをお勧めします。相関付け可能な情報の例には、受信側の公開キー、受信側の管理下にあることが知られているデジタル資産の識別子、受信側に関する人間が読める記述などがあります。
equivalentId
とcanonicalId
のプロパティーが、DIDメソッド自体によって生成されると仮定した場合、DIDドキュメントのid
フィールドに存在する解決済みのDIDに適用されるのと同じセキュリティと正確性の保証がこれらのプロパティーにも適用されます。alsoKnownAs
プロパティーは、同等性の正確なステートメントであることが保証されておらず、DIDドキュメントの解決を超える検証ステップを実行せずに依存すべきではありません。
equivalentId
とcanonicalId
のプロパティーは、同じDIDメソッドによって生成される1つのDIDのバリエーションに対する同等性の言明を表し、要求側がDIDメソッドと、適合するプロデューサとリゾルバを信頼している範囲で信頼することができます。
alsoKnownAs
プロパティーでは、同じDIDメソッドによって管理されていないURIへの同等性の言明が認められており、管理しているDIDメソッドの外部で検証ステップを実行しなければ信頼できません。5.1.3 別名の追加ガイダンスを参照してください。
DIDドキュメント内の他のセキュリティ関連のプロパティーと同様に、DIDドキュメント内の同等性ステートメントに依存している関係者は、適切な検証の実行後に攻撃者によってこれらのプロパティーの値が置き換えられないように保護すべきです。検証を実行した後にメモリやディスクに保存されたDIDドキュメントへの書き込みアクセスは、DIDドキュメントを再検証しない限り、検証を逃れる可能性のある攻撃ベクトルです。
画像、ウェブページ、スキーマなど、外部の機械可読コンテンツへのリンクが含まれているDIDドキュメントは、改ざんに対して脆弱です。外部リンクは、ハッシュリンク[HASHLINK]などのソリューションを用いて完全性を保護することを強くお勧めします。完全性を保護できず、DIDドキュメントの完全性を外部リンクに依存している場合は、外部リンクを避けるべきです。
DIDドキュメント自体の完全性が影響を受ける可能性がある外部リンクの一例は、JSON-LDコンテキスト[JSON-LD11]です。侵害を防ぐために、DIDドキュメントのコンシューマは、JSON-LDコンテキストのローカルな静的コピーをキャッシュすることおよび/または外部のJSON-LDコンテキストの安全なバージョンに関連付けられていることがわかっている暗号ハッシュに対して外部コンテキストの整合性を検証することをお勧めします。
DIDは永続的であるように設計されているため、コントローラは、信頼できる1つの第三者やアドミニストレーターに依存して識別子を維持する必要はありません。理想的なケースでは、アドミニストレーターは、コントローラから管理を奪うこともできなければ、認証、承認、構成証明などの特定の目的での識別子の使用を防ぐこともできません。第三者は、コントローラの同意なしに、コントローラに代わって、エンティティーの識別子を削除したり、操作不能にしたりすることはできません。
しかし、暗号による管理の証明を可能にするすべてのDIDメソッドでは、秘密の暗号材料を転送すれば、管理を証明する手段をいつでも別の関係者に転送可能であるということに注意することが重要です。したがって、長期にわたって識別子の永続性に依存するシステムでは、識別子が実際に意図した関係者の管理下にあることを定期的に確認することが不可欠です。
残念ながら、特定の検証メソッドに関連付けられている秘密の暗号材料が侵害されているかどうかを、暗号のみから判断することは不可能です。予期されるコントローラがまだ秘密の暗号材料にアクセスでき、そのため、検証処理の一部として管理の証明を実行できる一方で、それと同時に、悪意のある者が同じキーまたはそのコピーにアクセスできる可能性もあります。
そのため、暗号による管理の証明は、リスクの高いシナリオに必要なID保証のレベルを評価する際の1つの要素としてのみ用いられることが期待されます。DIDベースの認証は、暗号による秘密をシステム間で送信することなくその秘密の管理を決定できる機能のおかげで、ユーザ名とパスワードよりもはるかに優れた保証を提供します。しかし、それは絶対確実なわけではありません。機密性が高く、価値の高い、または命に関わる操作を伴うシナリオでは、必要に応じて追加の要素を用いることが期待されます。
様々なコントローラが利用することによる潜在的な曖昧さに加えて、一般的には、特定のDIDが、ある時点で、同じサブジェクトに関して用いられていることを保証することは不可能です。技術的には、コントローラが1つのDIDを様々なサブジェクトに再利用することは可能であり、さらに微妙なことに、サブジェクトの正確な定義が時間の経過とともに変化したり、誤解されたりする可能性があります。
例えば、個人事業主が用いる、金融取引に用いられる様々な資格証明を受信するDIDについて考えてみましょう。コントローラにとって、その識別子はその事業(business)を指していました。事業が成長するにつれ、最終的に有限責任会社として法人化されます。コントローラは、そのDIDが彼らにとって事業を指すため、同じDIDを使い続けます。しかし、国や税務署、地方自治体にとって、そのDIDは、もはや同じエンティティーを指さなくなりました。意味の微妙な変化が、クレジットの提供者やサプライヤーにとって重要かどうかは、必然的に彼らの判断に委ねられています。多くの場合、支払いが行われ、集金を実施できる限り、変化は重要ではありません。
このような潜在的な曖昧さのために、DIDは絶対的ではなく、文脈的に有効なものであると見なされます。その永続性は、それが全く同じサブジェクトを指すことや、同じコントローラの管理下にあることを意味するものではありません。むしろ、DIDが作成されたコンテキストや、その使用方法を理解し、その意味が変わる可能性を考慮し、潜在的かつ避けることのできない意味ドリフト(semantic drift)に対処するための手順とポリシーを採用する必要があります。
認証イベントのセキュリティ・コンテキストに関する追加情報は、コンプライアンス上の理由から、特に金融部門や公共部門などの規制分野で必要とされることがよくあります。この情報は、多くの場合、保証レベル(LOA;Level of Assurance)と呼ばれます。例としては、秘密の暗号材料の保護、ID証明処理、オーセンティケータのフォーム・ファクタなどがあります。
支払サービス(PSD 2)とeIDASは、このような要件をセキュリティ・コンテキストに導入しています。保証レベルのフレームワークは、eIDAS、NIST 800-63-3、ISO/IEC 29115:2013などの規則や標準によって分類・定義されています。これには、セキュリティ・コンテキストに対する要件が含まれ、その達成方法について勧告を行います。これには、FIDO2/WebAuthnが要件を満たすことができる強力なユーザ認証が含まれる場合があります。
規制シナリオの中には、特定レベルの保証の実装を必要とするものがあります。そのような状況の一部では、assertionMethod
やauthentication
などの検証関係が用いられる可能性があるため、適用されるセキュリティ・コンテキストに関する情報を表し、検証者に提供する必要があるかもしれません。この情報をDIDドキュメントのデータ・モデルでエンコードするかどうか、またどのようにエンコードするかは、この仕様の範囲外です。興味のある読者は、1)検証可能な資格証明[VC-DATA-MODEL]を用いて情報を送信できること、2)4.1 拡張性で説明しているように、DIDドキュメントのデータ・モデルを拡張してこの情報を組み込むことができること、そして、そのような拡張に対して10. プライバシーに関する留意点を適用できることを心に留めておくとよいでしょう。
この項は非規範的です。
DIDとDIDドキュメントは、DIDコントローラによって直接管理されるように設計されているため、分散型識別子アーキテクチャのすべての側面にプライバシー・バイ・デザイン[PRIVACY-BY-DESIGN]の原則を適用することが非常に重要です。この7つの原則はすべて、この仕様の開発全体に適用されています。この仕様で用いている設計では、追加のプライバシー保護を推奨または適用する登録機関、ホスティング会社、その他の中間サービス・プロバイダが存在することを前提としていません。この仕様におけるプライバシーは、改善策ではなく予防策であり、デフォルトで組み込まれています。以下の項では、分散型識別子を利用するシステムを構築する際に実装者にとって有用と思われるプライバシーに関する留意点を扱っています。
DIDメソッド仕様が、対応するDIDとDIDドキュメントが公開される可能性のある、一般向けの検証可能なデータ・レジストリ用に記述されている場合、そのDIDドキュメントに個人データが含まれていないことが極めて重要です。代わりに、個人データは、1)検証可能な資格証明[VC-DATA-MODEL]か、2)DIDサブジェクトまたはDIDコントローラの管理下にあるサービス・エンドポイントなどの他の手段で送信することができます。
サービス・エンドポイントのURL内での個人データの漏洩や相関関係を防ぐために、サービス・エンドポイントにおけるURLの使用に関して十分な注意が払われることが期待されます。例えば、ユーザ名が含まれているURLをDIDドキュメントに含めるのは危険です。なぜなら、ユーザ名は、DIDサブジェクトが共有することに同意していない情報を露呈する可能性があるという点で、人間にとって意味のあるものである可能性が高いからです。この仕様で提案しているプライバシーのアーキテクチャを用いると、DIDドキュメント内の検証メソッドによって識別され、安全性が確保された通信チャネルを用いて、個人データをプライベートなピア・ツー・ピアで交換することができます。また、不変の分散型台帳には個人データが書き込まれないため、これにより、DIDサブジェクトと要求側がGDPRの忘れられる権利を実施することもできます。
あらゆる種類のグローバルに明確な識別子と同様に、DIDは相関関係に用いられる可能性があります。DIDコントローラは、個々の関係に対して一意の対のDIDを用いることで、このプライバシーのリスクを軽減することができます。実際には、個々のDIDは仮名として機能します。対のDIDは、相関関係が明示的に望まれる場合にのみ、複数の関係者と共有する必要があります。対のDIDがデフォルトである場合、DIDを公開したり、複数の関係者と共有したりする必要があるのは、DIDコントローラおよび/またはDIDサブジェクトが公的なIDと相関関係を明示的に望んでいる場合のみです。
対応するDIDドキュメント内のデータを相関付けることができれば、対のDIDの対相関関係保護機能は、簡単に破られてしまいます。例えば、複数のDIDドキュメント内で同一の検証メソッドや特注のサービス・エンドポイントを用いると、同じDIDを用いるのと同程度の相関関係情報が得られます。したがって、対のDIDに対するDIDドキュメントでは、検証メソッドが対の関係に対して一意であることを保証するなど、対で一意の情報も用いる必要があります。
対のDIDに対するDIDドキュメントでは、対で一意のサービス・エンドポイントも用いるのが自然だと思えるかもしれません。しかし、一意のエンドポイントを用いると、2つのDID間のすべてのトラフィックを一意のバケットに完全に分離でき、時差相関や類似度解析が容易になります。したがって、エンドポイントのプライバシーのためのよりよい戦略は、多くの異なるサブジェクトが管理している多数のDID間でエンドポイントを共有することかもしれません(10.5 集団プライバシーを参照)。
DIDサブジェクトがどのような種類や性質のものであるかを明示的にまたは推論によって示すために使用できるプロパティーをDIDドキュメントに追加することは、特にDIDサブジェクトが人である場合に危険です。
このようなプロパティーは、個人データ(10.1 個人情報の保護を参照)や相関付け可能なデータ(10.2 DIDの相関関係のリスクと10.3 DIDドキュメントの相関関係のリスクを参照)が、DIDドキュメントに存在するという結果になる可能性があるだけでなく、特定の操作や機能に含まれる、または除外されるような方法で、特定のDIDをグループ化するために使用できます。
型の情報をDIDドキュメントに含めると、IoTデバイスなどの人ではないエンティティーであるDIDサブジェクトであっても、個人のプライバシーに被害が生じる可能性があります。DIDコントローラに関するこのような情報が集約されると、デジタル指紋の一形態として機能する可能性があり、避けるべきです。
これらのリスクを最小限に抑えるために、DIDドキュメントのすべてのプロパティーは、DIDの使用に関連する暗号材料、エンドポイントまたは検証メソッドを表すためのものであるべきです。
あるDIDサブジェクトが、集団の中の他のものと区別できなければ、プライバシーは確保できます。別の関係者と私的な関わりを持つ行為自体が認識可能なフラグである場合には、プライバシーは大幅に低下します。
DIDとDIDメソッドは、特に合法的にそれを最も必要としている人々のために、集団プライバシーを改善するように機能する必要があります。デフォルトで匿名性と仮名性を保持する技術やヒューマン・インターフェースを選択してください。デジタル指紋を削減するためには、要求側の実装全体で共通の設定を共有し、ワイヤー・プロトコルで交渉されたオプションを最小限にとどめ、暗号化されたトランスポート層を用い、メッセージを標準的な長さにパディングしてください。
コントローラが、DIDドキュメントで少なくとも1つのサービス・エンドポイントをオプションで表現できれば、コントローラの管理性と代理性が向上します。DIDドキュメントにエンドポイントを追加するたびに、エンドポイントの記述間などの相関関係またはサービスが承認メカニズムによって保護されていないこと、あるいはその両方により、プライバシーのリスクが高まります。
DIDドキュメントは公開されていることが多く、標準化されているため、その非常に標準に基づいた性質によって効率的に保存され、インデックス化されます。このリスクは、DIDドキュメントが不変の検証可能なデータ・レジストリに公開されている場合には、さらに悪化します。DIDによって参照されるDIDドキュメントの履歴へのアクセスは、標準を用いることでより効率的になるトラフィック分析の一形態です。
1つのDIDドキュメントで複数のサービス・エンドポイントを用いることによって生じる付加的なプライバシーのリスクの程度を見積もることは困難です。プライバシーの被害は通常、意図しない結果です。DIDは、個人、世帯、クラブ、雇用者に関連付けられている可能性のあるドキュメント、サービス、スキーマなどを参照することができ、それらのサービス・エンドポイントの相関関係は、強力な監視・推論ツールとなりえます。この潜在的な被害の例は、https://example.co.uk
などの複数の共通する国レベルのトップ・レベル・ドメインを用いて、DIDサブジェクトのおおよそのロケーションをより高い確率で推論する場合に見られます。
様々なエンドポイントが考えられるため、DIDサブジェクトに関する情報が漏洩しない集団プライバシーを維持することは特に困難です(10.5 集団プライバシーを参照)。
まず、サービス・エンドポイントは、URIで指定される可能性があるため、サービスのアーキテクチャに起因して意図せずに個人情報が漏洩する可能性があります。例えば、http://example.com/MyFirstName
というサービス・エンドポイントは、DIDドキュメントにアクセスできるすべての人に、MyFirstName
という用語を漏洩していることになります。旧式のシステムと連携する場合には、これは避けられないリスクであり、そのような場合には注意を払う必要があります。この仕様では、新しいDIDに対応したエンドポイントには、必要な識別にDID自体以外を用いないことを推奨しています。例えば、サービスの説明にhttp://example.com/did%3Aexample%3Aabc123
が含まれていても、did:example:abc123
は、既にDIDドキュメントで公開されているため、何の被害もないでしょうし、追加の情報が漏洩することもありません。
第2に、DIDドキュメントは複数のサービス・エンドポイントを列挙することができるため、他のコンテキストでは関連付けられていないサービスを不可逆的に関連付けることができます。この相関関係自体は、用いられているURIに機密情報が含まれていなくても、DIDサブジェクトに関する情報を明らかにすることで、プライバシーの被害につながる可能性があります。
第3に、DIDサブジェクトの種類によっては、多かれ少なかれ、特定のエンドポイントを列挙する可能性が高いため、特定サービスの列挙自体が、DIDサブジェクトについて何らかの推測を行うのに使用できる情報を漏洩する可能性があります。例えば、自動車のDIDには、車両管理局(Department of Motor Vehicles)の公開された所有権記録への指示子が含まれている場合がありますが、個人のDIDにはそのような情報は含まれないでしょう。
集団プライバシーの目標は、特定のDIDサブジェクトの性質が、集団全体によって隠匿されるようにすることです。集団プライバシーを最大限に高めるために、実装者は、1つ(1つだけ)のサービス・エンドポイントに依存する必要があり、そのエンドポイントで、コントローラが依存したいと思うプロキシまたはメディエータのサービスを提供することで、そのような関連性を保護し、最終的なサービスへの要求を見えなくします。
前項の留意点を考慮して、実装者は次のサービス・エンドポイントのアプローチのいずれかを検討することをお勧めします。
これらのサービス・エンドポイントの種類は、今後も革新と探求が必要な分野です。
この項は非規範的です。
オプションの拡張機能やその他の検証メソッドの型については、検証メソッドの型[DID-SPEC-REGISTRIES]を参照してください。
これらの例は、情報提供のみを目的としており、同じ検証メソッドを複数の目的に用いることは避けるのがベスト・プラクティスであると考えられています。
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2020/v1"
],
"id": "did:example:123",
"authentication": [
{
"id": "did:example:123#z6MkecaLyHuYWkayBDLw5ihndj3T1m6zKTGqau3A51G7RBf3",
"type": "Ed25519VerificationKey2020", // 外部(プロパティー値)
"controller": "did:example:123",
"publicKeyMultibase": "zAKJP3f7BD6W4iWEQ9jwndVTCBq8ua2Utt8EEjJ6Vxsf"
}
],
"capabilityInvocation": [
{
"id": "did:example:123#z6MkhdmzFu659ZJ4XKj31vtEDmjvsi5yDZG5L7Caz63oP39k",
"type": "Ed25519VerificationKey2020", // 外部(プロパティー値)
"controller": "did:example:123",
"publicKeyMultibase": "z4BWwfeqdp1obQptLLMvPNgBw48p7og1ie6Hf9p5nTpNN"
}
],
"capabilityDelegation": [
{
"id": "did:example:123#z6Mkw94ByR26zMSkNdCUi6FNRsWnc2DFEeDXyBGJ5KTzSWyi",
"type": "Ed25519VerificationKey2020", // 外部(プロパティー値)
"controller": "did:example:123",
"publicKeyMultibase": "zHgo9PAmfeoxHG8Mn2XHXamxnnSwPpkyBHAMNF3VyXJCL"
}
],
"assertionMethod": [
{
"id": "did:example:123#z6MkiukuAuQAE8ozxvmahnQGzApvtW7KT5XXKfojjwbdEomY",
"type": "Ed25519VerificationKey2020", // 外部(プロパティー値)
"controller": "did:example:123",
"publicKeyMultibase": "z5TVraf9itbKXrRvt2DSS95Gw4vqU3CHAdetoufdcKazA"
}
]
}
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/jws-2020/v1"
],
"verificationMethod": [
{
"id": "did:example:123#key-0",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "OKP", // 外部(プロパティー名)
"crv": "Ed25519", // 外部(プロパティー名)
"x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ" // 外部(プロパティー名)
}
},
{
"id": "did:example:123#key-1",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "OKP", // 外部(プロパティー名)
"crv": "X25519", // 外部(プロパティー名)
"x": "pE_mG098rdQjY3MKK2D5SUQ6ZOEW3a6Z6T7Z4SgnzCE" // 外部(プロパティー名)
}
},
{
"id": "did:example:123#key-2",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // 外部(プロパティー名)
"crv": "secp256k1", // 外部(プロパティー名)
"x": "Z4Y3NNOxv0J6tCgqOBFnHnaZhJF6LdulT7z8A-2D5_8", // 外部(プロパティー名)
"y": "i5a2NtJoUKXkLm6q8nOEu9WOkso1Ag6FTUT6k_LMnGk" // 外部(プロパティー名)
}
},
{
"id": "did:example:123#key-3",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // 外部(プロパティー名)
"crv": "secp256k1", // 外部(プロパティー名)
"x": "U1V4TVZVMUpUa0ZVU1NBcU9CRm5IbmFaaEpGNkxkdWx", // 外部(プロパティー名)
"y": "i5a2NtJoUKXkLm6q8nOEu9WOkso1Ag6FTUT6k_LMnGk" // 外部(プロパティー名)
}
},
{
"id": "did:example:123#key-4",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // 外部(プロパティー名)
"crv": "P-256", // 外部(プロパティー名)
"x": "Ums5WVgwRkRTVVFnU3k5c2xvZllMbEcwM3NPRW91ZzN", // 外部(プロパティー名)
"y": "nDQW6XZ7b_u2Sy9slofYLlG03sOEoug3I0aAPQ0exs4" // 外部(プロパティー名)
}
},
{
"id": "did:example:123#key-5",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // 外部(プロパティー名)
"crv": "P-384", // 外部(プロパティー名)
"x": "VUZKSlUwMGdpSXplekRwODhzX2N4U1BYdHVYWUZsaXVDR25kZ1U0UXA4bDkxeHpE", // 外部(プロパティー名)
"y": "jq4QoAHKiIzezDp88s_cxSPXtuXYFliuCGndgU4Qp8l91xzD1spCmFIzQgVjqvcP" // 外部(プロパティー名)
}
},
{
"id": "did:example:123#key-6",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // 外部(プロパティー名)
"crv": "P-521", // 外部(プロパティー名)
"x": "VTI5c1lYSmZWMmx1WkhNZ0dQTXhaYkhtSnBEU3UtSXZwdUtpZ0VOMnB6Z1d0U28tLVJ3ZC1uNzhuclduWnplRGMx", // 外部(プロパティー名)
"y": "UW5WNVgwSnBkR052YVc0Z1VqY1B6LVpoZWNaRnliT3FMSUpqVk9sTEVUSDd1UGx5RzBnRW9NV25JWlhoUVZ5cFB5" // 外部(プロパティー名)
}
},
{
"id": "did:example:123#key-7",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "RSA", // 外部(プロパティー名)
"e": "AQAB", // 外部(プロパティー名)
"n": "UkhWaGJGOUZRMTlFVWtKSElBdENGV2hlU1F2djFNRXh1NVJMQ01UNGpWazlraEpLdjhKZU1YV2UzYldIYXRqUHNrZGYyZGxhR2tXNVFqdE9uVUtMNzQybXZyNHRDbGRLUzNVTElhVDFoSkluTUhIeGoyZ2N1Yk82ZUVlZ0FDUTRRU3U5TE8wSC1MTV9MM0RzUkFCQjdRamE4SGVjcHl1c3BXMVR1X0RicXhjU253ZW5kYW13TDUyVjE3ZUtobE80dVh3djJIRmx4dWZGSE0wS21DSnVqSUt5QXhqRF9tM3FfX0lpSFVWSEQxdERJRXZMUGhHOUF6c24zajk1ZC1zYU" // 外部(プロパティー名)
}
}
]
}
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2018/v1",
"https://w3id.org/security/suites/x25519-2019/v1",
"https://w3id.org/security/suites/secp256k1-2019/v1",
"https://w3id.org/security/suites/jws-2020/v1"
],
"verificationMethod": [
{
"id": "did:example:123#key-0",
"type": "Ed25519VerificationKey2018",
"controller": "did:example:123",
"publicKeyBase58": "3M5RCDjPTWPkKSN3sxUmmMqHbmRPegYP1tjcKyrDbt9J" // 外部(プロパティー名)
},
{
"id": "did:example:123#key-1",
"type": "X25519KeyAgreementKey2019",
"controller": "did:example:123",
"publicKeyBase58": "FbQWLPRhTH95MCkQUeFYdiSoQt8zMwetqfWoxqPgaq7x" // 外部(プロパティー名)
},
{
"id": "did:example:123#key-2",
"type": "EcdsaSecp256k1VerificationKey2019",
"controller": "did:example:123",
"publicKeyBase58": "ns2aFDq25fEV1NUd3wZ65sgj5QjFW8JCAHdUJfLwfodt" // 外部(プロパティー名)
},
{
"id": "did:example:123#key-3",
"type": "JsonWebKey2020",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // 外部(プロパティー名)
"crv": "P-256", // 外部(プロパティー名)
"x": "Er6KSSnAjI70ObRWhlaMgqyIOQYrDJTE94ej5hybQ2M", // 外部(プロパティー名)
"y": "pPVzCOTJwgikPjuUE6UebfZySqEJ0ZtsWFpj7YSPGEk" // 外部(プロパティー名)
}
}
]
}
この項は非規範的です。
これらの例は、情報提供のみを目的としています。他の例については、W3Cの検証可能な資格証明のデータ・モデルを参照してください。
{ // external (all terms in this example)
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://w3id.org/citizenship/v1"
],
"type": [
"VerifiableCredential",
"PermanentResidentCard"
],
"credentialSubject": {
"id": "did:example:123",
"type": [
"PermanentResident",
"Person"
],
"givenName": "JOHN",
"familyName": "SMITH",
"gender": "Male",
"image": "data:image/png;base64,iVBORw0KGgo...kJggg==",
"residentSince": "2015-01-01",
"lprCategory": "C09",
"lprNumber": "000-000-204",
"commuterClassification": "C1",
"birthCountry": "Bahamas",
"birthDate": "1958-08-17"
},
"issuer": "did:example:456",
"issuanceDate": "2020-04-22T10:37:22Z",
"identifier": "83627465",
"name": "Permanent Resident Card",
"description": "Government of Example Permanent Resident Card.",
"proof": {
"type": "Ed25519Signature2018",
"created": "2020-04-22T10:37:22Z",
"proofPurpose": "assertionMethod",
"verificationMethod": "did:example:456#key-1",
"jws": "eyJjcml0IjpbImI2NCJdLCJiNjQiOmZhbHNlLCJhbGciOiJFZERTQSJ9..BhWew0x-txcroGjgdtK-yBCqoetg9DD9SgV4245TmXJi-PmqFzux6Cwaph0r-mbqzlE17yLebjfqbRT275U1AA"
}
}
{ // external (all terms in this example)
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
"id": "http://example.gov/credentials/3732",
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"issuer": { "id": "did:example:123" },
"issuanceDate": "2020-03-10T04:24:12.164Z",
"credentialSubject": {
"id": "did:example:456",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science and Arts"
}
},
"proof": {
"type": "JsonWebSignature2020",
"created": "2020-02-15T17:13:18Z",
"verificationMethod": "did:example:123#_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A",
"proofPurpose": "assertionMethod",
"jws": "eyJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdLCJhbGciOiJFZERTQSJ9..Y0KqovWCPAeeFhkJxfQ22pbVl43Z7UI-X-1JX32CA9MkFHkmNprcNj9Da4Q4QOl0cY3obF8cdDRdnKr0IwNrAw"
}
}
{ // external (all terms in this example)
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://w3id.org/security/bbs/v1",
{
"name": "https://schema.org/name",
"birthDate": "https://schema.org/birthDate"
}
],
"id": "urn:uuid:c499e122-3ba9-4e95-8d4d-c0ebfcf8c51a",
"type": ["VerifiableCredential"],
"issuanceDate": "2021-02-07T16:02:08.571Z",
"issuer": {
"id": "did:example:123"
},
"credentialSubject": {
"id": "did:example:456",
"name": "John Smith",
"birthDate": "2021-02-07"
},
"proof": {
"type": "BbsBlsSignature2020",
"created": "2021-02-07T16:02:10Z",
"proofPurpose": "assertionMethod",
"proofValue": "o7zD2eNTp657YzkJLub+IO4Zqy/R3Lv/AWmtSA/kUlEAOa73BNyP1vOeoow35jkABolx4kYMKkp/ZsFDweuKwe/p9vxv9wrMJ9GpiOZjHcpjelDRRJLBiccg9Yv7608mHgH0N1Qrj14PZ2saUlfhpQ==",
"verificationMethod": "did:example:123#bls12381-g2-key"
}
}
{ // external (all terms in this example)
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://w3id.org/security/bbs/v1",
{
"name": "https://schema.org/name",
"birthDate": "https://schema.org/birthDate"
}
],
"id": "urn:uuid:c499e122-3ba9-4e95-8d4d-c0ebfcf8c51a",
"type": "VerifiableCredential",
"issuanceDate": "2021-02-07T16:02:08.571Z",
"issuer": {
"id": "did:example:123"
},
"credentialSubject": {
"id": "did:example:456",
"birthDate": "2021-02-07"
},
"proof": {
"type": "BbsBlsSignatureProof2020",
"created": "2021-02-07T16:02:10Z",
"nonce": "OqZHsV/aunS34BhLaSoxiHWK+SUaG4iozM3V+1jO06zRRNcDWID+I0uwtPJJ767Yo8Q=",
"proofPurpose": "assertionMethod",
"proofValue": "AAsH34lcKsqaqPaLQWcnLMe3mDM+K7fZM0t4Iesfj7BhD//HBtuWCmZE946BqW7OHYU106MP8mLntutqB8FyGwS7AOyK+5/7iW6JwLNVCvh4Nt3IaF3AN47fqVs2VikD9DiCsaFAUU6ISj5pbad8O+6jiT9Yw6ug8t8vJn3XHvMUhCPnDZJeBEdKD1qo4Z0LOq3L8QAAAHSEgtC9BoZL2MLjz4QuPxpwbhTTRC08MIUjdJnP4JUtz6163Lsl3rpadGu2d3Te7loAAAACZBD4YWOgV0xpPoYZ5vywNA5/NTeDHDbX36gvoV5RDJtY1SLU2LN/IDPZGrfhEiASbD1/QXqj8dod6FbjBs9m/LchBcy7z4yDBv/8DnBzDJ9dEaM4bDjpwmqtgJqha2kwtlyNog67xG9tNjnp5rrbIgAAAANMVanwWmlkg5I/f1M2QJ5GRvQiBL4lyL5sttxwIOalbTZP8VqWtFJI54xMNjTiK71aFWWN8SlNEwfVIX34HO5zBIb6fvc+Or21ubYllT9eXv1epl2o2CojuieCZyxE8/Q=",
"verificationMethod": "did:example:123#bls12381-g2-key"
}
}
{ // external (all terms in this example)
"protected": {
"kid": "did:example:123#_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A",
"alg": "EdDSA"
},
"payload": {
"iss": "did:example:123",
"sub": "did:example:456",
"vc": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
"id": "http://example.gov/credentials/3732",
"type": [
"VerifiableCredential",
"UniversityDegreeCredential"
],
"issuer": {
"id": "did:example:123"
},
"issuanceDate": "2020-03-10T04:24:12.164Z",
"credentialSubject": {
"id": "did:example:456",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science and Arts"
}
}
},
"jti": "http://example.gov/credentials/3732",
"nbf": 1583814252
},
"signature": "qSv6dpZJGFybtcifLwGf4ujzlEu-fam_M7HPxinCbVhz9iIJCg70UMeQbPa1ex6BmQ2tnSS7F11FHnMB2bJRAw"
}
この項は非規範的です。
これらの例は、情報提供のみを目的としており、JWEヘッダーで不必要な情報を開示することを避けるのがベスト・プラクティスであると考えられています。
{ // external (all terms in this example)
"ciphertext": "3SHQQJajNH6q0fyAHmw...",
"iv": "QldSPLVnFf2-VXcNLza6mbylYwphW57Q",
"protected": "eyJlbmMiOiJYQzIwUCJ9",
"recipients": [
{
"encrypted_key": "BMJ19zK12YHftJ4sr6Pz1rX1HtYni_L9DZvO1cEZfRWDN2vXeOYlwA",
"header": {
"alg": "ECDH-ES+A256KW",
"apu": "Tx9qG69ZfodhRos-8qfhTPc6ZFnNUcgNDVdHqX1UR3s",
"apv": "ZGlkOmVsZW06cm9wc3RlbjpFa...",
"epk": {
"crv": "X25519",
"kty": "OKP",
"x": "Tx9qG69ZfodhRos-8qfhTPc6ZFnNUcgNDVdHqX1UR3s"
},
"kid": "did:example:123#zC1Rnuvw9rVa6E5TKF4uQVRuQuaCpVgB81Um2u17Fu7UK"
}
}
],
"tag": "xbfwwDkzOAJfSVem0jr1bA"
}
下記は,4. データ・モデル、5. コア・プロパティーおよび8. メソッドおよび7. 解決の間の関係を示す図です。
DIDの作成は、個々のDIDメソッドによって定義されている処理です。did:key
などの一部のDIDメソッドは、純粋に生成的であり、DIDとDIDドキュメントは、1つの暗号材料を適合する表現に変換することで生成されます。他のDIDメソッドには、検証可能なデータ・レジストリの使用が必要な場合があり、その場合、それぞれのDIDメソッドで定義されているとおりに登録が完了したときにのみ、DIDとDIDドキュメントの存在が第三者に認識されます。その他の処理は、個別のDIDメソッドにより定義される可能性があります。
DIDは特定の型のURI(Uniform Resource Identifier)であるため、DIDはあらゆる資源を参照することができます。[RFC3986]によると次のとおり。
「資源」という用語は、URIで識別されうるあらゆるものに対する一般的な意味で用いられます。[...]資源は必ずしもインターネット経由でアクセスできるとは限りません。
資源は、デジタルまたは物理的、抽象的または具体的でありえます。URIを割り当てることができるすべての資源に、DIDを割り当てることができます。DIDによって参照される資源がDIDサブジェクトです。
DIDコントローラは、DIDサブジェクトを決定します。DIDは一般的に、人間ではなく機械にとってのみ意味を有するため、DID自体を見てDIDサブジェクトを決定できることは期待できません。DIDには、DIDサブジェクトに関する情報が含まれている可能性が低いため、DIDサブジェクトに関する追加情報は、DIDをDIDドキュメントに解決するか、DIDに関する検証可能な資格証明を取得するか、またはDIDの他の記述を介してのみ発見できます。
取得したDIDドキュメント内のid
プロパティーの値は、解決されるDIDと常に一致しなければなりませんが、DIDが参照する実際の資源が時間の経過とともに変化するかどうかは、DIDメソッドによって異なります。例えば、DIDサブジェクトの変更を許可するDIDメソッドを用いて、会社のCEOなどの特定の役割に現在就いている人のDIDを生成することができますが、その場合、その役割に就いている実際の人物は、DIDがいつ解決されたかによって異なる可能性があります。
DIDは、DIDサブジェクトを参照し、(DIDメソッドで指定されているプロトコルに従うことで)DIDドキュメントに対して解決します。DIDドキュメントは、DIDサブジェクトとは別の資源ではなく、DIDとは別のURIを持っていません。むしろ、DIDドキュメントは、DIDサブジェクトを記述する目的で、DIDコントローラが管理するDID解決のアーチファクトです。
この違いを、下記のグラフ・モデルで示しています。
DIDドキュメントの各プロパティーは、次の事項を記述しているDIDコントローラによるステートメントです。
id
とalsoKnownAs
のプロパティー)。verificationMethod
とservice
のプロパティー)。@context
プロパティー)。DIDドキュメントの唯一の必須プロパティーはid
であるため、それがDIDドキュメントに含まれていることが保証される唯一のステートメントです。そのステートメントは、図8では、DIDとDIDサブジェクトの間の直接的なリンクで示しています。
DIDサブジェクトに関する詳細情報を発見するためのオプションは、DIDドキュメントに存在するプロパティーによって異なります。service
プロパティーが存在していれば、サービス・エンドポイントから詳細情報を要求できます。例えば、DIDサブジェクトを記述している1つ以上のクレーム(属性)に対する検証可能な資格証明をサポートするサービス・エンドポイントにクエリを実行するなど。
もう1つのオプションは、alsoKnownAs
プロパティーがDIDドキュメントに存在していれば、それを用いることです。DIDコントローラは、それを用いて、同じDIDサブジェクトを参照する他のURIのリスト(他のDIDを含む)を提供できます。これらのURIを解決または逆参照すると、下記の図で示しているように、DIDサブジェクトの他の記述や表現が得られる可能性があります。
DIDサブジェクトがインターネットから取得可能なデジタル資源であれば、DIDメソッドは、DIDサブジェクト自体の表現を返すDID URLを構築することを選択できます。例えば、永続的な、暗号で検証可能な識別子を必要とするデータ・スキーマにDIDを割り当てることができ、指定されたDIDパラメータ(3.2.1 DIDパラメータを参照)を渡すことは、そのスキーマの表現を取得する標準的な方法として使用できます。
同様に、DIDは、検証可能なデータ・レジストリから直接返すことができるデジタル資源(画像など)を参照するために使用できます(その機能が該当するDIDメソッドでサポートされている場合)。
ウェブ・ページやその他のウェブ資源のコントローラが、永続的な、暗号で検証可能な識別子を割り当てたければ、そのコントローラはその資源にDIDを付与できます。例えば、ブログ・ホスティング会社が提供するブログ(ホスティング会社のドメイン下にある)の作者は、そのブログのDIDを作成できます。DIDドキュメントには、その作者は、例えば次のようにブログの現在のURLを指し示すalsoKnownAs
プロパティーを含めることができます。
"alsoKnownAs": ["https://myblog.blogging-host.example/home"]
その後、作者がブログを別のホスティング会社(または、作者自身のドメイン)に移した場合、作者は、例えば次のようにDIDドキュメントを更新し、ブログの新しいURLを指し示すことができます。
"alsoKnownAs": ["https://myblog.example/"]
DIDは、ブログのURLに効果的に間接層を追加します。この間接層は、ブログのホスティング会社などの外部管理機関の管理下にあるのではなく、作者の管理下にあります。このようにして、DIDは、拡張URN(Uniform Resource Name)、つまりネットワーク上のロケーションが時間とともに変化する可能性のある情報資源の永続的な識別子として効果的に機能します。
混乱を避けるために、DIDコントローラとの関係に基づいてDIDサブジェクトを2つの互いに素である集合に分類すると便利です。
図10に示す最初のケースは、DIDサブジェクトがDIDコントローラでもあるという一般的なシナリオです。これは、個人や組織が自身を識別するためにDIDを作成するケースです。
グラフ・モデルの観点から見ると、図10では、DIDコントローラおよびDIDサブジェクトとして識別されているノードは、別個のものであるにもかかわらず、意味上の同等性の関係を表すために、それらをつなぐ論理アークが存在しています。
第2のケースは、DIDサブジェクトがDIDコントローラとは別のエンティティーである場合です。これは、例えば、親が子のためにDIDを作成して管理を維持するケース、企業が子会社のためにDIDを作成して管理を維持するケース、メーカーが製品、IoTデバイスまたはデジタル・ファイルのためにDIDを作成して管理を維持するケースなどです。
グラフ・モデルの観点から見ると、集合1との唯一の違いは、DIDサブジェクトのノードとDIDコントローラのノードの間に同等性アークの関係がないことです。
1つのDIDドキュメントに複数のDIDコントローラが含まれる場合があります。これは、2つの方法のいずれかで生じる可能性があります。
このケースでは、個々のDIDコントローラが単独で動作する可能性があります。つまり、個々に独立してDIDドキュメントを更新する全権限を持っています。グラフ・モデルの観点から見ると、この構成では、次のとおりです。
グループ管理の場合、(複数の)DIDコントローラは、複数のデジタル署名(「multi-sig」)やデジタル署名(「m-of-n」)の閾値数を必要とする暗号アルゴリズムを用いる場合など、何らかの方法でまとめて動作することが期待されます。機能的な観点から見ると、このオプションは1つのDIDコントローラに似ています。なぜなら、DIDコントローラのグループ内の個々のDIDコントローラには独自のグラフ・ノードがありますが、実際の管理は、図12に示しているように、DIDコントローラのグループを表す1つの論理グラフ・ノードに折りたたまれるからです。
この構成は、多くの場合、DIDサブジェクトが、1人の個人では管理されていない組織、企業、政府機関、コミュニティまたはその他のグループである場合に適用されます。
1つのDIDドキュメントには、DIDサブジェクトを参照するDIDがきっかり1つ含まれています。このDIDは、id
プロパティーの値として表されます。このプロパティーの値は、DIDドキュメントの存続期間中、不変です。
しかし、DIDによって識別される資源、つまりDIDサブジェクトは、時間の経過とともに変更される場合があります。これは、DIDコントローラの独占的な権限の下にあります。詳細については、9.16 永続性を参照してください。
DIDドキュメントのDIDコントローラは、時間の経過とともに変更される場合があります。しかし、実装方法によっては、DIDコントローラの変更が、DIDドキュメント自体の変更では明らかにならない場合もあります。例えば、基礎的な暗号キーの所有権の変更またはDIDドキュメント内の1つ以上の検証メソッドに用いられるその他の管理によって変更が実施された場合、標準的なキーのローテーションと区別がつかない可能性があります。
一方で、controller
プロパティーの値を変更することで変更を実施すると、明白になります。
DIDコントローラの変更を検証することが重要な場合、実装者は、改訂されたDIDドキュメントの検証メソッドに対して新しいDIDコントローラを認証することをお勧めします。
この項には、W3Cの最初の草案としてこの仕様を公開した後に行われた変更が含まれています。
第2勧告候補以後の変更点は次のとおりです。
publicKeyMultibase
に関連する警告の追加。最初の勧告候補以後の変更点は次のとおりです。
method-specific-id
ABNF規則及びnextUpdate
とnextVersionId
の「リスクがある」課題のマーカーの削除。equivalentId
とcanonicalId
がオプションであることの明確化。publicKeyBase58
からpublicKeyMultibase
への置換。最初の草案以後の変更点は次のとおりです。
ワーキンググループは、ワーキンググループを生産的な方向に導き、標準化プロセスという深く危険な海のかじ取りを行ってくださった、議長であるBrent ZundelとDan Burnett、そしてW3C窓口スタッフのIvan Hermanに深い謝意と心からの感謝を表します。
ワーキンググループは、この仕様の作成につながった作業に感謝するとともに、作業に深い影響を与えた技術や仕様に携わった方々に心からの謝意を表します。特に、Phil Zimmerman、Jon Callas、Lutz Donnerhacke、Hal Finney、David Shaw、Rodney Thayerが1990年代から2000年代にかけて行ったPGP(Pretty Good Privacy)の研究がこれに含まれます。
2010年代半ばに、Jeremie MillerのTelehashプロジェクトや、Dave LongleyとManu Spornyが率いるW3Cのウェブ・ペイメント・コミュニティグループ(Web Payments Community Group)の作業と共同で、後に分散型識別子となるものの予備的な実装が構築されました。その約1年後に、XDI.orgレジストリ・ワーキンググループは、既存の識別子レジストリを置き換えるための分散化技術の探求を開始しました。分散型識別子の概念を探求した最初の執筆論文のいくつかは、Christopher Allenが招集したRebooting the Web of Trustワークショップの最初の数回に遡ることができます。その作業は、Christopher Allen、Drummond Reed、Les Chasen、Manu Sporny、Anil Johnの間の重要な共同作業につながりました。Anilは、この技術に将来性を見出し、この分野の探求に最初の政府資金を割り当てました。Anil Johnのサポートと長年にわたる彼の指導がなければ、分散型識別子が今日のようなものになることはまずありません。Rebooting the Web of Trustワークショップでさらに改良が加えられ、Drummond Reed、Les Chasen、Christopher Allen、Ryan Grantが編集した最初の実装者ドキュメントが作成されました。貢献者には、Manu Sporny, Dave Longley, Jason Law, Daniel Hardman, Markus Sabadello, Christian Lundkvist, Jonathan Endersbyが含まれていました。この最初の作業は、W3Cの資格証明コミュニティグループ(Credentials Community Group)に統合され、さらに具体化された後、グローバルな標準化のためにW3Cの分散型識別子ワーキンググループ(Decentralized Identifiers Working Group)に移行されました。
この仕様に関する作業の一部は、米国国土安全保障省(US DHS)の科学技術局(HSHQDC-16-R00012-H-SB2016-1-002、HSHQDC-17-C-00019契約)と、US DHSシリコンバレー・イノベーション・プログラム(70RSAT20T00000010、70RSAT20T00000029、70RSAT20T00000030、70RSAT20T00000045、70RSAT20T000003および70RSAT20T00000033契約)によって資金援助されています。この仕様の内容は、必ずしも米国政府の姿勢や政策を反映したものではなく、公式な推奨を意味するものではありません。
この仕様に関する作業の一部は、欧州連合のStandICT.euプログラム(サブグラント契約番号CALL05/19)によって資金援助されています。この仕様の内容は、必ずしも欧州連合の姿勢や方針を反映するものではなく、公式な推奨を意味するものではありません。
この仕様に関する作業は、Christopher Allen、Shannon Appelcline、Kiara Robles、Brian Weller、Betty Dhamers、Kaliya Young、Kim Hamilton Duffy、Manu Sporny、Drummond Reed、Joe Andrieuおよび Heather Vescentが推進するRebooting the Web of Trustコミュニティからも支援を受けてきました。この仕様の開発は、Kim Hamilton Duffy、Joe Andrieu、Christopher Allen、Heather Vescentおよび Wayne Changが議長を務めるW3Cの資格証明コミュニティグループからも支援を受けてきました。Phil Windley、Kaliya Young、Doc Searls、Heidi Nobantu Saulが推進するインターネット・アイデンティティ・ワークショップ(Internet Identity Workshop)の参加者も、この仕様に関する議論、改善、参加者の教育を目的とした多数の作業セッションを通じて、 この作業を支援してくださいました。
ワーキンググループは、この仕様に貢献してくださった次の方々に感謝します(アルファベット順、Githubハンドルは@
で始まり、姓でソートされています)。Denis Ah-Kang、Nacho Alamillo、Christopher Allen、Joe Andrieu、Antonio、Phil Archer、George Aristy、Baha、Juan Benet、BigBlueHat、Dan Bolser、Chris Boscolo、Pelle Braendgaard、Daniel Buchner、Daniel Burnett、Juan Caballero、@cabo、Tim Cappalli、Melvin Carvalho、David Chadwick、Wayne Chang, Sam Curren、Hai Dang、Tim Daubenschutz、Oskar van Deventer、Kim Hamilton Duffy, Arnaud Durand、Ken Ebert、Veikko Eeva、@ewagner70、Carson Farmer、Nikos Fotiou, Gabe、Gayan、@gimly-jack、@gjgd、Ryan Grant、Peter Grassberger、Adrian Gropper, Amy Guy、Daniel Hardman、Kyle Den Hartog、Philippe Le Hegaret、Ivan Herman, Michael Herman、Alen Horvat、Dave Huseby、Marcel Jackisch、Mike Jones、Andrew Jones、Tom Jones、jonnycrunch、Gregg Kellogg、Michael Klein、@kdenhartog-sybil1, Paul Knowles、@ktobich、David I. Lehn、Charles E. Lehner、Michael Lodder, @mooreT1881、Dave Longley、Tobias Looker、Wolf McNally、Robert Mitwicki、Mircea Nistor、Grant Noble、Mark Nottingham、@oare、Darrell O'Donnell、Vinod Panicker, Dirk Porsche、Praveen、Mike Prorock、@pukkamustard、Drummond Reed、Julian Reschke、Yancy Ribbens、Justin Richer、Rieks、@rknobloch、Mikeal Rogers, Evstifeev Roman、Troy Ronda、Leonard Rosenthol、Michael Ruminer、Markus Sabadello、Cihan Saglam、Samu、Rob Sanderson、Wendy Seltzer、Mehran Shakeri, Jaehoon (Ace) Shim、Samuel Smith、James M Snell、SondreB、Manu Sporny、@ssstolk, Orie Steele、Shigeya Suzuki、Sammotic Switchyarn、@tahpot、Oliver Terbu、 Ted Thibodeau Jr.、Joel Thorstensson、Tralcan、Henry Tsai、Rod Vagg、Mike Varley, Kaliya "Identity Woman" Young、Eric Welton、Fuqiao Xue、@Yue、Dmitri Zagidulin、@zhanb、Brent Zundel。
この項は、この仕様がW3C勧告案になった時点で、IANAでのレビュー、承認、登録のためにインターネット技術運営グループ(IESG)に提出する予定です。
application/did+jsonで用いられるフラグメント識別子は、フラグメントで定義されている規則に従って扱われます。
この仕様の勧告候補段階では、application/did+ld+json
メディア・タイプについて、かなりの数の実装を受け取った。IANAでのメディア・タイプapplication/did+ld+json
の登録は、複数の接尾辞を含むメディア・タイプの課題の解決待ちです。複数の接尾辞を含むメディア・タイプのRFCが公開された直後に、W3Cによるapplication/did+ld+json
メディア・タイプの登録により、IETFメディア・タイプ維持ワーキンググループ(IETF Media Type Maintenance Working Group)において作業が継続される予定です。
application/did+ld+jsonで用いられるフラグメント識別子は、JSON-LD 1.1: application/ld+jsonメディア・タイプ[JSON-LD11]に関連する規則に従って扱われます。
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先: