Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
去中心化标识符(DID)是一种新型 标识符, 可实现可验证的、去中心化的数字身份。DID 指代任何 主体(例如,个人、组织、事物、数据模型、抽象实体等), 由 DID 的控制者确定。与 典型的联合式标识符不同,DID 的设计使其可以 与中心化注册表、身份提供者和证书 颁发机构解耦。具体而言,虽然可以使用其他方来帮助实现 与 DID 相关信息的发现,但该设计使 DID 的控制者能够证明对其的控制权, 而无需任何其他方的许可。DID 是 URI, 它将 DID 主体 与 DID 文档关联起来,从而允许 与该主体相关联的可信交互。
每个 DID 文档都可以表达密码学材料、验证 方法或服务,这些内容提供一组机制,使 DID 控制者能够证明对该 DID 的控制权。服务支持 与 DID 主体相关联的可信交互。一个 DID 也可能 提供返回 DID 主体自身的方式,前提是该 DID 主体是数据模型之类的信息资源。
本文档规定了 DID 语法、通用数据模型、核心属性、 序列化表示形式、DID 操作,并解释了 将 DID 解析为其所表示资源的过程。
本节描述本文档在发布时的 状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。
W3C 去中心化标识符工作组已将 本文档发布为 W3C 候选推荐,并请求软件 开发者和 DID 方法规范作者提供实验性实现,用于 测试本文档中所有特性的可实现性。
实现者需注意,任何开放的 第 1、2 或 3 类议题(列在议题 跟踪器中)都可能导致规范发生变更。
为退出 W3C 候选推荐阶段,W3C DID 工作组 要求满足以下条件:
一个特性被定义为规范中一个或多个在功能上相关的规范性陈述。 对于本规范,互操作性被定义为规范性陈述, 例如那些涉及数据模型属性及其 值的陈述,在两个不同的 DID 方法之间以相同方式解释。
特定 DID 方法的解析不在本规范范围内, 而由 去中心化标识符解析(DID Resolution) v0.3 规范涵盖。
本文档由 去中心化标识符 工作组作为 候选推荐快照发布,并采用 推荐标准轨道。
作为候选推荐发布并不 意味着获得 W3C 及其成员的认可。候选 推荐快照已经过 广泛审查,旨在 收集 实现经验, 并已获得工作组成员对实现进行 免版税许可 的承诺。
本候选推荐预计不会早于 2026年4月5日推进到推荐标准。
本文档由一个 根据 W3C 专利 政策运作的工作组制定。 W3C 维护着一份 与该工作组交付物相关的任何专利披露的公开列表; 该页面还包括 披露专利的说明。任何实际 知晓其认为包含 必要权利要求 的专利的个人,必须按照 W3C 专利政策第 6 节披露相关信息。
本文档受 2025年8月18日 W3C 流程文档约束。
本节为非规范性内容。
作为个人和组织,我们许多人会在 各种各样的上下文中使用全局唯一标识符。它们用作通信地址(电话号码、 电子邮件地址、社交媒体用户名)、ID 号码(用于护照、 驾驶执照、税号、健康保险)以及产品标识符(序列号、 条形码、RFID)。URI(统一资源标识符)用于 Web 上的资源,你在浏览器中查看的每个网页都有一个全局 唯一的 URL(统一资源定位符)。
这些全局唯一标识符中的绝大多数并不受我们 控制。它们由外部权威机构签发,这些机构决定它们 指代谁或什么,以及何时可以将其撤销。它们只在某些上下文中 有用,也只被并非由我们选择的某些机构认可。它们可能 随着某个组织的失败而消失或不再有效。它们可能 不必要地泄露个人信息。在许多情况下,它们可能被 恶意第三方欺诈性地复制和声称,这通常 被称为“身份盗用”。
本规范中定义的去中心化标识符(DID)是一种新的 全局唯一标识符类型。其设计目的是使个人和 组织能够使用他们信任的系统生成自己的标识符。这些 新标识符使实体能够通过使用数字签名等密码学证明进行身份验证, 来证明对它们的控制权。
由于去中心化标识符的生成和声明由 实体控制,每个实体都可以根据需要拥有任意数量的 DID,以维持 其所需的身份、人格和交互之间的隔离。可以将这些 标识符的使用适当地限定在不同上下文中。它们 支持与其他人、机构或系统进行交互,这些交互要求 实体识别自己或其控制的事物,同时提供对 应披露多少个人或私有数据的控制,而且这一切都无需依赖 中央权威机构来保证标识符的持续存在。 这些思想在 DID Use Cases 文档 [DID-USE-CASES] 中进行了探讨。
本规范并不预设任何特定技术或密码学 来支撑 DID 的生成、持久化、解析或解释。 例如,实现者可以基于 在联合式或中心化身份管理系统中注册的标识符来创建去中心化标识符。 事实上,几乎所有类型的标识符系统都可以增加对 DID 的支持。这 在中心化、联合式和去中心化标识符的世界之间创建了互操作桥梁。 这也使实现者能够设计特定 类型的 DID,以配合他们信任的计算基础设施工作,例如 分布式账本、去中心化文件系统、分布式数据库以及 点对点网络。
本规范适用于:
除本规范之外,读者可能还会发现 Use Cases and Requirements for Decentralized Identifiers [DID-USE-CASES] 文档很有用。
本节为非规范性内容。
DID 是一个由三个
部分组成的简单文本字符串:1)did URI 方案标识符,2)DID 方法的标识符,以及 3)
DID 方法特定标识符。
上面的示例 DID 会解析为一个 DID 文档。DID 文档 包含与该 DID 相关的信息,例如 对 认证 DID 控制者进行密码学认证的方式。
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123456789abcdefghi",
"authentication": [{
// 用于以 did:...fghi 的身份进行认证
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Multikey",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}]
}
本节为非规范性内容。
去中心化标识符是 更大系统(例如 Verifiable Credentials 生态系统 [VC-DATA-MODEL])的组成部分,该生态系统影响了本规范的 设计 目标。去中心化标识符的设计目标 总结如下。
| 目标 | 描述 |
|---|---|
| 去中心化 | 消除在标识符管理中对中心化权威机构或单点 故障的要求,包括全局唯一 标识符、公开验证密钥、服务以及 其他信息的注册。 |
| 控制 | 赋予实体(包括人类和非人类)直接控制其 数字标识符的能力,而无需依赖外部权威机构。 |
| 隐私 | 使实体能够控制其信息的隐私,包括对属性或其他数据进行最小化、 选择性和渐进式披露。 |
| 安全 | 提供足够的安全性,使请求方能够依赖 DID 文档达到其所需的 保证级别。 |
| 基于证明 | 使 DID 控制者在与 其他实体交互时能够提供密码学证明。 |
| 可发现性 | 使实体能够发现其他实体的 DID,以 进一步了解这些实体或与它们交互。 |
| 互操作性 | 使用可互操作的标准,使 DID 基础设施能够利用 为互操作性而设计的现有工具和软件库。 |
| 可移植性 | 独立于系统和网络,并使实体能够在任何支持 DID 和 DID 方法的系统中使用其数字 标识符。 |
| 简单性 | 倾向于减少简单功能集合,使该技术更易于 理解、实现和部署。 |
| 可扩展性 | 在可能的情况下支持可扩展性,前提是它不会严重妨碍 互操作性、可移植性或简单性。 |
本节为非规范性内容。
本节提供去中心化标识符架构主要组件的 基本概述。
图中出现六个内部带标签的形状,并有带标签的箭头 连接它们,具体如下。图的中心是一个标记为 DID URL 的矩形,其中包含小号打字机体文本 "did:example:123/path/to/rsrc"。 图的正上方中心是一个标记为 "DID" 的矩形,其中包含小号 打字机体文本 "did:example:123"。图的左上方是一个椭圆, 标记为 "DID Subject"。底部中心是一个标记为 "DID document" 的矩形。 左下方是一个椭圆,标记为 "DID Controller"。图的中右侧是一个圆柱体的二维渲染, 标记为 "Verifiable Data Registry"。
从 "DID URL" 矩形顶部伸出一支标记为 "contains" 的箭头, 向上指向 "DID" 矩形。从 "DID URL" 矩形底部伸出一支标记为 "refers, and dereferences, to" 的箭头,向下指向 "DID document" 矩形。从 "DID" 矩形伸出的一支标记为 "resolves to" 的箭头向下指向 "DID document" 矩形。从 "DID" 矩形伸出的一支标记为 "refers to" 的箭头向左 指向 "DID subject" 椭圆。从 "DID controller" 椭圆伸出的一支标记为 "controls" 的箭头向右指向 "DID document" 矩形。从 "DID" 矩形伸出的一支标记为 "recorded on" 的箭头向右下方指向 "Verifiable Data Registry" 圆柱体。从 "DID document" 矩形 伸出的一支标记为 "recorded on" 的箭头向右上方指向 "Verifiable Data Registry" 圆柱体。
did:、方法标识符,以及由
DID 方法指定的唯一的
方法特定标识符。DID 可
解析为 DID 文档。DID URL 扩展
基本 DID 的语法,以纳入其他标准 URI 组件,例如
路径、查询和片段,从而定位特定
资源——例如,DID
文档内的密码学公钥,或位于
DID 文档之外的资源。
这些概念在 3.1 DID 语法 和
3.2 DID URL 语法中进一步阐述。
除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。除此之外,本规范中的所有内容均为规范性内容。
本文档中的关键词 MAY、MUST、MUST NOT、RECOMMENDED、SHOULD 和 SHOULD NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,但仅当它们像此处所示一样以全部 大写形式出现时才如此。
本文档包含含有 JSON 和 JSON-LD 内容的示例。
其中一些示例包含无效字符,例如内联
注释(//)以及使用省略号(...)表示
对示例价值不大的信息。实现者在希望将这些信息用作有效 JSON
或 JSON-LD 时,应注意
移除这些内容。
某些示例包含本规范未定义的术语,包括属性名称和值。
这些术语以注释(//
external (property name|value))标明。此类术语在 DID 文档中使用时,
预期应在 DID Extensions
[DID-EXTENSIONS] 仓库中注册,并附带指向
形式化定义和 JSON-LD
上下文的链接。
DID 和 DID 文档实现的互操作性, 通过评估实现创建和解析符合本规范的 DID 和 DID 文档的能力来测试。 DID 和 DID 文档的生产者和消费者之间的互操作性, 通过确保 DID 和 DID 文档符合要求来提供。DID 方法规范的互操作性由每个 DID 方法规范中的细节提供。可以理解的是,就像 Web 浏览器不需要实现所有已知的 URI 方案一样,使用 DID 的符合要求的软件也不需要 实现所有已知的 DID 方法。但是,给定 DID 方法 的所有实现都应对该方法具备互操作性。
符合要求的 DID 是 3. 标识符中规定的规则的任何具体表达,并且符合 该节中的相关规范性陈述。
符合要求的 DID 文档 是本规范中描述的数据模型的任何具体表达, 并且符合 4. 数据模型 和 5. 核心 属性中的 相关规范性陈述。符合要求的文档的序列化格式是确定性的、 双向的且无损的,如 6. 表示形式中所述。
符合要求的生产者是任何以 软件和/或 硬件实现的算法,它生成 符合要求的 DID或 符合要求的 DID 文档,并符合 6. 表示形式中的相关规范性陈述。
符合要求的消费者是任何以 软件和/或 硬件实现的算法,它消费 符合要求的 DID或 符合要求的 DID 文档, 并符合 6. 表示形式中的相关规范性陈述。
符合要求的 DID 方法是任何 符合 7. 方法中相关规范性陈述的规范。
本节为非规范性内容。
本规范有两个主要读者群体:符合要求的 DID 方法的实现者;以及希望与 DID 交互并对接的 系统和服务的实现者。预期读者包括但不限于软件架构师、数据建模者、应用开发者、服务开发者、 测试人员、运维人员和用户体验(UX)专家。参与与去中心化身份、可验证凭证和安全存储相关的 各类标准工作的其他人员,也可能会对阅读本规范感兴趣。
本节为非规范性内容。
本节定义了本规范以及整个 去中心化标识符基础设施中使用的术语。每当 这些术语在本规范中出现时, 都会包含指向它们的链接。
controller 属性表示。请注意,DID 控制者可能是
DID
主体。
U+0023 NUMBER SIGN)之后的部分。DID 片段语法
与 URI 片段语法相同。
U+002F SOLIDUS)开始并包含该字符的部分,终止于但
不包含
? 字符
(U+003F QUESTION MARK)、
# 字符
(U+0023 NUMBER SIGN),
或 DID URL 的末尾。DID 路径语法与 URI 路径语法相同。
见 路径。
U+003F QUESTION MARK)的部分。
DID 查询语法与 URI 查询
语法相同。见 查询。
did: 开头,如 3.1 DID
语法中所定义。每个 DID 方法
规范都定义了一个与该特定
DID 方法一起工作的特定
DID 方法方案。在特定 DID
方法方案中,DID 方法名称跟在第一个冒号之后,并以
第二个冒号结束,例如 did:example:
U+002F SOLIDUS)、
可选的 DID 查询及其前导
? 字符
(U+003F QUESTION MARK),
以及可选的 DID 片段及其前导
# 字符
(U+0023 NUMBER SIGN)。
除上述术语外,本规范还使用 [INFRA] 规范中的术语来正式定义 数据模型。当使用 [INFRA] 术语时,例如 字符串、集合和 映射,会直接链接到该规范。
本节描述 DID 和 DID URL 的形式语法。 术语“通用”用于区分此处定义的语法与 特定 DID 方法在其各自 规范中定义的语法。DID 和 DID URL 的创建过程及其时机在 7.2 方法 操作和 B.2 DID 的创建中描述。
通用 DID 方案是符合
[RFC3986] 的 URI
方案。ABNF
定义如下,它使用
[RFC5234] 中的语法以及
ALPHA 和
DIGIT 的相应定义。下面 ABNF 中未定义的所有其他规则名称
均定义于 [RFC3986]。所有
DID MUST 符合
DID 语法 ABNF 规则。
| 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 URL 是特定 资源的网络位置标识符。它可用于检索诸如 DID 主体的表示形式、验证方法、服务、 DID 文档的特定部分,或其他资源。
以下是使用 [RFC5234] 中语法的 ABNF 定义。它构建
于 3.1
DID 语法中定义的 did 方案之上。path-abempty、query 和 fragment 组件
定义于 [RFC3986]。所有
DID URL MUST 符合
DID URL 语法 ABNF 规则。DID 方法可以进一步限制这些
规则,如 7.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 规则。
did:example:123456?versionId=1
强烈建议实现者避免在没有专门为该目的设计的规范时, 比较具有多个查询参数的 DID URL 是否等价。 本规范没有定义 查询参数的规范化规则,并且在 DID 方法规范或应用层定义的任何查询参数规范化规则并非 普遍认可的规则。
DID 片段语法和语义与通用
URI
片段相同,并符合
RFC 3986 第 3.5 节中的
fragment ABNF 规则。
DID 片段被用作进入 DID 文档或外部 资源的、独立于方法的引用。下面展示了 DID 片段 标识符的一些示例。
did:example:123#public-key-1
did:example:123#service-5
为最大化互操作性,强烈建议实现者确保 DID 片段在不同 表示形式中以相同方式解释 (见 6. 表示形式)。例如,虽然 JSON Pointer [RFC6901] 可用于 DID 片段,但它在非 JSON 表示形式中不会以相同方式 解释。
与本节中的语义兼容并构建于其之上的片段标识符附加语义, 在媒体类型描述中规定(见 E.1 application/did 一节)。有关如何 解引用 DID 片段的信息,见 去中心化标识符解析(DID Resolution)v0.3 规范。
相对 DID URL 是
DID 文档中任何不以
did:<method-name>:<method-specific-id> 开头的 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常用于在 DID 文档中引用 验证方法 和 服务, 而无需使用绝对 URL。存储大小是考虑因素的 DID 方法可能会使用 相对 URL 来减少 DID 文档的存储大小。
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123456789abcdefghi",
"verificationMethod": [{
"id": "did:example:123456789abcdefghi#key-1",
"type": "Multikey", // external (property value)
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}, ...],
"authentication": [
// 用于引用上方验证方法的相对 DID URL
"#key-1"
]
}
在上面的示例中,相对 DID URL 值将被转换为
绝对 DID URL 值
did:example:123456789abcdefghi#key-1。
本规范定义了一个数据模型,可用于表达 DID 文档及其 内部数据结构,然后这些结构可以被序列化 为一种具体表达。本节提供了 数据模型的高层描述、不同类型属性在 数据模型中表达方式的描述,以及扩展数据模型的说明。
DID 文档由一个映射组成,其中包含若干条目,每个条目由一个 键/值对组成。DID 文档数据模型包含 5. 核心属性一节中规定的属性。
DID 文档数据模型中的所有条目键都是字符串。所有条目值均使用下表中的 一种数据类型来表达,并且每个表示形式 指定每种数据类型的 具体序列化格式。
| 数据 类型 | 考量 |
|---|---|
| 映射 | 键/值对的有限有序序列,其中不会有同一个键出现两次, 如 Infra Standard 所规定。映射有时 在 Infra Standard 中被称为 有序映射。 |
| 列表 | 有限有序的项目序列,如 Infra Standard 所规定。 |
| 集合 | 有限有序的项目序列,不包含同一项目两次, 如 Infra Standard 所规定。集合有时 在 Infra Standard 中被称为 有序集合。 |
| 日期时间 | 一种日期和时间值,能够无损表达 dateTime 可表达的所有值, 如 [XMLSCHEMA11-2] 所规定。 |
| 字符串 | 代码单元序列,通常用于表示人类可读语言, 如 Infra Standard 所规定。 |
| 整数 | 不带小数部分的实数, 如 [XMLSCHEMA11-2] 所规定。 为最大化互操作性, 强烈建议实现者注意 RFC8259 第 6 节:数字中 关于整数的建议。 |
| 双精度数 | 带小数部分的实数, 通常用于近似任意实数,如 [XMLSCHEMA11-2] 所规定。 为最大化互操作性,强烈建议实现者 注意 RFC8259 第 6 节:数字中 关于双精度数的建议。 |
| 布尔值 | 一个值,要么为 true,要么为 false,如 Infra Standard 中定义。 |
| null | 用于表示缺少值的值,如 Infra Standard 中定义。 |
由于数据模型使用 Infra Standard中的术语定义,能够包含多个 项目的属性值,例如列表、映射和集合,都被明确为有序。Infra Standard 中所有类似列表的 值结构都是有序的,无论这种顺序是否 具有意义。就本规范而言,除非另有说明, 映射或集合的顺序并不重要, 并且不期望实现以确定性顺序生产或消费 值。
数据模型支持两类可扩展性。
DID 与 DID 文档关联,后者是 受控标识符 v1.0中定义的 受控标识符 文档的扩展。 DID 文档使用 数据模型表达,并可序列化为一种 表示形式。 以下各节定义了 DID 文档中的属性, 包括这些属性是必需还是可选。这些属性 描述了 DID 主体与属性值之间的关系。
以下表格包含本规范定义的核心属性的资料性参考, 并列出期望值以及它们是否 必需。表格中的属性名称链接到 规范性定义以及每个属性的更详细描述。
属性名称 id、type 和
controller 可以出现在不同类型的映射中,
并且约束可能不同。例如,DID 文档顶层的 id
要求是一个 DID,而 service 映射中的
id 可以是一个 URL。
| 属性 | 是否必需? | 值约束 | 定义 |
|---|---|---|---|
id |
是 | 一个符合 3.1 DID 语法一节中定义规则的字符串。 | 5.1.1 DID 主体一节。 |
controller |
否 | 一个字符串,或一组 字符串的 集合,其中每个字符串都符合 3.1 DID 语法一节中定义的规则。 | 5.1.2 DID 控制者一节。 |
alsoKnownAs |
否 | 一组 字符串的 集合,其中每个字符串都符合 URL 语法或 3.1 DID 语法一节。 | 受控 标识符 v1.0规范的 第 2.1.3 节:又称。 |
service |
否 | 一组服务 映射的集合。 | 受控 标识符 v1.0规范的 第 2.1.4 节:服务。 |
verificationMethod |
否 | 一组 验证方法映射的 集合。 | 5.2 验证方法一节。 |
authentication |
否 | 一组数据的集合,其中每个元素 要么是一个符合 3.1 DID 语法一节中定义规则的字符串,要么是一个 符合 5.2 验证方法一节中定义的 验证方法规则的 映射。 | 受控 标识符 v1.0规范的 第 2.3.1 节:认证 以及 5.2 验证方法一节。 |
assertionMethod |
否 | 一组数据的集合,其中每个元素 要么是一个符合 3.1 DID 语法一节中定义规则的字符串,要么是一个 符合 5.2 验证方法一节中定义的 验证方法规则的 映射。 | 受控 标识符 v1.0规范的 第 2.3.2 节:断言 以及 5.2 验证方法一节。 |
keyAgreement |
否 | 一组数据的集合,其中每个元素 要么是一个符合 3.1 DID 语法一节中定义规则的字符串,要么是一个 符合 5.2 验证方法一节中定义的 验证方法规则的 映射。 | 受控 标识符 v1.0规范的 第 2.3.3 节:密钥协商 以及 5.2 验证方法一节。 |
capabilityInvocation |
否 | 一组数据的集合,其中每个元素 要么是一个符合 3.1 DID 语法一节中定义规则的字符串,要么是一个 符合 5.2 验证方法一节中定义的 验证方法规则的 映射。 | 受控 标识符 v1.0规范的 第 2.3.4 节:能力 调用 以及 5.2 验证方法一节。 |
capabilityDelegation |
否 | 一组数据的集合,其中每个元素 要么是一个符合 3.1 DID 语法一节中定义规则的字符串,要么是一个 符合 5.2 验证方法一节中定义的 验证方法规则的 映射。 | 受控 标识符 v1.0规范的 第 2.3.5 节:能力 委派 以及 5.2 验证方法一节。 |
| 属性 | 是否必需? | 值约束 | 定义 |
|---|---|---|---|
id |
是 | 一个符合 3.2 DID URL 语法中规则的字符串。 | 受控标识符 v1.0 规范的 第 2.1.1 节:主体 以及 5.1 标识符一节。 |
type |
是 | 一个字符串。 | 受控标识符 v1.0 规范的 第 2.2 节:验证 方法。 |
controller |
是 | 一个符合 3.1 DID 语法中规则的字符串。 | 受控标识符 v1.0 规范的 第 2.2 节:验证 方法。 |
publicKeyMultibase |
否 | 一个符合 Multibase 编码公钥的字符串。 | 受控标识符 v1.0 规范的 第 2.2.2 节:Multikey。 |
publicKeyJwk |
否 | 表示 JSON Web Key 的映射。 | 受控标识符 v1.0 规范的 第 2.2.3 节:JsonWebKey。 |
| 属性 | 是否必需? | 值约束 | 定义 |
|---|---|---|---|
id |
是 | 一个字符串,符合 URL Standard标准的规则,或符合 3.1 DID 语法一节。 | 受控标识符 v1.0 规范的 第 2.1.1 节:主体。 |
type |
是 | 一个字符串,或一组 字符串的 集合。 | 受控标识符 v1.0 规范的 第 2.1.4 节:服务。 |
serviceEndpoint |
是 | 一个单独的字符串、一个单独的 映射,或由一个或多个 字符串和/或 映射组成的 集合。每个字符串 值 MUST 是一个符合 URL Standard 的有效 URL。 | 受控 标识符 v1.0 规范的 第 2.1.4 节:服务。 |
本节描述 DID 文档 包含 DID 主体和 DID 控制者标识符的机制。
特定 DID 主体的
DID使用
DID 文档中的
id 属性表达。此属性
定义于 受控
标识符 v1.0规范的
第 2.1.1 节:主体,并由本规范扩展,以包含
去中心化标识符,如
3.1
DID 语法一节中所定义。
{
"id": "did:example:123456789abcdefghijk"
}
DID 控制者是被授权对 DID 文档进行更改的实体。此属性定义于 受控 标识符 v1.0规范的 第 2.1.2 节:控制者,并由本规范扩展,以包含 3.1 DID 语法一节中定义的 DID。授权 DID 控制者的过程由 DID 方法定义。
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123456789abcdefghi",
"controller": "did:example:bcehfew7h32f32h7af3"
}
DID 文档中用于标识
DID 主体或 DID
控制者的标识符不能使用查询参数或片段标识符。
强烈建议实现者特别注意
3.1
DID 语法一节中的允许
字符列表,该列表清楚说明了这一要求;
该
语法既不包含 ? 字符,也不包含 # 字符。这与
DID 文档中用于标识
验证
方法或 服务的标识符形成对比,后者遵循
3.2 DID URL 语法一节中的语法规则,这些规则允许使用查询参数和
片段
标识符。即便如此,在为 DID 生态系统创建的长期规范
标识符中使用查询参数也不被鼓励,因为这可能增加
DID 解析软件的复杂性,并可能导致更大的
安全攻击面。片段标识符也预期在特定
DID 文档内保持唯一,并且不鼓励实现者
随时间重用它们来指代不同的资源,例如同一
DID 文档内的两个不同
验证方法。
DID 文档可以表达验证方法,如
受控标识符
v1.0的
第 2.2 节:验证方法中所定义,
并增加以下限制:(a) id 值 MUST 符合
3.2 DID URL 语法一节或 3.2.1 相对
DID URL一节,并且 (b)
controller 值 MUST 符合 3.1 DID 语法一节。
有关验证方法的描述,见
受控
标识符 v1.0规范的
第 2.2 节:验证方法。
DID 文档可以表达验证关系, 如 受控标识符 v1.0规范的 第 2.3 节:验证 关系中所定义。有关 验证 方法的描述,见 受控标识符 v1.0规范的 第 2.3 节:验证 关系。
DID 文档可以表达服务,如 受控标识符 v1.0 规范的 第 2.1.4 节:服务中所定义。 服务中使用的标识符 可以按照 3.1 DID 语法一节或 3.2 DID URL 语法一节表达。有关 服务的描述,见 受控标识符 v1.0 规范的 第 2.1.4 节:服务。
本规范中 DID 文档的一种具体序列化称为 表示形式。表示形式 通过一个称为 生产的过程 对数据模型进行序列化来创建。表示形式通过一个称为 消费的过程 转换为数据模型。生产和消费 过程使信息能够从一种表示形式 转换为 另一种表示形式。本规范为 JSON 定义了一种单一的表示形式,该表示形式 也兼容执行 JSON-LD 处理的处理器。以下各节定义了 生产和 消费的一般规则,以及 JSON 表示形式。
除本规范中定义的表示形式外, 实现者还可以使用其他表示形式,前提是每个此类 表示形式都被适当规定(包括对 DID Extensions [DID-EXTENSIONS] 仓库中未列出的属性进行 互操作处理的规则)。更多信息见4.1 可扩展性。
对所有表示形式的要求如下:
dateTime 词法序列化来表示
日期时间。表示形式 MAY 选择
使用不同的词法序列化来序列化数据模型数据类型,只要
回到消费过程并进入数据模型时是无损的。例如,某些基于 CBOR 的
表示形式使用整数来表达
日期时间值,以表示自 Unix 纪元以来的秒数。
对所有符合要求的生产者的要求如下:
对所有符合要求的消费者的要求如下:
图的左上象限包含一个带灰色虚线 轮廓的矩形,其中包含两个蓝色轮廓的矩形,一个在上,一个在下。 上方较大的矩形以蓝色标记为 "Core Properties", 并包含以下 INFRA 表示法:
«[
"id" → "example:123",
"verificationMethod" → « «[
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Multikey",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
]» »,
"authentication" → «
"did:example:123#keys-1"
»
]»
下方较小的矩形以蓝色标记为 "Core Representation-specific
Entries (JSON-LD)",并包含以下等宽字体的 INFRA 表示法:
«[ "@context" → "https://www.w3.org/ns/did/v1.1" ]»
从灰色轮廓的矩形延伸出三对箭头,指向三个 不同的黑色轮廓矩形:一个位于图的右上方,一个 位于右下方,一个位于左下方。每对箭头由 一支从灰色轮廓矩形指向相应 黑色轮廓矩形的蓝色箭头组成,标记为 "produce";以及一支指向 相反方向的红色箭头,标记为 "consume"。右上方的黑色轮廓矩形 标记为 "application/did+cbor",并包含十六进制数据。 右下方的矩形标记为 "application/did",并包含 以下 JSON 数据:
{
"id": "did:example:123",
"verificationMethod": [{
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Multikey",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}],
"authentication": [
"did:example:123#keys-1"
]
}
左下方的矩形标记为 "application/did",并 包含以下 JSON-LD 数据:
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123",
"verificationMethod": [{
"id": "did:example:123#keys-1",
"controller": "did:example:123",
"type": "Multikey",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}],
"authentication": [
"did:example:123#keys-1"
]
}
DID 文档、DID 文档数据结构以及 特定于表示形式的条目映射 MUST 按照以下 生产规则序列化为 JSON 表示形式:
| 数据 类型 | JSON 表示形式类型 |
|---|---|
| 映射 | 一个 JSON 对象,其中每个 条目都被序列化为 JSON 对象的一个成员,条目键作为JSON 字符串成员名称, 条目值 按其类型序列化,如本表所定义。 |
| 列表 | 一个 JSON 数组,其中 列表的每个元素都按顺序序列化为数组的一个值,并根据其类型处理,如 本表所定义。 |
| 集合 | 一个 JSON 数组,其中集合的每个 元素都按顺序作为数组的一个值添加,并根据其类型处理,如 本表所定义。 |
| 日期时间 |
一个JSON 字符串,序列化为
归一化到 UTC 00:00:00 且不带小数秒精度的
XML Datetime。例如:
2020-12-20T19:17:47Z。
|
| 字符串 | 一个 JSON 字符串。 |
| 整数 | 一个不带小数点或 小数部分的 JSON 数字。 |
| 双精度数 | 一个带小数点和 小数部分的 JSON 数字。 |
| 布尔值 | 一个 JSON 布尔值。 |
| null | 一个 JSON null 字面量。 |
建议所有创建产生 JSON 表示形式的 符合要求的生产者的实现者, 确保其算法与 [INFRA] 规范中的JSON 序列化规则以及 JSON [RFC8259] 规范中关于数字精度的建议保持一致。
DID 文档的所有条目 MUST 包含在
根 JSON 对象中。条目 MAY 包含额外
数据子结构,但须遵循上表中的值表示规则。
序列化 DID 文档时,符合要求的生产者 MUST
向下游应用指定媒体类型 application/did。
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123456789abcdefghi",
"authentication": [{
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Multikey",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}]
}
DID 文档和 DID 文档数据结构的 JSON 表示形式 MUST 按照以下消费规则 反序列化为数据 模型:
| JSON 表示形式类型 | 数据 类型 |
|---|---|
| JSON 对象 | 一个映射,其中 JSON 对象的每个成员都作为一个条目添加到映射中。每个条目键设置为 JSON 对象成员名称。每个条目值通过按照本表定义的 JSON 表示形式类型 转换 JSON 对象成员值来设置。 由于 JSON 对象不规定顺序,因此不保证插入顺序。 |
| JSON 数组,其中数据模型条目值是列表或未知 | 一个列表,其中 JSON 数组的每个值都按顺序 添加到列表中,并根据数组值的 JSON 表示形式类型进行转换, 如本表所定义。 |
| JSON 数组,其中数据模型条目值是集合 | 一个集合,其中 JSON 数组的每个值都按顺序添加到集合中,并根据该数组值的 JSON 表示形式类型进行转换,如本表所定义。 |
| JSON 字符串,其中 数据模型条目值是日期时间 | 一个日期时间。 |
| JSON 字符串,其中数据模型条目值类型是字符串或 未知 | 一个字符串。 |
| 不带小数点或 小数部分的 JSON 数字 | 一个整数。 |
| 带小数点和小数 部分的 JSON 数字, 或者当条目值是双精度数时, 无论是否包含 小数部分 | 一个双精度数。 |
| JSON 布尔值 | 一个布尔值。 |
| JSON null 字面量 | 一个null 值。 |
建议所有创建符合要求的生产者或符合要求的消费者的实现者, 确保其算法与 [INFRA] 规范中的JSON 转换规则以及 JSON [RFC8259] 规范中关于数字精度的建议保持一致。
如果符合要求的消费者可以获得媒体类型信息,并且
媒体类型值为 application/did,则正在消费的数据结构
是一个DID 文档,并且根元素
MUST 是一个JSON
对象,其中对象的所有成员
都是 DID 文档的条目。消费根
元素不是JSON 对象的
DID 文档时,JSON
表示形式的符合要求的消费者 MUST
报告错误。
JSON-LD 是一种基于 JSON 的格式,用于序列化 链接数据。预期某些 实现会使用标准 JSON-LD 处理算法来处理DID 文档。为最大化互操作性,强烈建议实现者 确保不会阻止使用符合标准的库进行 JSON-LD 处理。 无论是否使用符合标准的库执行 JSON-LD 处理, DID 文档 的语义都是相同的。语义上的任何差异都是实现或 DID 方法规范中的错误。
要进行 JSON-LD 处理,@context 属性 MUST 按照
JSON-LD
1.1 规范中规定的规则指定。
DID 文档、DID 文档数据结构以及 特定于表示形式的条目映射 MUST 按照 6.2 JSON 中定义的 JSON 表示形式生产规则, 序列化为 JSON 表示形式。
除使用 JSON 表示形式生产规则外,
生产过程 MUST 包含
@context 条目。@context 的序列化值
MUST 是 JSON
字符串 https://www.w3.org/ns/did/v1.1,或一个JSON 数组,其中第一项是
JSON 字符串
https://www.w3.org/ns/did/v1.1,后续项目则
按照 JSON 生产规则序列化。
{
"@context": "https://www.w3.org/ns/did/v1.1",
...
}
{
"@context": [
"https://www.w3.org/ns/did/v1.1",
"https://did-method-extension.example/v1"
],
...
}
建议所有创建用于作为 JSON-LD 处理的表示形式的 符合要求的消费者 的实现者,确保其算法生产有效的 JSON-LD 文档。无效的 JSON-LD 文档会导致 JSON-LD 处理器停止并报告错误。
为实现不同表示形式之间的互操作性, 所有 JSON-LD 上下文及其术语 SHOULD 注册到 去中心化标识符扩展仓库中。
生成 JSON-LD 表示形式的
符合要求的生产者
SHOULD NOT 生产包含未通过
@context 定义的术语的DID 文档,
因为符合要求的消费者预期会移除
未知术语。在序列化 DID
文档的 JSON-LD 表示形式时,符合要求的生产者 MUST 向下游应用指定媒体类型
application/did。
处理 JSON-LD 表示形式的
符合要求的消费者 SHOULD
从DID 文档中删除所有未通过
@context 定义的术语。
实现 MUST 将位于
https://www.w3.org/ns/did/v1.1 的基本上下文值视为已经检索;
以下值是基本
上下文文件的十六进制编码 SHA2-256 摘要值:
ea216ecc1cb02cd39b693dba2250141e270ba0bf95890be107dd9a9e8e43de85。
可以通过在现代
Unix 命令行界面中运行以下命令来确认
上述密码学摘要:
curl -s https://www.w3.org/ns/did/v1.1 | openssl dgst -sha256。
警告实现者,从DID 文档内部引用的其他数据, 例如通过 URL 链接的资源,默认情况下并不 受到密码学保护。最佳实践是 确保对任何对 DID 文档安全性至关重要的 URL, 通过使用永久缓存文件和/或密码学哈希提供 同类保护。最终,知道任何已链接外部内容的 密码学摘要,可以使应用确认该内容与 DID 控制者所意图的内容相同。
本规范中具有关联密码学哈希 值的文件极不可能发生变化。但是,如果在规范中发现关键勘误, 且需要修正以确保 生态系统稳定性,则密码学哈希值可能会发生变化。因此, 这些文件的 HTTP 缓存时间并未设置为无限,并建议实现者 在检测到密码学哈希 值变化时检查勘误。
媒体类型,如 [RFC6838] 中所定义,用于标识表达 DID 文档所使用的语法以及其他有用的处理指南。
本规范中用于表达数据模型的语法 SHOULD 由媒体类型标识, 并且在定义或使用带有 DID 文档的媒体类型时, SHOULD 遵循本节中概述的约定。
有一种媒体类型与核心数据模型关联,它
列在 E. IANA 考量一节中:
application/did。
本节为非规范性内容。
有时,开发者或系统可能使用较低精确性的媒体类型来传达 DID 文档。使用 较低精确性媒体类型的一些原因包括:
text/plain 或 application/octet-stream。
.json 可能产生
application/json 媒体类型,而 .jsonld 可能产生
application/ld+json 媒体类型。
application/json 而不是 application/did,
在可以从载荷确定预期媒体类型的情况下,只要所使用的媒体类型在给定协议中
可接受,就不鼓励实现者抛出错误。例如,如果某个应用只接受
符合 application/did 媒体
类型相关规则的载荷,但该载荷标记为较低精确性的 application/json 或
application/ld+json,该应用可能执行以下步骤来
确定该载荷是否也符合更高精确性的媒体类型:
@context 属性的第一个元素匹配
https://www.w3.org/ns/did/v1.1。
id 属性,且其中包含符合
3.1 DID 语法一节中规则的标识符,
则假定其媒体类型为 application/did。
只要可能,建议实现者对本规范定义的所有载荷使用最精确(最高 精确性)的媒体类型。 还建议实现者认识到,标记为较低 精确性媒体类型的载荷,并不意味着该载荷不满足 将其标记为更高精确性类型所需的规则。类似地,标记 为更高精确性媒体类型的载荷,并不意味着该载荷将满足与该 媒体类型相关联的要求。无论载荷关联的媒体类型如何, 载荷接收方都应执行适当检查, 以确保载荷符合其在给定 系统中使用的要求。
HTTP 客户端和服务器在
Accept: 标头中以及指示内容类型时,使用与DID
文档关联的媒体类型。警告实现者:
HTTP 服务器可能会忽略 Accept: 标头并返回另一种内容类型,或
返回错误代码,例如 415
Unsupported Media Type。
符合要求的 DID 方法定义了实现者如何实现 本规范所描述的特性。DID 方法通常与特定 可验证数据注册表相关联。新的 DID 方法在其 自身规范中定义,以实现同一 DID 方法的不同 实现之间的互操作性。
从概念上讲,本规范与 DID 方法规范之间的关系,
类似于 IETF 通用
URI
规范 [RFC3986] 与特定 URI
方案
[IANA-URI-SCHEMES](例如
http 方案 [RFC9110])之间的关系。除
定义特定的 DID 方案外,DID 方法
规范还定义了使用特定类型
可验证数据注册表创建、解析、更新和
停用 DID 和 DID 文档的机制。
它还记录了与 DID相关的所有实现
考量,以及安全和隐私
考量。
本节规定了编写 DID 方法 规范的要求。
所有 DID 方法规范在定义 特定于方法的 DID 语法时的要求如下:
method-name 规则指定的正好一个方法名称标识。
method-specific-id 组件。
method-specific-id 值的
大小写敏感性和规范化。
method-specific-id 值 MUST 在一个 DID 方法内唯一。method-specific-id 值本身
也可能是全局
唯一的。
method-name 冲突的可能性,DID 方法
规范 SHOULD 注册到 DID Extensions
[DID-EXTENSIONS] 仓库中。
method-specific-id 格式。
method-specific-id 格式 MAY 包含冒号。冒号的使用
MUST 在语法上符合 method-specific-id
ABNF
规则。
所有 DID 方法规范在定义 方法操作时的要求如下:
执行授权以实施这些 操作的一方的权威性,取决于具体 DID 方法。例如,DID 方法 可能 —
controller 属性。
authentication 下的 验证方法。
capabilityInvocation
验证
关系指定的 验证
方法。
执行方法操作时,DID 方法可以使用其所需的任何数据结构, 包括中间的、部分的或临时的 DID 文档, 只要 它们保留在 DID 方法内部,并且方法操作返回的 DID 文档 完全符合要求,如 1.4 一致性中所定义。
所有 DID 方法规范在编写 安全考量章节时的要求如下:
所有 DID 方法规范在编写 隐私考量章节时的要求是:
本节为非规范性内容。
本节包含使用去中心化标识符的人们在将此 技术部署到生产环境之前应考虑的各种安全考量。 强烈建议读者在阅读本节之前先阅读 受控标识符 v1.0规范的 安全考量章节。 DID 被设计为在许多 IETF 标准使用并记录于 [RFC3552] 的威胁模型下运行。本节 详细阐述了 [RFC3552] 中的若干考量, 以及其他 DID 架构特有的考量。
DID Extensions [DID-EXTENSIONS] 仓库包含 DID 方法名称及其对应 DID 方法规范的 资料性列表。实现者需要记住, 不存在中央权威机构来规定应将哪个 DID 方法规范用于 任何特定的 DID 方法名称。如果对某个特定 DID 解析器是否正确实现某个 DID 方法 存有疑问,则可以使用 DID 规范注册表查找已注册的规范, 并就使用哪个 DID 解析器 实现作出知情决策。
如果满足以下条件,则支持 DID 和 DID 文档更新的不可否认性:
无信任系统是指所有信任都源自密码学上
可证明断言的系统,更具体地说,是指在确定系统中的信任时,
不将密码学系统之外的任何元数据纳入考虑的系统。
为了验证无信任系统中已撤销的
验证方法的签名或证明,
DID 方法需要支持
versionId 或 versionTime 中的一个或两个,以及
updated 和
nextUpdate 这两个 DID 文档元数据属性。当且仅当以下全部为
真时,验证者可以验证
被撤销密钥的签名或证明:
versionId 或
versionTime。
updated 时间戳
早于签名或证明生成的时间点,而 nextUpdate 时间戳
晚于该时间点。
在愿意接受超出密码学输入之外的元数据的系统中, 也可以实现类似信任——但这始终需要 仔细判断 DID 文档的内容在签名事件发生时 是否包含预期内容。
恢复是一种反应性安全措施,通过这种措施,一个由于 设备丢失等原因而失去执行 DID 操作能力的 控制者 能够重新获得执行 DID 操作的能力。
在考虑使用 DID 恢复时,以下考量可能有用:
DID 在不需要中央 注册机构的情况下实现全局唯一性。这以牺牲人类可记忆性为代价。 能够生成全局无歧义标识符的算法 会产生没有人类含义的随机字符串。这种 权衡通常称为 Zooko 三角。
有些用例需要从人类友好标识符出发来发现 DID。例如,自然语言 名称、域名,或 DID 控制者的常规地址, 例如移动电话号码、电子邮件地址、社交媒体用户名或 博客 URL。但是,将人类友好标识符映射到 DID,并以可验证且可信的方式完成该映射的问题, 不在本规范范围内。
针对此问题的解决方案定义在引用本规范的单独规范中,例如 [DNS-DID]。强烈建议 此类规范仔细考虑:
如果 DID 控制者希望如此,DID 或 DID URL 能够 充当持久的、位置无关的资源标识符。 此类标识符 被归类为统一资源名称(URN),并定义于 [RFC8141]。 DID 是 URN 的增强形式,为数字 资源提供密码学安全、位置无关的标识符,同时也提供可实现检索的元数据。 由于 DID 文档与 DID 本身之间存在 间接层,DID 控制者可以调整资源的实际位置——或者 甚至直接提供该资源——而无需调整 DID。 此类 DID 可以确定性地验证所检索的资源 实际上就是被标识的资源。
许多网络安全滥用都取决于利用现实与 理性、善意参与者假设之间的差距。DID 文档的不可变性 可以提供一些安全收益。各个 DID 方法应 考虑去除其不需要的行为或语义的约束。 在提供相同特性集合的同时,DID 方法越 锁定,就越不容易被恶意行为者操纵。
作为示例,请考虑对 DID 文档的一次编辑
可以更改
除文档根 id 属性之外的任何内容。但
服务在定义后更改其
type 是否真的可取?或者密钥更改其值是否可取?又或者
当对象的某些基本属性发生变化时,要求使用新的 id 是否
更好?网站的恶意接管通常旨在达到这样的结果:网站保留其主机名标识符,
但底层已被微妙地更改。如果规范要求网站的某些属性(例如
与其 IP 地址关联的 ASN)
不可变,则异常检测会更容易,攻击也会
更难且成本更高。
对于绑定到全局事实来源的 DID 方法,直接、 即时查找 DID 文档的最新版本始终 是可能的。然而,似乎缓存层最终可能会位于 DID 解析器与该事实来源之间。如果确实如此, 当 DID 文档中对象的属性实际上存在细微差异时 却相信它们处于某种给定状态,可能会招致利用。这一点在某些查找是完整 DID 文档, 而 另一些查找是基于假定更大上下文的部分数据时尤其如此。
已知加密算法可能会由于密码学和计算能力的进步而失效。 建议实现者假定,放置在 DID 文档中的任何加密数据,最终都可能以明文形式 提供给与加密数据可见范围相同的受众。如果 DID 文档是公开的,这一点尤其相关。
加密 DID 文档的全部或部分内容 不是长期保护数据的适当 手段。同样,将加密数据放入 DID 文档也不是保护个人 数据的适当手段。
鉴于上述注意事项,如果在 DID 文档中包含加密数据, 建议实现者不要关联任何可关联信息, 这些信息可能用于推断加密数据 与关联方之间的关系。可关联信息的示例包括 接收方的公钥、已知由接收方控制的数字资产标识符, 或对接收方的人类可读描述。
鉴于 equivalentId 和 canonicalId
属性由 DID 方法自身生成,适用于已解析
DID(出现在
DID 文档的 id 字段中)的相同安全和
准确性保证也适用于这些
属性。
alsoKnownAs 属性并不保证是准确的
等价声明,且不应在未执行
超出解析 DID 文档之外的验证步骤时依赖它。
equivalentId 和 canonicalId
属性表达了对由同一 DID 方法产生的单个 DID变体的等价断言,
其可信程度取决于
请求方对 DID 方法以及符合要求的生产者和
解析器的信任程度。
alsoKnownAs 属性允许对不受同一
DID 方法管辖的
URI
作出等价断言,并且在未执行管辖 DID 方法之外的验证步骤时,不能被
信任。另请参阅
受控标识符
v1.0规范的
第 2.1.3 节:又称中的附加指导。
与 DID 文档中的任何其他安全相关属性一样, 依赖 DID 文档中任何等价声明的一方 应当 防止这些属性的值在完成适当验证后被攻击者替换。 对验证后存储在内存或磁盘中的 DID 文档的任何写访问 都是一种攻击向量,除非重新验证该 DID 文档, 否则可能绕过验证。
DID 被设计为具有持久性,使得 控制者无需 依赖单个受信任第三方或管理员来维护其 标识符。在理想情况下,没有管理员可以从 控制者手中夺取控制权,也没有 管理员可以阻止其标识符 用于认证、授权和证明等任何特定目的。 任何第三方都不能代表 控制者移除或使 某个实体的标识符不可操作,除非获得该 控制者的同意。
然而,需要注意的是,在所有支持密码学控制证明的 DID 方法中,证明控制权的手段总是可以通过转移秘密密码学材料 转移给另一方。 因此,依赖标识符长期持久性的系统 必须定期检查,以确保该标识符事实上仍处于 预期方的控制之下。
遗憾的是,仅凭密码学无法确定 与给定 验证 方法关联的秘密密码学材料是否已被泄露。很可能 预期的 控制者 仍然可以访问该秘密密码学材料 ——并因此能够作为验证 过程的一部分执行控制证明——与此同时,恶意行为者也能访问这些 相同密钥或其副本。
因此,密码学控制证明预期只能作为评估高风险 场景所需身份保证级别的一个 因素。基于 DID的认证提供的保证远高于 用户名和密码,因为它能够在系统之间不传输秘密的情况下确定对 密码学秘密的控制权。然而, 它并非绝对可靠。涉及敏感、高价值或 生命关键操作的场景,预期应酌情使用额外因素。
除了由不同 控制者使用可能带来的歧义之外, 通常也无法保证给定 DID 在任何给定时间点 都是在指代同一主体。从技术上讲, 控制者可能将 DID 重用于不同主体,并且 更微妙地说,主体的精确定义可能随 时间变化或被误解。
例如,考虑一个用于独资企业的 DID,它接收 用于金融交易的各种凭证。对 控制者而言, 该标识符指代该企业。随着企业发展,它最终 注册成为有限责任公司。该 控制者 继续使用同一个 DID,因为对 他们而言,该 DID 指代该企业。然而,对于州政府、税务机关和 地方市政机构而言,该 DID 不再指代 同一实体。 这种含义上的微妙转变对信贷提供方或 供应商是否重要,必然由他们决定。在许多情况下,只要 账单得到支付且催收可以执行,这种转变并不重要。
由于这些潜在歧义,DID 应被视为在 上下文中有效,而不是绝对有效。它们的持久性并不意味着 它们指代完全相同的主体,也不意味着它们处于同一 控制者的控制之下。 相反,需要理解 DID 创建的上下文、它如何被使用,并考虑 其含义可能发生的转变,同时采用流程和策略来应对潜在 以及不可避免的语义漂移。
本节为非规范性内容。
本规范不要求也不建议使用任何特定类型的 可验证数据注册表。不同用例可能 导致不同要求。不同要求可能会产生具有不同权衡的不同考量。 例如,在计算(能源使用)、信任 (服从权威)、协调(网络带宽)或内存(物理 存储)之间的权衡,对于任何给定用例可能适用,也可能不适用。其他用例 可能不会作出相同权衡。那些需要为其用例考虑不同标准的人 可参考 DID Method Rubric,该文档提供 评估标准,帮助决策者确定某个特定 DID 方法是否适合其用例。
本节为非规范性内容。
由于 DID 和 DID 文档被 设计为直接由 DID 控制者管理,因此将 Privacy by Design [PRIVACY-BY-DESIGN] 原则应用于 去中心化标识符架构的所有方面至关重要。 这七项原则在本规范的整个制定过程中都得到了应用。本规范所采用的设计 并不假定存在注册机构、托管 公司或其他中间服务提供商来建议或应用 额外的隐私保护措施。本规范中的隐私是预防性的, 而非补救性的,并且是内嵌的默认设置。在阅读本节之前,强烈建议读者 阅读 受控标识符 v1.0 规范的 隐私考量章节,因为其中包含 也适用于 DID的更一般性隐私考量。本节其余部分 涵盖特定于 去中心化标识符的隐私考量,并补充 受控标识符 v1.0 规范中提供的指导。
当 DID 主体与群体中的其他主体无法区分时, 隐私才可获得。当私下与另一方交互这一行为本身 就是一个可识别标志时,隐私会大幅减弱。
DID 和 DID 方法需要 致力于改善群体隐私,特别是为那些 合法且最需要它的人改善群体隐私。应选择默认保留匿名性和假名性的 技术和人机界面。为减少数字 指纹,应在请求方 实现之间共享通用设置,尽量减少有线协议上的协商选项,使用 加密传输层,并将消息填充到标准长度。
本节为非规范性内容。
本节为非规范性内容。
可选扩展和其他验证方法类型,见 验证方法类型 [DID-EXTENSIONS]。
这些示例仅供参考,最佳实践是避免将同一个验证方法用于 多个 目的。
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123",
"authentication": [
{
"id": "did:example:123#z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu",
"type": "Multikey", // external (property value)
"controller": "did:example:123",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}
],
"capabilityInvocation": [
{
"id": "did:example:123#z6Mkvtac9bidSz9bBttzn7Yg3oCDHvMY2FtkFLs6SXRQGdQR",
"type": "Multikey", // external (property value)
"controller": "did:example:123",
"publicKeyMultibase": "z6Mkvtac9bidSz9bBttzn7Yg3oCDHvMY2FtkFLs6SXRQGdQR"
}
],
"capabilityDelegation": [
{
"id": "did:example:123#z6MknxsdF4CGVxhRNsx6TvXPFczaHEkajKBBwu75uwBmgpom",
"type": "Multikey", // external (property value)
"controller": "did:example:123",
"publicKeyMultibase": "z6MknxsdF4CGVxhRNsx6TvXPFczaHEkajKBBwu75uwBmgpom"
}
],
"assertionMethod": [
{
"id": "did:example:123#z6MkgYhVuWq4hyc7ZKBGhsY7pb5Bc8V6VPXGPG3EPja8JBFR",
"type": "Multikey", // external (property value)
"controller": "did:example:123",
"publicKeyMultibase": "z6MkgYhVuWq4hyc7ZKBGhsY7pb5Bc8V6VPXGPG3EPja8JBFR"
}
]
}
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123",
"verificationMethod": [
{
"id": "did:example:123#key-0",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "OKP", // external (property name)
"crv": "Ed25519", // external (property name)
"x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ" // external (property name)
}
},
{
"id": "did:example:123#key-1",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "OKP", // external (property name)
"crv": "X25519", // external (property name)
"x": "pE_mG098rdQjY3MKK2D5SUQ6ZOEW3a6Z6T7Z4SgnzCE" // external (property name)
}
},
{
"id": "did:example:123#key-2",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // external (property name)
"crv": "secp256k1", // external (property name)
"x": "Z4Y3NNOxv0J6tCgqOBFnHnaZhJF6LdulT7z8A-2D5_8", // external (property name)
"y": "i5a2NtJoUKXkLm6q8nOEu9WOkso1Ag6FTUT6k_LMnGk" // external (property name)
}
},
{
"id": "did:example:123#key-3",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // external (property name)
"crv": "secp256k1", // external (property name)
"x": "U1V4TVZVMUpUa0ZVU1NBcU9CRm5IbmFaaEpGNkxkdWx", // external (property name)
"y": "i5a2NtJoUKXkLm6q8nOEu9WOkso1Ag6FTUT6k_LMnGk" // external (property name)
}
},
{
"id": "did:example:123#key-4",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // external (property name)
"crv": "P-256", // external (property name)
"x": "Ums5WVgwRkRTVVFnU3k5c2xvZllMbEcwM3NPRW91ZzN", // external (property name)
"y": "nDQW6XZ7b_u2Sy9slofYLlG03sOEoug3I0aAPQ0exs4" // external (property name)
}
},
{
"id": "did:example:123#key-5",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // external (property name)
"crv": "P-384", // external (property name)
"x": "VUZKSlUwMGdpSXplekRwODhzX2N4U1BYdHVYWUZsaXVDR25kZ1U0UXA4bDkxeHpE", // external (property name)
"y": "jq4QoAHKiIzezDp88s_cxSPXtuXYFliuCGndgU4Qp8l91xzD1spCmFIzQgVjqvcP" // external (property name)
}
},
{
"id": "did:example:123#key-6",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // external (property name)
"crv": "P-521", // external (property name)
"x": "VTI5c1lYSmZWMmx1WkhNZ0dQTXhaYkhtSnBEU3UtSXZwdUtpZ0VOMnB6Z1d0U28tLVJ3ZC1uNzhuclduWnplRGMx", // external (property name)
"y": "UW5WNVgwSnBkR052YVc0Z1VqY1B6LVpoZWNaRnliT3FMSUpqVk9sTEVUSDd1UGx5RzBnRW9NV25JWlhoUVZ5cFB5" // external (property name)
}
},
{
"id": "did:example:123#key-7",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "RSA", // external (property name)
"e": "AQAB", // external (property name)
"n": "UkhWaGJGOUZRMTlFVWtKSElBdENGV2hlU1F2djFNRXh1NVJMQ01UNGpWazlraEpLdjhKZU1YV2UzYldIYXRqUHNrZGYyZGxhR2tXNVFqdE9uVUtMNzQybXZyNHRDbGRLUzNVTElhVDFoSkluTUhIeGoyZ2N1Yk82ZUVlZ0FDUTRRU3U5TE8wSC1MTV9MM0RzUkFCQjdRamE4SGVjcHl1c3BXMVR1X0RicXhjU253ZW5kYW13TDUyVjE3ZUtobE80dVh3djJIRmx4dWZGSE0wS21DSnVqSUt5QXhqRF9tM3FfX0lpSFVWSEQxdERJRXZMUGhHOUF6c24zajk1ZC1zYU" // external (property name)
}
}
]
}
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123",
"verificationMethod": [{
"id": "did:example:123#key-0",
"type": "Multikey",
"controller": "did:example:123",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}, {
"id": "did:example:123#key-1",
"type": "Multikey",
"controller": "did:example:123",
"publicKeyMultibase": "z6MtTjFFxQ4sQKS2wmozFAn5cxukmM46WR7e2vxfqZQsv4eh"
}, {
"id": "did:example:123#key-2",
"type": "EcdsaSecp256k1VerificationKey2019",
"controller": "did:example:123",
"publicKeyMultibase": "zns2aFDq25fEV1NUd3wZ65sgtht4j5QjFW8JCAHdUJfLwfodt"
}, {
"id": "did:example:123#key-3",
"type": "JsonWebKey",
"controller": "did:example:123",
"publicKeyJwk": {
"kty": "EC", // external (property name)
"crv": "P-256", // external (property name)
"x": "Er6KSSnAjI70ObRWhlaMgqyIOQYrDJTE94ej5hybQ2M",
"y": "pPVzCOTJwgikPjuUE6UebfZySqEJ0ZtsWFpj7YSPGEk"
}
}]
}
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123",
"verificationMethod": [
{
// 一个相对 DID URL,将被转换为绝对 DID URL 值 did:example:123#key-1
"id": "#key-1",
"type": "Ed25519VerificationKey2020",
"controller": "did:example:123",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}
],
"authentication": [
"#key-1"
],
"capabilityInvocation": [
"#key-1"
],
"capabilityDelegation": [
"#key-1"
],
"assertionMethod": [
// 使用相对 DID URL #key-1 等同于使用绝对 DID URL 值 did:example:123#key-1
"did:example:123#key-1"
]
}
本节为非规范性内容。
这些示例仅供参考。有关更多示例,见 可验证凭证数据模型 v2.0。
{
// external (all terms in this example)
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/citizenship/v4rc1"
],
"type": [
"VerifiableCredential",
"PermanentResidentCardCredential"
],
"issuer": {
"id": "did:key:zDnaeYGXycLmAn5m9akGtdL6rqBspGQPM7QZXW2CvJ3k9c2Bz",
"image": "data:image/png;base64,iVBORw0KGgo...5CYII="
},
"name": "Permanent Resident Card",
"description": "Government of Utopia Permanent Resident Card.",
"credentialSubject": {
"type": [
"PermanentResident",
"Person"
],
"givenName": "JANE",
"familyName": "SMITH",
"gender": "Female",
"image": "data:image/png;base64,iVBORw0KGgoAA...kJggg==",
"residentSince": "2015-01-01",
"commuterClassification": "C1",
"birthCountry": "Arcadia",
"birthDate": "1978-07-17",
"permanentResidentCard": {
"type": "PermanentResidentCard",
"identifier": "83627465",
"lprCategory": "C09",
"lprNumber": "999-999-999"
}
},
"validFrom": "2025-01-04T00:00:00Z",
"validUntil": "2026-01-04T23:59:59Z",
"proof": {
"type": "DataIntegrityProof",
"created": "2025-01-04T15:02:36Z",
"verificationMethod": "did:key:zDnaeYGXycLmAn5m9akGtdL6rqBspGQPM7QZXW2CvJ3k9c2Bz#zDnaeYGXycLmAn5m9akGtdL6rqBspGQPM7QZXW2CvJ3k9c2Bz",
"cryptosuite": "ecdsa-rdfc-2019",
"proofPurpose": "assertionMethod",
"proofValue": "z5CK4DPN7...Jpqwp"
}
}
{ // external (all terms in this example)
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/citizenship/v4rc1"
],
"type": [
"VerifiableCredential",
"PermanentResidentCardCredential"
],
"issuer": {
"id": "did:example:123#key-1",
"image": "data:image/png;base64,iVBORw0KGgo...5CYII="
},
"name": "Permanent Resident Card",
"description": "Government of Utopia Permanent Resident Card.",
"credentialSubject": {
"type": [
"PermanentResident",
"Person"
],
"givenName": "JANE",
"familyName": "SMITH",
"gender": "Female",
"image": "data:image/png;base64,iVBORw0KGgoAA...kJggg==",
"residentSince": "2015-01-01",
"commuterClassification": "C1",
"birthCountry": "Arcadia",
"birthDate": "1978-07-17",
"permanentResidentCard": {
"type": "PermanentResidentCard",
"identifier": "83627465",
"lprCategory": "C09",
"lprNumber": "999-999-999"
}
},
"validFrom": "2025-01-04T00:00:00Z",
"validUntil": "2026-01-04T23:59:59Z",
"proof": {
"type": "DataIntegrityProof",
"created": "2025-01-04T15:02:36Z",
"verificationMethod": "did:example:123#key-1",
"cryptosuite": "ecdsa-jcs-2019",
"proofPurpose": "assertionMethod",
"proofValue": "z5m9akGtdL...6rqBspGQP"
}
}
{ // external (all terms in this example)
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/citizenship/v4rc1"
],
"type": [
"VerifiableCredential",
"PermanentResidentCardCredential"
],
"issuer": {
"id": "did:key:zUC7DojAAkoD8WpSS87KG6iuMSBd4wH1fZzmcwmakx4JfaXN7RLSES4wNCfWboHvULxGxRwiSsj6UYSgq1dWGusdwrrJsjUQQEb1oid3igF4hbSFzFjf9aWTJSphhu63vHGoAVE",
"image": "data:image/png;base64,iVBORw0KGgoAA...CYII="
},
"name": "Permanent Resident Card",
"description": "Government of Utopia Permanent Resident Card.",
"credentialSubject": {
"type": [
"PermanentResident",
"Person"
],
"givenName": "JANE",
"familyName": "SMITH",
"gender": "Female",
"image": "data:image/png;base64,iVBORw0KGgoAAA...3dgg==",
"residentSince": "2015-01-01",
"commuterClassification": "C1",
"birthCountry": "Arcadia",
"birthDate": "1978-07-17",
"permanentResidentCard": {
"type": "PermanentResidentCard",
"identifier": "83627465",
"lprCategory": "C09",
"lprNumber": "999-999-999"
}
},
"validFrom": "2025-01-04T00:00:00Z",
"validUntil": "2026-01-04T23:59:59Z",
"proof": {
"type": "DataIntegrityProof",
"verificationMethod": "did:key:zUC7DojAAkoD8WpSS87KG6iuMSBd4wH1fZzmcwmakx4JfaXN7RLSES4wNCfWboHvULxGxRwiSsj6UYSgq1dWGusdwrrJsjUQQEb1oid3igF4hbSFzFjf9aWTJSphhu63vHGoAVE#zUC7DojAAkoD8WpSS87KG6iuMSBd4wH1fZzmcwmakx4JfaXN7RLSES4wNCfWboHvULxGxRwiSsj6UYSgq1dWGusdwrrJsjUQQEb1oid3igF4hbSFzFjf9aWTJSphhu63vHGoAVE",
"cryptosuite": "bbs-2023",
"proofPurpose": "assertionMethod",
"proofValue": "u2V0ChVhQik2d4...pc3N1ZXI"
}
}
{
// external (all terms in this example)
"@context": "https://www.w3.org/ns/credentials/v2",
"type": "VerifiablePresentation",
// 持有者 did:key 与该域成对,以避免关联
"holder": "did:key:z6MkveKdpgkQ1pwNktQ5Lc19epBrzFjMUeNMUZGFvezFF2dX",
"verifiableCredential": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/citizenship/v4rc1"
],
"type": [
"VerifiableCredential",
"PermanentResidentCardCredential"
],
"issuer": {
"id": "did:web:unlinkable.example",
"image": "data:image/png;base64,iVBORw0KGgoAA...CYII="
},
"credentialSubject": {
"type": ["PermanentResident", "Person"],
// 仅选择性披露国家
"birthCountry": "Arcadia"
},
"proof": {
"type": "DataIntegrityProof",
"verificationMethod": "did:web:vcplayground.org#zUC7EwMqo9vCjFmj7ArU2SivcbeccAY6hd4nw5fVD6xD4W2vm9eVy6VqVnciAZRmPLXnuxuka5JTJVmgz66CxDno6eqZmvUViCckCcKg8A4s1R4i2JjyzrdTQs5zrfY4jJCHFCp",
"cryptosuite": "bbs-2023",
"proofPurpose": "assertionMethod",
"proofValue": "u2V0DhV...3JnIn0"
}
},
"proof": {
"type": "DataIntegrityProof",
"created": "2025-01-04T15:10:39Z",
"verificationMethod": "did:key:z6MkveKdpgkQ1pwNktQ5Lc19epBrzFjMUeNMUZGFvezFF2dX#z6MkveKdpgkQ1pwNktQ5Lc19epBrzFjMUeNMUZGFvezFF2dX",
"proofPurpose": "authentication",
"challenge": "QZVVFcXlMPStFmpXTSktv",
"domain": "https://unlinkable.example",
"proofValue": "z5tXmHk...x2GvTt3bF"
}
}
{ // external (all terms in this example)
"protected": {
"kid": "did:example:123#_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A",
"alg": "EdDSA"
},
"payload": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/citizenship/v4rc1"
],
"type": [
"VerifiableCredential",
"PermanentResidentCardCredential"
],
"issuer": {
"id": "did:key:zUC7Do...oAVE",
"image": "data:image/png;base64,iVBORw0KGgoAA...CYII="
},
"name": "Permanent Resident Card",
"description": "Government of Utopia Permanent Resident Card.",
"credentialSubject": {
"type": [
"PermanentResident",
"Person"
],
"givenName": "JANE",
"familyName": "SMITH",
"gender": "Female",
"image": "data:image/png;base64,iVBORw0KGgoAAA...3dgg==",
"residentSince": "2015-01-01",
"commuterClassification": "C1",
"birthCountry": "Arcadia",
"birthDate": "1978-07-17",
"permanentResidentCard": {
"type": "PermanentResidentCard",
"identifier": "83627465",
"lprCategory": "C09",
"lprNumber": "999-999-999"
}
},
"validFrom": "2025-01-04T00:00:00Z",
"validUntil": "2026-01-04T23:59:59Z",
},
"signature": "qSv6d...bJRAw"
}
本节为非规范性内容。
这些示例仅供参考,最佳实践是避免在 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. 核心属性、7. 方法以及 [DID-RESOLUTION] 之间的关系。
本节为非规范性内容。
DID 的创建是一个
由每种 DID 方法定义的过程。一些 DID 方法,例如
did:key,是纯
生成式的,也就是说,DID 和 DID 文档是通过
将一段密码学材料转换为符合要求的
表示形式而生成的。其他 DID 方法可能
要求使用
可验证数据注册表,其中 DID 和 DID 文档
只有在按照相应 DID 方法定义完成注册后,才会被第三方
认可为存在。相应 DID 方法还可能定义其他过程。
本节为非规范性内容。
DID 是一种特定类型的 URI(统一资源 标识符),因此 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 方法
可用于为某个特定角色的当前占有者生成
DID——例如一家公司的 CEO——
而实际担任该角色的人会因解析该 DID
的时间不同而不同。
本节为非规范性内容。
DID 指代 DID 主体,并解析为 DID 文档(通过遵循 DID 方法规定的协议)。DID 文档 并不是独立于 DID 主体的单独资源,也没有一个 独立于 DID的 URI。 相反,DID 文档是 DID 解析的产物,由 DID 控制者控制,目的是 支持与 DID 主体进行密码学可验证的交互。
下面的图模型说明了这种区别。
本节为非规范性内容。
DID 文档中的每个属性都是 DID 控制者作出的声明,用于描述:
id 和 alsoKnownAs
属性)
verificationMethod 和 service
属性)。
@context 属性)。
DID 文档中唯一必需的属性是 id,
因此这是唯一保证会出现在 DID 文档中的声明。
该声明在 图
5
中以 DID 与 DID 主体之间的直接链接示出。
本节为非规范性内容。
用于发现更多关于 DID 主体信息的选项,取决于
DID 文档中存在的属性。如果存在
service 属性,则可以从
服务端点请求更多信息。例如,通过
查询支持针对一个或多个
描述 DID 主体的声明(属性)提供可验证凭证的
服务端点。
另一种选择是在 DID 文档中存在
alsoKnownAs 属性时使用它。DID
控制者可以使用该属性
提供一个由其他 URI(包括其他 DID)组成的列表,这些 URI 指代
同一个 DID 主体。解析或解引用这些 URI 可能产生
该 DID 主体的其他描述或表示形式,
如下图所示。
本节为非规范性内容。
如果 DID 主体是可以从互联网检索的数字资源, DID 方法可以选择构造一个 DID URL, 该 URL 返回 DID 主体本身的表示形式。例如, 需要持久、密码学可验证标识符的数据模式 可以被分配一个 DID,并且传入指定的 路径 或 查询可以作为一种 标准方式来检索该模式的 表示形式。
类似地,DID可用于指代 数字资源(例如图像),如果适用的 DID 方法 支持该功能,则该资源可以直接从 可验证数据注册表 返回。
本节为非规范性内容。
如果网页或任何其他 Web 资源的控制者希望为其
分配一个持久、密码学可验证的标识符,
控制者可以给它一个 DID。例如,由博客
托管公司托管的博客(位于该托管公司的域名之下)的作者
可以为该博客创建一个 DID。在 DID 文档中,
作者可以包含 alsoKnownAs 属性,指向
该博客的当前 URL,例如:
"alsoKnownAs": ["https://myblog.blogging-host.example/home"]
如果作者随后将博客迁移到另一家托管公司 (或迁移到作者自己的域名),作者可以更新 DID 文档, 使其指向该博客的新 URL,例如:
"alsoKnownAs": ["https://myblog.example/"]
DID实际上为 博客 URL 增加了一层间接性。这 层间接性由作者控制,而不是由博客托管 公司等外部行政权威控制。这就是 DID 能够有效作为增强型 URN(统一资源 名称)发挥作用的方式——即作为一种信息资源的持久标识符, 其网络位置可能随时间变化。
本节为非规范性内容。
为避免混淆,根据 DID 主体与 DID 控制者之间的关系,将其分类为两个不相交的集合 会很有帮助。
本节为非规范性内容。
第一种情况,如 图 7 所示,是 DID 主体同时也是 DID 控制者的常见场景。当个人或 组织创建 DID用于自我标识时,就是这种情况。
从图模型的角度看,即使在 图 7 中被标识为 DID 控制者和 DID 主体的节点 是不同的,也有一条 逻辑弧线连接它们,以表达语义等价关系。
本节为非规范性内容。
第二种情况是 DID 主体与 DID 控制者是分离的实体。例如,当父母为 子女创建 并维护一个 DID的控制权时;当 公司为子公司创建并 维护一个 DID的控制权时;或者 制造商为产品、物联网设备 或数字文件创建并维护一个 DID的控制权时,就是这种情况。
本节为非规范性内容。
DID 文档可能具有多个 DID 控制者。这可能以两种方式之一发生。
本节为非规范性内容。
在这种情况下,每个 DID 控制者都可以独自行动,也就是说, 每一个控制者都拥有独立更新 DID 文档的完整权限。从 图模型的角度看,在这种配置中:
本节为非规范性内容。
在群组控制的情况下,DID 控制者预期以某种方式 共同行动,例如使用一种需要多个数字签名("multi-sig")或阈值数量 数字签名("m-of-n")的密码学算法。用于 验证证明的这些额外阈值,可以在验证方法中表达,如 5.2 验证方法一节所述,或者可以作为 验证方法验证材料的内在组成部分,在这种情况下, 参与生成特定数字签名的 DID 控制者数量会出于 隐私原因被隐藏。要求由群组成员执行的密码学操作组合来产生证明的验证方法,可用于控制 DID 文档的内容;其具体实现方式取决于各个 DID 方法规范。
从功能角度看,此选项类似于单个 DID 控制者,因为尽管 DID 控制者群组中的每个 DID 控制者都有自己的图节点, 实际控制会折叠为一个单一逻辑图节点, 表示 DID 控制者群组,如 图 9 所示。
当 DID 主体是 组织、公司、政府机构、社区或其他 不由单一个人控制的群组时,这种配置通常适用。
本节为非规范性内容。
DID 文档具有正好一个 DID,它指代
DID 主体。该 DID以
id 属性的值表示。此属性值在
DID 文档的生命周期内不可变。
然而,由 DID 标识的资源,即 DID 主体,可能会随时间变化。这属于 DID 控制者的专属权限。更多细节见 8.10 持久性一节。
本节为非规范性内容。
DID 文档的 DID 控制者可能会随时间变化。 但是,根据其实现方式,DID 控制者的变化可能不会通过 DID 文档 本身的变化表现出来。例如,如果该变化是通过底层密码学密钥或 用于 DID 文档中一个或多个 验证 方法的其他控制手段的所有权转移来实现的,它可能 与标准密钥轮换无法区分。
另一方面,如果该变化是通过更改
controller
属性的值来实现的,则这种变化将是透明的。
如果验证 DID 控制者的变化非常重要,建议实现者 根据修订后的 DID 文档中的 验证 方法,对新的 DID 控制者进行认证。
本节为非规范性内容。
本节包含自本规范作为 W3C 首次公开工作草案发布以来 所作的更改。
自 DID v1.0 推荐标准以来的更改包括:
application/did。
自 DID v1.0 第二次候选 推荐以来的更改包括:
publicKeyMultibase 有关的警告 [CID]。
自 DID v1.0 第一次候选 推荐以来的更改包括:
method-specific-id ABNF 规则以及
nextUpdate 和 nextVersionId 的风险议题标记。
equivalentId 和 canonicalId 是可选的。
publicKeyBase58 替换为 publicKeyMultibase。
自 DID v1.0 首次公开工作 草案以来的更改包括:
本节为非规范性内容。
工作组向我们的主席 Brent Zundel 和 Dan Burnett,以及我们的 W3C 工作人员联系人 Ivan Herman, 致以深切的赞赏和诚挚的感谢,感谢他们 不懈努力,使工作组保持在富有成效的 方向上,并引导我们穿越标准化过程深邃而危险的水域。
工作组感谢促成本规范创建的工作,并向那些 参与了深刻影响我们工作的技术和规范的人士 表达诚挚感谢。尤其包括 Phil Zimmerman、Jon Callas、Lutz Donnerhacke、Hal Finney、David Shaw 和 Rodney Thayer 在 1990 年代和 2000 年代围绕 Pretty Good Privacy (PGP) 所做的工作。
在 2010 年代中期,将成为去中心化标识符的初步实现是与 Jeremie Miller 的 Telehash 项目以及由 Dave Longley 和 Manu Sporny 领导的 W3C Web Payments Community Group 工作协作 构建的。大约一年后,XDI.org Registry Working Group 开始探索去中心化技术,以替代其现有的 标识符注册表。一些最早 撰写的 论文 探讨去中心化标识符概念,其源头可以追溯到由 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 Silicon Valley Innovation Program 根据合同 70RSAT20T00000010、70RSAT20T00000029、70RSAT20T00000030、70RSAT20T00000045、 70RSAT20T00000003 和 70RSAT20T00000033 资助。本规范内容 不一定反映美国政府的立场或政策,也不应推断出任何 官方认可。
本规范的部分工作还由欧盟 StandICT.eu 计划根据子受赠合同编号 CALL05/19 资助。本规范内容 不一定反映欧盟的立场或 政策,也不应推断出任何官方认可。
本规范的工作还得到了 Rebooting the Web of Trust 社区的支持,该社区 由 Christopher Allen、Shannon Appelcline、Kiara Robles、Brian Weller、Betty Dhamers、Kaliya Young、Kim Hamilton Duffy、Manu Sporny、Drummond Reed、Joe Andrieu 和 Heather Vescent 促成。本规范的开发也得到了 W3C Credentials Community Group 的支持,该小组曾由 Kim Hamilton Duffy、Joe Andrieu、 Christopher Allen、Heather Vescent 和 Wayne Chang 担任主席。Internet Identity Workshop 的参与者, 由 Phil Windley、Kaliya Young、Doc Searls 和 Heidi Nobantu Saul 促成,也通过大量 工作会议支持了本工作,这些会议旨在讨论、改进并教育参与者了解 本规范。
工作组感谢以下个人对
本规范的贡献(按字母顺序排列,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 Daubenschütz, 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, and Brent Zundel。
当本规范成为 W3C 提议推荐标准时, 本节将提交给 Internet Engineering Steering Group (IESG) 进行审查、批准,并向 IANA 注册。
JSON-LD 环境中使用的片段标识符按照与 JSON-LD 1.1:application/ld+json 媒体类型 [JSON-LD11] 相关联的规则处理。JSON 环境中使用的片段标识符 与 JSON-LD 环境中的片段标识符具有相同的语义解释。用于 执行片段解析的算法见 受控标识符 v1.0 规范的 第 3.4 节:片段解析, 该规范由 去中心化 标识符(DID)v1.1 规范扩展。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: