去中心化标识符(DID)v1.1

核心架构、数据模型和表示形式

W3C 候选推荐快照

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/CR-did-1.1-20260305/
最新发布版本:
https://www.w3.org/TR/did-1.1/
最新编辑草案:
https://w3c.github.io/did/
历史:
https://www.w3.org/standards/history/did-1.1/
提交历史
测试套件:
https://github.com/w3c/did-test-suite/
实现报告:
https://w3c.github.io/did-test-suite/
编辑:
Manu Sporny (Digital Bazaar) (v1.0, v1.1)
Dmitri Zagidulin (受邀专家) (v1.1)
前任编辑:
Amy Guy (Digital Bazaar) (v1.0)
Markus Sabadello (Danube Tech) (v1.0)
Drummond Reed (Evernym/Avast) (v1.0)
作者:
Manu Sporny (Digital Bazaar)
Dave Longley (Digital Bazaar)
Markus Sabadello (Danube Tech)
Drummond Reed (Evernym/Avast)
Orie Steele (Transmute)
Christopher Allen (Blockchain Commons)
反馈:
GitHub w3c/did (拉取请求新建议题开放议题)
public-did-wg@w3.org 主题行请使用 [did-1.1] … 消息主题 …归档
相关文档
DID 用例与要求
DID 扩展
DID Core 实现报告

摘要

去中心化标识符(DID)是一种新型 标识符, 可实现可验证的、去中心化的数字身份。DID 指代任何 主体(例如,个人、组织、事物、数据模型、抽象实体等), 由 DID 的控制者确定。与 典型的联合式标识符不同,DID 的设计使其可以 与中心化注册表、身份提供者和证书 颁发机构解耦。具体而言,虽然可以使用其他方来帮助实现 与 DID 相关信息的发现,但该设计使 DID 的控制者能够证明对其的控制权, 而无需任何其他方的许可。DIDURI, 它将 DID 主体DID 文档关联起来,从而允许 与该主体相关联的可信交互。

每个 DID 文档都可以表达密码学材料、验证 方法服务,这些内容提供一组机制,使 DID 控制者能够证明对该 DID 的控制权。服务支持 与 DID 主体相关联的可信交互。一个 DID 也可能 提供返回 DID 主体自身的方式,前提是该 DID 主体是数据模型之类的信息资源。

本文档规定了 DID 语法、通用数据模型、核心属性、 序列化表示形式、DID 操作,并解释了 将 DID 解析为其所表示资源的过程。

本文档状态

本节描述本文档在发布时的 状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。

W3C 去中心化标识符工作组已将 本文档发布为 W3C 候选推荐,并请求软件 开发者和 DID 方法规范作者提供实验性实现,用于 测试本文档中所有特性的可实现性。

实现者需注意,任何开放的 第 1、2 或 3 类议题(列在议题 跟踪器中)都可能导致规范发生变更。

为退出 W3C 候选推荐阶段,W3C DID 工作组 要求满足以下条件:

  1. 对于可机器测试的规范性陈述,每个特性至少有两个符合要求的 实现;也就是说,当一个 符合要求的生产者实现 某个特性时,至少有两个 符合要求的消费者能够 消费该特性; 并且对于每个被消费的特性,至少有两个 符合要求的生产者能够产生该特性。
  2. 对于不可机器测试的规范性陈述,每个特性至少有两个 实现演示。
  3. 去中心化标识符解析(DID Resolution)v0.3 规范已经满足其 W3C 候选推荐阶段的退出标准。

一个特性被定义为规范中一个或多个在功能上相关的规范性陈述。 对于本规范,互操作性被定义为规范性陈述, 例如那些涉及数据模型属性及其 值的陈述,在两个不同的 DID 方法之间以相同方式解释。

特定 DID 方法的解析不在本规范范围内, 而由 去中心化标识符解析(DID Resolution) v0.3 规范涵盖。

本文档由 去中心化标识符 工作组作为 候选推荐快照发布,并采用 推荐标准轨道

作为候选推荐发布并不 意味着获得 W3C 及其成员的认可。候选 推荐快照已经过 广泛审查,旨在 收集 实现经验, 并已获得工作组成员对实现进行 免版税许可 的承诺。

本候选推荐预计不会早于 2026年4月5日推进到推荐标准。

本文档由一个 根据 W3C 专利 政策运作的工作组制定。 W3C 维护着一份 与该工作组交付物相关的任何专利披露的公开列表; 该页面还包括 披露专利的说明。任何实际 知晓其认为包含 必要权利要求 的专利的个人,必须按照 W3C 专利政策第 6 节披露相关信息。

本文档受 2025年8月18日 W3C 流程文档约束。

1. 引言

本节为非规范性内容。

作为个人和组织,我们许多人会在 各种各样的上下文中使用全局唯一标识符。它们用作通信地址(电话号码、 电子邮件地址、社交媒体用户名)、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] 文档很有用。

1.1 一个简单示例

本节为非规范性内容。

DID 是一个由三个 部分组成的简单文本字符串:1)did URI 方案标识符,2)DID 方法的标识符,以及 3) DID 方法特定标识符。


显示 DID 各组成部分的图示。最左侧字母拼写为蓝色的 'did',
上方有一个水平括号括起,并在括号上方标注为 'scheme'。
'did' 字母后跟一个灰色冒号。中间字母拼写为洋红色的
'example',下方有一个水平括号括起,并在括号下方标注为
'DID Method'。DID Method 后跟一个灰色冒号。最后,末尾的
字母读作绿色的 '123456789abcdefghi',下方有一个水平括号括起,并在括号下方
标注为 'DID Method Specific String'。
1 一个去中心化标识符(DID)的简单示例

上面的示例 DID 会解析为一个 DID 文档DID 文档 包含与该 DID 相关的信息,例如 对 认证 DID 控制者进行密码学认证的方式。

示例 1:一个简单的 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"
  }]
}

1.2 设计目标

本节为非规范性内容。

去中心化标识符是 更大系统(例如 Verifiable Credentials 生态系统 [VC-DATA-MODEL])的组成部分,该生态系统影响了本规范的 设计 目标。去中心化标识符的设计目标 总结如下。

目标 描述
去中心化 消除在标识符管理中对中心化权威机构或单点 故障的要求,包括全局唯一 标识符、公开验证密钥、服务以及 其他信息的注册。
控制 赋予实体(包括人类和非人类)直接控制其 数字标识符的能力,而无需依赖外部权威机构。
隐私 使实体能够控制其信息的隐私,包括对属性或其他数据进行最小化、 选择性和渐进式披露。
安全 提供足够的安全性,使请求方能够依赖 DID 文档达到其所需的 保证级别。
基于证明 使 DID 控制者在与 其他实体交互时能够提供密码学证明。
可发现性 使实体能够发现其他实体的 DID,以 进一步了解这些实体或与它们交互。
互操作性 使用可互操作的标准,使 DID 基础设施能够利用 为互操作性而设计的现有工具和软件库。
可移植性 独立于系统和网络,并使实体能够在任何支持 DIDDID 方法的系统中使用其数字 标识符。
简单性 倾向于减少简单功能集合,使该技术更易于 理解、实现和部署。
可扩展性 在可能的情况下支持可扩展性,前提是它不会严重妨碍 互操作性、可移植性或简单性。

1.3 架构概述

本节为非规范性内容。

本节提供去中心化标识符架构主要组件的 基本概述。


DID 和 DID 文档记录在可验证数据注册表上;DID 解析为
DID 文档;DID 指向 DID 主体;DID 控制者控制一个 DID
文档;DID URL 包含一个 DID;DID URL 被解引用为 DID 文档
片段或外部资源。
2 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 URL
去中心化标识符,或 DID,是由三个 部分组成的 URI:方案 did:、方法标识符,以及由 DID 方法指定的唯一的 方法特定标识符。DID 可 解析为 DID 文档DID URL 扩展 基本 DID 的语法,以纳入其他标准 URI 组件,例如 路径、查询和片段,从而定位特定 资源——例如,DID 文档内的密码学公钥,或位于 DID 文档之外的资源。 这些概念在 3.1 DID 语法3.2 DID URL 语法中进一步阐述。
DID 主体
DID 的主体按定义是由该 DID标识的实体。DID 主体 也可以是 DID 控制者。 任何事物都可以是 DID 的主体:个人、群体、组织、 事物或概念。这在 5.1.1 DID 主体中进一步定义。
DID 控制者
控制者 of a DID 是有能力(如 DID 方法所定义) 对 DID 文档进行更改的实体(个人、组织或 自治软件)。这种能力 通常通过控制一组由代表控制者行事的软件使用的密码学密钥来声明, 但也可能通过 其他机制声明。请注意,一个 DID 可以有多个 控制者,并且 DID 主体可以是 DID 控制者,或其中 之一。该概念记录在 5.1.2 DID 控制者中。
可验证数据注册表
为了能够解析为 DID 文档DID 通常 记录在某种底层系统或网络上。无论使用的 具体技术是什么,任何支持记录 DID 并返回产生 DID 文档所需数据的系统都称为 可验证数据注册表。示例包括分布式账本、 去中心化文件系统、任何类型的数据库、点对点网络,以及 其他形式的可信数据存储。该概念在 7. 方法中进一步阐述。
DID 文档
DID 文档包含与 DID 相关的信息。它们 通常表达 验证方法,例如 密码学公钥,以及与 DID 主体交互相关的 服务DID 文档支持的通用属性在 5. 核心属性中规定。DID 文档 可以被序列化为字节 流(见 6. 表示形式)。DID 文档中存在的属性可以根据 7. 方法中概述的适用操作 进行更新。
DID 方法
DID 方法是创建、解析、更新和停用特定类型 DID 及其相关 DID 文档的机制。DID 方法使用单独的 DID 方法 规范进行定义,如 7. 方法中所述。
DID 解析器和 DID 解析
DID 解析器是一个系统组件,它将 DID 作为输入,并 产生符合要求的 DID 文档作为输出。这个过程 称为 DID 解析。解析特定类型 DID 的步骤 由相关 DID 方法规范定义。DID 解析过程在 [DID-RESOLUTION] 中进一步阐述。
DID URL 解引用器和 DID URL 解引用
DID URL 解引用器是一个系统组件,它将 DID URL 作为输入,并产生一个 资源作为输出。这个过程称为 DID URL 解引用DID URL 解引用 过程在 [DID-RESOLUTION] 中进一步阐述。

1.4 一致性

除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。除此之外,本规范中的所有内容均为规范性内容。

本文档中的关键词 MAYMUSTMUST NOTRECOMMENDEDSHOULDSHOULD NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,但仅当它们像此处所示一样以全部 大写形式出现时才如此。

本文档包含含有 JSON 和 JSON-LD 内容的示例。 其中一些示例包含无效字符,例如内联 注释(//)以及使用省略号(...)表示 对示例价值不大的信息。实现者在希望将这些信息用作有效 JSON 或 JSON-LD 时,应注意 移除这些内容。

某些示例包含本规范未定义的术语,包括属性名称和值。 这些术语以注释(// external (property name|value))标明。此类术语在 DID 文档中使用时, 预期应在 DID Extensions [DID-EXTENSIONS] 仓库中注册,并附带指向 形式化定义和 JSON-LD 上下文的链接。

DIDDID 文档实现的互操作性, 通过评估实现创建和解析符合本规范的 DIDDID 文档的能力来测试。 DIDDID 文档的生产者和消费者之间的互操作性, 通过确保 DIDDID 文档符合要求来提供。DID 方法规范的互操作性由每个 DID 方法规范中的细节提供。可以理解的是,就像 Web 浏览器不需要实现所有已知的 URI 方案一样,使用 DID 的符合要求的软件也不需要 实现所有已知的 DID 方法。但是,给定 DID 方法 的所有实现都应对该方法具备互操作性。

符合要求的 DID3. 标识符中规定的规则的任何具体表达,并且符合 该节中的相关规范性陈述。

符合要求的 DID 文档 是本规范中描述的数据模型的任何具体表达, 并且符合 4. 数据模型5. 核心 属性中的 相关规范性陈述。符合要求的文档的序列化格式是确定性的、 双向的且无损的,如 6. 表示形式中所述。

符合要求的生产者是任何以 软件和/或 硬件实现的算法,它生成 符合要求的 DID符合要求的 DID 文档,并符合 6. 表示形式中的相关规范性陈述。

符合要求的消费者是任何以 软件和/或 硬件实现的算法,它消费 符合要求的 DID符合要求的 DID 文档, 并符合 6. 表示形式中的相关规范性陈述。

符合要求的 DID 方法是任何 符合 7. 方法中相关规范性陈述的规范。

1.5 读者对象

本节为非规范性内容。

本规范有两个主要读者群体:符合要求的 DID 方法的实现者;以及希望与 DID 交互并对接的 系统和服务的实现者。预期读者包括但不限于软件架构师、数据建模者、应用开发者、服务开发者、 测试人员、运维人员和用户体验(UX)专家。参与与去中心化身份、可验证凭证和安全存储相关的 各类标准工作的其他人员,也可能会对阅读本规范感兴趣。

2. 术语

本节为非规范性内容。

本节定义了本规范以及整个 去中心化标识符基础设施中使用的术语。每当 这些术语在本规范中出现时, 都会包含指向它们的链接。

放大攻击
一类攻击,其中攻击者试图通过向系统提供小型、有效的输入, 使目标系统的 CPU、存储、网络或其他资源耗尽, 而这些输入导致的破坏性影响,其处理成本可能比输入本身 呈指数级更高。
去中心化标识符(DID)
一种全局唯一的持久标识符,不需要中心化 注册机构,并且通常以密码学方式生成和/或注册。 DID 的通用格式定义于 3.1 DID 语法。特定的 DID 方案定义于 DID 方法规范中。许多(但并非全部)DID 方法使用 分布式账本技术(DLT)或某种 其他形式的去中心化网络。
DID 控制者
有能力对 DID 文档进行更改的实体。 一个 DID 可能有多个 DID 控制者。DID 控制者 可以由 DID 文档顶层的可选 controller 属性表示。请注意,DID 控制者可能是 DID 主体
DID 委托者
DID 控制者授予权限的实体,该实体可通过 DID 文档使用与 DID 关联的 验证 方法。例如,控制子女 DID 文档的父母可能允许子女 使用其个人设备来进行 认证。在 这种情况下,子女就是 DID 委托者。子女的个人设备 将 包含私有密码学材料,使子女能够 使用该 DID 进行 认证。但是,未经父母许可,子女可能 不被允许添加其他个人设备。
DID 文档
一组数据,用于支持与 DID 主体进行密码学上可验证的交互。这包括密码学 公钥等机制, DID 主体DID 委托者可用这些机制来 认证自身,并证明其与 DID 的关联。DID 文档可能具有一个或多个不同的 表示形式,如 6. 表示形式W3C 去中心化标识符扩展中所定义。
DID 片段
DID URL 中跟在第一个 # 字符 (U+0023 NUMBER SIGN之后的部分。DID 片段语法 与 URI 片段语法相同。
DID 方法
对特定 DID 方法方案如何实现的定义。DID 方法由 DID 方法规范定义,该规范规定了 DIDDID 文档 被创建、解析、更新 和停用所依据的精确操作。见 7. 方法
DID 路径
DID URL 中从第一个 / 字符 (U+002F SOLIDUS开始并包含该字符的部分,终止于但 不包含 ? 字符 (U+003F QUESTION MARK# 字符 (U+0023 NUMBER SIGN, 或 DID URL 的末尾。DID 路径语法与 URI 路径语法相同。 见 路径
DID 查询
DID URL 中跟在并包含第一个 ? 字符 (U+003F QUESTION MARK的部分。 DID 查询语法与 URI 查询 语法相同。见 查询
DID 解析
一个过程,它以 DID 和一组解析 选项作为输入,并返回符合要求的 表示形式中的 DID 文档 以及额外元数据。该过程依赖于适用 DID 方法的“Read”操作。该过程的输入和输出 定义于 [DID-RESOLUTION]。
DID 解析器
DID 解析器是一个软件和/或硬件组件,它通过将 DID 作为输入并产生 符合要求的 DID 文档作为输出,来执行 DID 解析功能。
DID 方案
去中心化标识符的形式语法。通用 DID 方案 以前缀 did: 开头,如 3.1 DID 语法中所定义。每个 DID 方法 规范都定义了一个与该特定 DID 方法一起工作的特定 DID 方法方案。在特定 DID 方法方案中,DID 方法名称跟在第一个冒号之后,并以 第二个冒号结束,例如 did:example:
DID 主体
DID 标识并由 DID 文档描述的实体。 任何事物都可以是 DID 主体:个人、群体、组织、物理事物、 数字事物、逻辑事物等。
DID URL
一个 DID 加上符合 3.2 DID URL 语法中定义的任何额外语法组件。 这包括可选的 DID 路径及其前导 / 字符 (U+002F SOLIDUS、 可选的 DID 查询及其前导 ? 字符 (U+003F QUESTION MARK, 以及可选的 DID 片段及其前导 # 字符 (U+0023 NUMBER SIGN
DID URL 解引用
一个过程,它以 DID URL 和一组输入 元数据作为输入,并返回一个 资源。该资源可能是一个 DID 文档加上额外元数据、包含在 DID 文档中的次级资源,或完全 位于 DID 文档之外的资源。该过程使用 DID 解析来 获取由包含在 DID URL内的 DID所指示的 DID 文档。随后,解引用过程可以对 DID 文档执行额外处理,以返回由 DID URL指示的解引用资源。该过程的输入和输出定义于 [DID-RESOLUTION]。
DID URL 解引用器
执行给定 DID URLDID 文档DID URL 解引用 功能的软件和/或硬件系统。
分布式账本(DLT)
一种用于记录事件的非中心化系统。这些系统建立 足够的信心,使参与者能够依赖他人记录的数据 来做出操作决策。它们通常使用分布式数据库,其中 不同节点使用共识协议来确认 经过密码学签名的交易顺序。经过数字签名的 交易随时间链接,通常会使账本历史实际上 不可变。
资源
URI 标识的事物,如 [RFC3986] 中所定义。类似地, 任何资源都可以作为由 DID标识的 DID 主体
表示形式
资源的一种具体表达,如 [RFC9110] 所定义: “旨在反映给定 资源过去、当前或期望状态的信息,其格式能够通过协议方便地传达。 表示形式由一组表示形式元数据和一个可能无界的 表示形式数据流组成。”DID 文档是一种信息表示形式, 它支持与 DID 主体进行密码学上可验证的交互。见 6. 表示形式
特定于表示形式的条目
DID 文档中的条目,其含义特定于某一具体 表示形式。定义于 4. 数据模型6. 表示形式
服务
一种通过一个或多个 服务端点DID 主体或 关联实体进行通信或交互的方式。 示例包括发现服务、代理服务、社交网络 服务、文件存储服务以及可验证凭证仓库服务。
DID 服务 端点
一个网络地址,例如 HTTP URL,服务在该地址上代表 DID 主体运行。
统一资源标识符(URI)
万维网上所有资源的标准标识符格式,如 [RFC3986] 所定义。DID 是一种 URI 方案。
可验证数据注册表
一个系统,用于促进 去中心化标识符DID 文档的创建、验证、更新和/或 停用。可验证数据注册表也可能用于其他 密码学上可验证的数据结构,例如 可验证 凭证。更多信息见 W3C Verifiable Credentials 规范 [VC-DATA-MODEL]。
可验证时间戳
可验证时间戳使第三方能够验证某个数据对象 在特定时间点已经存在,并且自该时间点以来未被修改或 损坏。 如果自该时间点以来数据完整性有合理可能 已被修改或损坏,则该时间戳并非 可验证。

除上述术语外,本规范还使用 [INFRA] 规范中的术语来正式定义 数据模型。当使用 [INFRA] 术语时,例如 字符串集合映射,会直接链接到该规范。

3. 标识符

本节描述 DIDDID URL 的形式语法。 术语“通用”用于区分此处定义的语法与 特定 DID 方法在其各自 规范中定义的语法。DIDDID URL 的创建过程及其时机在 7.2 方法 操作B.2 DID 的创建中描述。

3.1 DID 语法

通用 DID 方案是符合 [RFC3986] 的 URI 方案。ABNF 定义如下,它使用 [RFC5234] 中的语法以及 ALPHADIGIT 的相应定义。下面 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 语法相关的 DID 方法要求,见 7.1 方法语法一节。

3.2 DID URL 语法

DID URL 是特定 资源的网络位置标识符。它可用于检索诸如 DID 主体的表示形式、验证方法服务DID 文档的特定部分,或其他资源。

以下是使用 [RFC5234] 中语法的 ABNF 定义。它构建 于 3.1 DID 语法中定义的 did 方案之上。path-abemptyqueryfragment 组件 定义于 [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 URL 是否等价。 本规范没有定义 查询参数的规范化规则,并且在 DID 方法规范或应用层定义的任何查询参数规范化规则并非 普遍认可的规则。

片段

DID 片段语法和语义与通用 URI 片段相同,并符合 RFC 3986 第 3.5 节中的 fragment ABNF 规则。

DID 片段被用作进入 DID 文档或外部 资源的、独立于方法的引用。下面展示了 DID 片段 标识符的一些示例。

示例 4:DID 文档中的唯一验证方法
did:example:123#public-key-1
示例 5:DID 文档中的唯一服务
did:example:123#service-5
:跨表示形式的片段语义

为最大化互操作性,强烈建议实现者确保 DID 片段在不同 表示形式中以相同方式解释 (见 6. 表示形式)。例如,虽然 JSON Pointer [RFC6901] 可用于 DID 片段,但它在非 JSON 表示形式中不会以相同方式 解释。

与本节中的语义兼容并构建于其之上的片段标识符附加语义, 在媒体类型描述中规定(见 E.1 application/did 一节)。有关如何 解引用 DID 片段的信息,见 去中心化标识符解析(DID Resolution)v0.3 规范。

3.2.1 相对 DID URL

相对 DID URLDID 文档中任何不以 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 文档的存储大小。

示例 6:相对 DID URL 的示例
{
  "@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 URLdid:example:123456789abcdefghi#key-1

4. 数据模型

本规范定义了一个数据模型,可用于表达 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 中所有类似列表的 值结构都是有序的,无论这种顺序是否 具有意义。就本规范而言,除非另有说明, 映射集合的顺序并不重要, 并且不期望实现以确定性顺序生产或消费 值。

4.1 可扩展性

数据模型支持两类可扩展性。

  1. 为最大化互操作性,RECOMMENDED 扩展使用 去中心化标识符扩展仓库。 对新 属性或其他扩展使用此机制,是唯一被规定的机制,可确保 两种不同的表示形式能够协同工作。
  2. 表示形式 MAY 定义其他 可扩展性机制,包括 不要求使用 去中心化标识符扩展 仓库的机制。此类 扩展机制 SHOULD 支持无损转换为任何其他 符合要求的表示形式。某个表示形式的扩展机制 SHOULD 定义所有属性和表示形式语法到 DID 文档数据模型及其 类型系统的映射。
:未注册的扩展可靠性较低

两个特定实现始终可以通过带外方式约定 使用彼此理解的扩展或表示形式,即使其未记录 在 去中心化标识符扩展仓库中; 此类实现与更大生态系统之间的互操作性将不那么可靠。

5. 核心属性

DIDDID 文档关联,后者是 受控标识符 v1.0中定义的 受控标识符 文档的扩展。 DID 文档使用 数据模型表达,并可序列化为一种 表示形式。 以下各节定义了 DID 文档中的属性, 包括这些属性是必需还是可选。这些属性 描述了 DID 主体与属性值之间的关系。

以下表格包含本规范定义的核心属性的资料性参考, 并列出期望值以及它们是否 必需。表格中的属性名称链接到 规范性定义以及每个属性的更详细描述。

:不同类型映射中使用的属性名称

属性名称 idtypecontroller 可以出现在不同类型的映射中, 并且约束可能不同。例如,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 节:服务

5.1 标识符

本节描述 DID 文档 包含 DID 主体DID 控制者标识符的机制。

5.1.1 DID 主体

特定 DID 主体DID使用 DID 文档中的 id 属性表达。此属性 定义于 受控 标识符 v1.0规范的 第 2.1.1 节:主体,并由本规范扩展,以包含 去中心化标识符,如 3.1 DID 语法一节中所定义。

{
  "id": "did:example:123456789abcdefghijk"
}
:中间表示形式

DID 方法规范可以创建 DID 文档的中间 表示形式,例如当一个去中心化标识符正在 可验证数据注册表中注册时,或当一个DID 解析器正在执行DID 解析时。这些中间表示形式 可能不包含 id 值, 或者可能包含某些 id 属性的临时值。一旦 DID 文档被完全解析,最终的 id 值将被 确定,并在整个 DID 文档中替代临时值。

5.1.2 DID 控制者

DID 控制者是被授权对 DID 文档进行更改的实体。此属性定义于 受控 标识符 v1.0规范的 第 2.1.2 节:控制者,并由本规范扩展,以包含 3.1 DID 语法一节中定义的 DID。授权 DID 控制者的过程由 DID 方法定义。

示例 8:带有 controller 属性的 DID 文档
{
  "@context": "https://www.w3.org/ns/did/v1.1",
  "id": "did:example:123456789abcdefghi",
  "controller": "did:example:bcehfew7h32f32h7af3"
}

5.1.3 标识符限制

DID 文档中用于标识 DID 主体DID 控制者的标识符不能使用查询参数或片段标识符。 强烈建议实现者特别注意 3.1 DID 语法一节中的允许 字符列表,该列表清楚说明了这一要求; 该 语法既不包含 ? 字符,也不包含 # 字符。这与 DID 文档中用于标识 验证 方法服务的标识符形成对比,后者遵循 3.2 DID URL 语法一节中的语法规则,这些规则允许使用查询参数和 片段 标识符。即便如此,在为 DID 生态系统创建的长期规范 标识符中使用查询参数也不被鼓励,因为这可能增加 DID 解析软件的复杂性,并可能导致更大的 安全攻击面。片段标识符也预期在特定 DID 文档内保持唯一,并且不鼓励实现者 随时间重用它们来指代不同的资源,例如同一 DID 文档内的两个不同 验证方法

5.2 验证方法

DID 文档可以表达验证方法,如 受控标识符 v1.0第 2.2 节:验证方法中所定义, 并增加以下限制:(a) idMUST 符合 3.2 DID URL 语法一节或 3.2.1 相对 DID URL一节,并且 (b) controllerMUST 符合 3.1 DID 语法一节。 有关验证方法的描述,见 受控 标识符 v1.0规范的 第 2.2 节:验证方法

5.3 验证关系

DID 文档可以表达验证关系, 如 受控标识符 v1.0规范的 第 2.3 节:验证 关系中所定义。有关 验证 方法的描述,见 受控标识符 v1.0规范的 第 2.3 节:验证 关系

5.4 服务

DID 文档可以表达服务,如 受控标识符 v1.0 规范的 第 2.1.4 节:服务中所定义。 服务中使用的标识符 可以按照 3.1 DID 语法一节或 3.2 DID URL 语法一节表达。有关 服务的描述,见 受控标识符 v1.0 规范的 第 2.1.4 节:服务

6. 表示形式

本规范中 DID 文档的一种具体序列化称为 表示形式表示形式 通过一个称为 生产的过程 对数据模型进行序列化来创建。表示形式通过一个称为 消费的过程 转换为数据模型生产消费 过程使信息能够从一种表示形式 转换为 另一种表示形式。本规范为 JSON 定义了一种单一的表示形式,该表示形式 也兼容执行 JSON-LD 处理的处理器。以下各节定义了 生产消费的一般规则,以及 JSON 表示形式

6.1 生产与消费

除本规范中定义的表示形式外, 实现者还可以使用其他表示形式,前提是每个此类 表示形式都被适当规定(包括对 DID Extensions [DID-EXTENSIONS] 仓库中未列出的属性进行 互操作处理的规则)。更多信息见4.1 可扩展性

对所有表示形式的要求如下:

  1. 表示形式 MUST4. 数据模型中规定的所有数据类型定义 确定性的生产和消费规则。
  2. 表示形式 MUST 与一个已在 IANA 注册的 媒体类型唯一关联。
  3. 表示形式 MUST 为其媒体 类型定义片段处理规则,并且这些规则符合 片段中定义的片段处理规则。
  4. 表示形式 SHOULD 使用 数据模型数据类型的词法表示。例如,JSON 和 JSON-LD 使用 XML Schema dateTime 词法序列化来表示 日期时间表示形式 MAY 选择 使用不同的词法序列化来序列化数据模型数据类型,只要 回到消费过程并进入数据模型时是无损的。例如,某些基于 CBOR 的 表示形式使用整数来表达 日期时间值,以表示自 Unix 纪元以来的秒数。
  5. 表示形式 MAY 定义特定于表示形式的条目,这些条目 存储在特定于表示形式的条目 映射中, 用于生产消费 过程。这些 条目在消费或生产时使用,以帮助确保无损 转换。
  6. 为最大化互操作性,表示形式规范 作者 SHOULD 将其表示形式注册到 DID Extensions [DID-EXTENSIONS] 仓库中。

对所有符合要求的生产者的要求如下:

  1. 符合要求的生产者 MUSTDID 文档数据模型特定于表示形式的条目 映射作为输入传入 生产过程。 符合要求的生产者 MAY 接受额外选项作为 生产过程的输入。
  2. 符合要求的生产者 MUST 序列化 DID 文档数据模型中的所有条目,以及 特定于表示形式的条目映射中 那些没有针对正在生产的表示形式的显式处理规则的条目, 仅使用该表示形式的数据类型处理规则,并在 生产过程完成后返回序列化结果。
  3. 符合要求的生产者 MUST生产过程完成后,返回与该 表示形式 关联的媒体类型字符串
  4. 符合要求的生产者 MUST NOT 生产不符合要求的DIDDID 文档

对所有符合要求的消费者的要求如下:

  1. 符合要求的消费者 MUST表示形式和 媒体类型字符串作为输入传入 消费过程。符合要求的消费者 MAY 接受 额外选项作为消费过程的输入。
  2. 符合要求的消费者 MUST 使用媒体类型输入字符串确定 DID 文档表示形式
  3. 符合要求的消费者 MUST 检测所有已知表示形式中的任何 特定于表示形式的 条目,并将该条目放入一个 特定于表示形式的条目映射中, 该映射在消费过程完成后返回。所有已知 特定于表示形式的 条目的列表可在 DID Extensions [DID-EXTENSIONS] 仓库中找到。
  4. 符合要求的消费者 MUST 将 所有没有针对正在消费的表示形式的显式处理规则的 非特定于表示形式的 条目 添加到 DID 文档数据模型中, 仅使用该表示形式的数据类型处理规则,并在 消费过程完成后返回该 DID 文档数据模型。
  5. 符合要求的消费者在消费不符合要求的 DIDDID 文档MUST 产生错误。

说明数据模型的表示形式如何被生产和消费的图示,
包括 JSON 和 JSON-LD。
3 表示形式的生产和消费。 另请参阅:叙述性 描述

图的左上象限包含一个带灰色虚线 轮廓的矩形,其中包含两个蓝色轮廓的矩形,一个在上,一个在下。 上方较大的矩形以蓝色标记为 "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"
  ]
}
:表示形式之间的转换

实现预期通过对源表示形式使用消费规则, 得到数据模型,然后使用生产规则 将数据模型序列化为目标表示形式,或使用任何其他 会产生相同目标表示形式的机制,来在表示形式之间进行转换。

6.2 JSON

本节定义 JSON 表示形式生产消费规则。

6.2.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

示例 9:JSON 表示形式中的 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"
  }]
}

6.2.2 消费

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 报告错误。

6.2.3 JSON-LD 处理器

JSON-LD 是一种基于 JSON 的格式,用于序列化 链接数据。预期某些 实现会使用标准 JSON-LD 处理算法来处理DID 文档。为最大化互操作性,强烈建议实现者 确保不会阻止使用符合标准的库进行 JSON-LD 处理。 无论是否使用符合标准的库执行 JSON-LD 处理, DID 文档 的语义都是相同的。语义上的任何差异都是实现或 DID 方法规范中的错误。

要进行 JSON-LD 处理,@context 属性 MUST 按照 JSON-LD 1.1 规范中规定的规则指定。

@context
JSON-LD 上下文 要么是一个字符串,要么是一个列表,其中包含字符串和/或有序 映射的任意组合。

DID 文档、DID 文档数据结构以及 特定于表示形式的条目映射 MUST 按照 6.2 JSON 中定义的 JSON 表示形式生产规则, 序列化为 JSON 表示形式

除使用 JSON 表示形式生产规则外, 生产过程 MUST 包含 @context 条目。@context 的序列化值 MUSTJSON 字符串 https://www.w3.org/ns/did/v1.1,或一个JSON 数组,其中第一项是 JSON 字符串 https://www.w3.org/ns/did/v1.1,后续项目则 按照 JSON 生产规则序列化。

示例 10:简单 @context 条目的有效序列化
{
  "@context": "https://www.w3.org/ns/did/v1.1",
  ...
}
示例 11:分层 @context 条目的有效序列化
{
  "@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 表示形式符合要求的消费者 SHOULDDID 文档中删除所有未通过 @context 定义的术语。

6.2.4 远程资源完整性

实现 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 缓存时间并未设置为无限,并建议实现者 在检测到密码学哈希 值变化时检查勘误。

6.3 媒体类型

媒体类型,如 [RFC6838] 中所定义,用于标识表达 DID 文档所使用的语法以及其他有用的处理指南。

本规范中用于表达数据模型的语法 SHOULD 由媒体类型标识, 并且在定义或使用带有 DID 文档的媒体类型时, SHOULD 遵循本节中概述的约定。

有一种媒体类型与核心数据模型关联,它 列在 E. IANA 考量一节中: application/did

6.3.1 媒体类型精确性

本节为非规范性内容。

有时,开发者或系统可能使用较低精确性的媒体类型来传达 DID 文档。使用 较低精确性媒体类型的一些原因包括:

  • 当文件扩展名不可用且 Web 服务器无法确定媒体类型时, Web 服务器默认使用 text/plainapplication/octet-stream
  • 开发者添加的文件扩展名导致的媒体类型不如文件内容 具体。例如,.json 可能产生 application/json 媒体类型,而 .jsonld 可能产生 application/ld+json 媒体类型。
  • 某个协议要求在特定事务中使用精确性较低的媒体类型;例如, 使用 application/json 而不是 application/did

在可以从载荷确定预期媒体类型的情况下,只要所使用的媒体类型在给定协议中 可接受,就不鼓励实现者抛出错误。例如,如果某个应用只接受 符合 application/did 媒体 类型相关规则的载荷,但该载荷标记为较低精确性的 application/jsonapplication/ld+json,该应用可能执行以下步骤来 确定该载荷是否也符合更高精确性的媒体类型:

  1. 将载荷解析为 JSON 文档。
  2. 确保 @context 属性的第一个元素匹配 https://www.w3.org/ns/did/v1.1
  3. 如果 JSON 文档包含顶层 id 属性,且其中包含符合 3.1 DID 语法一节中规则的标识符, 则假定其媒体类型为 application/did

只要可能,建议实现者对本规范定义的所有载荷使用最精确(最高 精确性)的媒体类型。 还建议实现者认识到,标记为较低 精确性媒体类型的载荷,并不意味着该载荷不满足 将其标记为更高精确性类型所需的规则。类似地,标记 为更高精确性媒体类型的载荷,并不意味着该载荷将满足与该 媒体类型相关联的要求。无论载荷关联的媒体类型如何, 载荷接收方都应执行适当检查, 以确保载荷符合其在给定 系统中使用的要求。

HTTP 客户端和服务器在 Accept: 标头中以及指示内容类型时,使用与DID 文档关联的媒体类型。警告实现者: HTTP 服务器可能会忽略 Accept: 标头并返回另一种内容类型,或 返回错误代码,例如 415 Unsupported Media Type

7. 方法

符合要求的 DID 方法定义了实现者如何实现 本规范所描述的特性。DID 方法通常与特定 可验证数据注册表相关联。新的 DID 方法在其 自身规范中定义,以实现同一 DID 方法的不同 实现之间的互操作性。

从概念上讲,本规范与 DID 方法规范之间的关系, 类似于 IETF 通用 URI 规范 [RFC3986] 与特定 URI 方案 [IANA-URI-SCHEMES](例如 http 方案 [RFC9110])之间的关系。除 定义特定的 DID 方案外,DID 方法 规范还定义了使用特定类型 可验证数据注册表创建、解析、更新和 停用 DIDDID 文档的机制。 它还记录了与 DID相关的所有实现 考量,以及安全和隐私 考量。

本节规定了编写 DID 方法 规范的要求。

7.1 方法语法

所有 DID 方法规范在定义 特定于方法的 DID 语法时的要求如下:

  1. DID 方法规范 MUST 正确定义一个特定于方法的 DID 方案,该方案由 3.1 DID 语法method-name 规则指定的正好一个方法名称标识。
  2. DID 方法规范 MUST 指定如何生成 DIDmethod-specific-id 组件。
  3. DID 方法规范 MUST 定义 method-specific-id 值的 大小写敏感性和规范化。
  4. method-specific-idMUST 在一个 DID 方法内唯一。method-specific-id 值本身 也可能是全局 唯一的。
  5. DID 方法生成的任何 DID MUST 是全局唯一的。
  6. 为减少 method-name 冲突的可能性,DID 方法 规范 SHOULD 注册到 DID Extensions [DID-EXTENSIONS] 仓库中。
  7. DID 方法 MAY 定义多个 method-specific-id 格式。
  8. method-specific-id 格式 MAY 包含冒号。冒号的使用 MUST 在语法上符合 method-specific-id ABNF 规则。
  9. DID 方法规范 MAYDID 路径指定 ABNF 规则, 这些规则比 路径中的通用规则更严格。
  10. DID 方法规范 MAYDID 查询 指定比本节通用规则更严格的 ABNF 规则。
  11. DID 方法规范 MAYDID 片段指定比本节通用规则 更严格的 ABNF 规则。
:method-specific-id 中的冒号

method-specific-id 中冒号的含义完全 取决于具体方法。DID 方法可以将冒号用于建立 层级划分的命名空间、标识 可验证数据注册表的特定实例或 部分,或 用于其他目的。 建议实现者避免假定任何与冒号相关且 可通用于所有 DID 方法的含义或 行为。

7.2 方法操作

所有 DID 方法规范在定义 方法操作时的要求如下:

  1. DID 方法规范 MUST 定义如何执行授权以 执行所有操作,包括任何必要的密码学过程。
  2. DID 方法规范 MUST 指定 DID 控制者 如何创建 DID及其关联的 DID 文档
  3. DID 方法规范 MUST 指定 DID 解析器如何使用 DID来解析 DID 文档,包括 DID 解析器如何验证响应的真实性。
  4. DID 方法规范 MUST 指定什么构成对 DID 文档的更新,以及 DID 控制者如何更新 DID 文档或者声明 不可能进行更新。
  5. DID 方法规范 MUST 指定 DID 控制者如何 停用 DID或者声明 不可能停用。

执行授权以实施这些 操作的一方的权威性,取决于具体 DID 方法。例如,DID 方法 可能 —

执行方法操作时,DID 方法可以使用其所需的任何数据结构, 包括中间的、部分的或临时的 DID 文档, 只要 它们保留在 DID 方法内部,并且方法操作返回的 DID 文档 完全符合要求,如 1.4 一致性中所定义。

7.3 安全要求

所有 DID 方法规范在编写 安全考量章节时的要求如下:

  1. DID 方法规范 MUST 遵循 RFC3552:编写 安全 考量章节中为 DID 操作提供的所有指南和规范性 语言,这些操作定义于 DID 方法规范中。
  2. 安全考量章节 MUST 记录 DID 方法规范中定义的 DID 操作所面临的以下攻击形式: 窃听、重放、消息插入、删除、修改、拒绝 服务、放大以及中间人攻击。其他已知 攻击形式 SHOULD 也被记录。
  3. 安全考量章节 MUST 讨论残余风险,例如 相关协议遭破坏、实现不正确或部署威胁缓解后仍存在的密码 风险。
  4. 安全考量章节 MUST7.2 方法 操作所要求的所有操作提供完整性保护和 更新认证。
  5. 如果涉及认证,尤其是用户-主机认证,则 认证方法的安全特性 MUST 被清楚 记录。
  6. 安全考量章节 MUST 讨论用于证明 DID 被唯一分配的策略机制。
  7. MUST 讨论特定于方法的端点认证。当 DID 方法使用具有不同网络拓扑的 DLT时,有时 会提供为 轻节点 瘦客户端 实现以减少所需计算资源,此时 DID 方法实现可用拓扑的安全假设 MUST 被 讨论。
  8. 如果协议纳入了密码学保护机制,则 DID 方法规范 MUST 清楚指出数据的哪些部分 受到哪些保护,并且 SHOULD 指出 密码学保护容易遭受的攻击类型。一些 示例包括仅完整性、机密性和端点认证。
  9. 应保密的数据(密钥材料、随机种子等) SHOULD 被清楚标记。
  10. DID 方法规范 SHOULD 说明并规定对 DID 文档进行签名的实现, 如适用。
  11. DID 方法使用点对点计算资源时,例如所有 已知的 DLT,这些资源的预期 负担 SHOULD 结合拒绝服务加以 讨论。
  12. 引入新的认证 服务 类型的 DID 方法,如 5.4 服务中所述,SHOULD 考虑 所支持认证协议的安全要求。

7.4 隐私要求

所有 DID 方法规范在编写 隐私考量章节时的要求是:

  1. DID 方法规范的隐私考量章节 MUST 讨论 [RFC6973] 第 5 节中 可能以特定于方法的方式适用的任何小节。需要考虑的小节包括:监视、存储 数据泄露、非请求流量、错误归因、关联、 识别、二次使用、披露和排除。

8. 安全考量

本节为非规范性内容。

本节包含使用去中心化标识符的人们在将此 技术部署到生产环境之前应考虑的各种安全考量。 强烈建议读者在阅读本节之前先阅读 受控标识符 v1.0规范的 安全考量章节。 DID 被设计为在许多 IETF 标准使用并记录于 [RFC3552] 的威胁模型下运行。本节 详细阐述了 [RFC3552] 中的若干考量, 以及其他 DID 架构特有的考量。

8.1 选择 DID 解析器

DID Extensions [DID-EXTENSIONS] 仓库包含 DID 方法名称及其对应 DID 方法规范的 资料性列表。实现者需要记住, 不存在中央权威机构来规定应将哪个 DID 方法规范用于 任何特定的 DID 方法名称。如果对某个特定 DID 解析器是否正确实现某个 DID 方法 存有疑问,则可以使用 DID 规范注册表查找已注册的规范, 并就使用哪个 DID 解析器 实现作出知情决策。

8.2 不可否认性

如果满足以下条件,则支持 DIDDID 文档更新的不可否认性:

8.3 无信任系统中的撤销

无信任系统是指所有信任都源自密码学上 可证明断言的系统,更具体地说,是指在确定系统中的信任时, 不将密码学系统之外的任何元数据纳入考虑的系统。 为了验证无信任系统中已撤销的 验证方法的签名或证明, DID 方法需要支持 versionIdversionTime 中的一个或两个,以及 updatednextUpdate 这两个 DID 文档元数据属性。当且仅当以下全部为 真时,验证者可以验证 被撤销密钥的签名或证明:

在愿意接受超出密码学输入之外的元数据的系统中, 也可以实现类似信任——但这始终需要 仔细判断 DID 文档的内容在签名事件发生时 是否包含预期内容。

8.4 DID 恢复

恢复是一种反应性安全措施,通过这种措施,一个由于 设备丢失等原因而失去执行 DID 操作能力的 控制者 能够重新获得执行 DID 操作的能力。

在考虑使用 DID 恢复时,以下考量可能有用:

8.5 人类友好标识符的作用

DID 在不需要中央 注册机构的情况下实现全局唯一性。这以牺牲人类可记忆性为代价。 能够生成全局无歧义标识符的算法 会产生没有人类含义的随机字符串。这种 权衡通常称为 Zooko 三角

有些用例需要从人类友好标识符出发来发现 DID。例如,自然语言 名称、域名,或 DID 控制者的常规地址, 例如移动电话号码、电子邮件地址、社交媒体用户名或 博客 URL。但是,将人类友好标识符映射到 DID,并以可验证且可信的方式完成该映射的问题, 不在本规范范围内。

针对此问题的解决方案定义在引用本规范的单独规范中,例如 [DNS-DID]。强烈建议 此类规范仔细考虑:

8.6 作为增强型 URN 的 DID

如果 DID 控制者希望如此,DIDDID URL 能够 充当持久的、位置无关的资源标识符。 此类标识符 被归类为统一资源名称(URN),并定义于 [RFC8141]。 DID 是 URN 的增强形式,为数字 资源提供密码学安全、位置无关的标识符,同时也提供可实现检索的元数据。 由于 DID 文档DID 本身之间存在 间接层,DID 控制者可以调整资源的实际位置——或者 甚至直接提供该资源——而无需调整 DID。 此类 DID 可以确定性地验证所检索的资源 实际上就是被标识的资源。

打算将 DID 用于此目的的 DID 控制者,建议遵循 [RFC8141] 中的安全考量。尤其是:

8.7 不可变性

许多网络安全滥用都取决于利用现实与 理性、善意参与者假设之间的差距。DID 文档的不可变性 可以提供一些安全收益。各个 DID 方法应 考虑去除其不需要的行为或语义的约束。 在提供相同特性集合的同时,DID 方法锁定,就越不容易被恶意行为者操纵。

作为示例,请考虑对 DID 文档的一次编辑 可以更改 除文档根 id 属性之外的任何内容。但 服务在定义后更改其 type 是否真的可取?或者密钥更改其值是否可取?又或者 当对象的某些基本属性发生变化时,要求使用新的 id 是否 更好?网站的恶意接管通常旨在达到这样的结果:网站保留其主机名标识符, 但底层已被微妙地更改。如果规范要求网站的某些属性(例如 与其 IP 地址关联的 ASN) 不可变,则异常检测会更容易,攻击也会 更难且成本更高。

对于绑定到全局事实来源的 DID 方法,直接、 即时查找 DID 文档的最新版本始终 是可能的。然而,似乎缓存层最终可能会位于 DID 解析器与该事实来源之间。如果确实如此, 当 DID 文档中对象的属性实际上存在细微差异时 却相信它们处于某种给定状态,可能会招致利用。这一点在某些查找是完整 DID 文档, 而 另一些查找是基于假定更大上下文的部分数据时尤其如此。

8.8 DID 文档中的加密数据

已知加密算法可能会由于密码学和计算能力的进步而失效。 建议实现者假定,放置在 DID 文档中的任何加密数据,最终都可能以明文形式 提供给与加密数据可见范围相同的受众。如果 DID 文档是公开的,这一点尤其相关。

加密 DID 文档的全部或部分内容 不是长期保护数据的适当 手段。同样,将加密数据放入 DID 文档也不是保护个人 数据的适当手段。

鉴于上述注意事项,如果在 DID 文档中包含加密数据, 建议实现者不要关联任何可关联信息, 这些信息可能用于推断加密数据 与关联方之间的关系。可关联信息的示例包括 接收方的公钥、已知由接收方控制的数字资产标识符, 或对接收方的人类可读描述。

8.9 等价属性

鉴于 equivalentIdcanonicalId 属性由 DID 方法自身生成,适用于已解析 DID(出现在 DID 文档id 字段中)的相同安全和 准确性保证也适用于这些 属性。 alsoKnownAs 属性并不保证是准确的 等价声明,且不应在未执行 超出解析 DID 文档之外的验证步骤时依赖它。

equivalentIdcanonicalId 属性表达了对由同一 DID 方法产生的单个 DID变体的等价断言, 其可信程度取决于 请求方对 DID 方法以及符合要求的生产者和 解析器的信任程度。

alsoKnownAs 属性允许对不受同一 DID 方法管辖的 URI 作出等价断言,并且在未执行管辖 DID 方法之外的验证步骤时,不能被 信任。另请参阅 受控标识符 v1.0规范的 第 2.1.3 节:又称中的附加指导。

DID 文档中的任何其他安全相关属性一样, 依赖 DID 文档中任何等价声明的一方 应当 防止这些属性的值在完成适当验证后被攻击者替换。 对验证后存储在内存或磁盘中的 DID 文档的任何写访问 都是一种攻击向量,除非重新验证该 DID 文档, 否则可能绕过验证。

8.10 持久性

DID 被设计为具有持久性,使得 控制者无需 依赖单个受信任第三方或管理员来维护其 标识符。在理想情况下,没有管理员可以从 控制者手中夺取控制权,也没有 管理员可以阻止其标识符 用于认证、授权和证明等任何特定目的。 任何第三方都不能代表 控制者移除或使 某个实体的标识符不可操作,除非获得该 控制者的同意。

然而,需要注意的是,在所有支持密码学控制证明的 DID 方法中,证明控制权的手段总是可以通过转移秘密密码学材料 转移给另一方。 因此,依赖标识符长期持久性的系统 必须定期检查,以确保该标识符事实上仍处于 预期方的控制之下。

遗憾的是,仅凭密码学无法确定 与给定 验证 方法关联的秘密密码学材料是否已被泄露。很可能 预期的 控制者 仍然可以访问该秘密密码学材料 ——并因此能够作为验证 过程的一部分执行控制证明——与此同时,恶意行为者也能访问这些 相同密钥或其副本。

因此,密码学控制证明预期只能作为评估高风险 场景所需身份保证级别的一个 因素。基于 DID的认证提供的保证远高于 用户名和密码,因为它能够在系统之间不传输秘密的情况下确定对 密码学秘密的控制权。然而, 它并非绝对可靠。涉及敏感、高价值或 生命关键操作的场景,预期应酌情使用额外因素。

除了由不同 控制者使用可能带来的歧义之外, 通常也无法保证给定 DID 在任何给定时间点 都是在指代同一主体。从技术上讲, 控制者可能将 DID 重用于不同主体,并且 更微妙地说,主体的精确定义可能随 时间变化或被误解。

例如,考虑一个用于独资企业的 DID,它接收 用于金融交易的各种凭证。对 控制者而言, 该标识符指代该企业。随着企业发展,它最终 注册成为有限责任公司。该 控制者 继续使用同一个 DID,因为对 他们而言,该 DID 指代该企业。然而,对于州政府、税务机关和 地方市政机构而言,该 DID 不再指代 同一实体。 这种含义上的微妙转变对信贷提供方或 供应商是否重要,必然由他们决定。在许多情况下,只要 账单得到支付且催收可以执行,这种转变并不重要。

由于这些潜在歧义,DID 应被视为在 上下文中有效,而不是绝对有效。它们的持久性并不意味着 它们指代完全相同的主体,也不意味着它们处于同一 控制者的控制之下。 相反,需要理解 DID 创建的上下文、它如何被使用,并考虑 其含义可能发生的转变,同时采用流程和策略来应对潜在 以及不可避免的语义漂移。

8.11 评估相互竞争的 考量

本节为非规范性内容。

本规范不要求也不建议使用任何特定类型的 可验证数据注册表。不同用例可能 导致不同要求。不同要求可能会产生具有不同权衡的不同考量。 例如,在计算(能源使用)、信任 (服从权威)、协调(网络带宽)或内存(物理 存储)之间的权衡,对于任何给定用例可能适用,也可能不适用。其他用例 可能不会作出相同权衡。那些需要为其用例考虑不同标准的人 可参考 DID Method Rubric,该文档提供 评估标准,帮助决策者确定某个特定 DID 方法是否适合其用例。

9. 隐私考量

本节为非规范性内容。

由于 DIDDID 文档被 设计为直接由 DID 控制者管理,因此将 Privacy by Design [PRIVACY-BY-DESIGN] 原则应用于 去中心化标识符架构的所有方面至关重要。 这七项原则在本规范的整个制定过程中都得到了应用。本规范所采用的设计 并不假定存在注册机构、托管 公司或其他中间服务提供商来建议或应用 额外的隐私保护措施。本规范中的隐私是预防性的, 而非补救性的,并且是内嵌的默认设置。在阅读本节之前,强烈建议读者 阅读 受控标识符 v1.0 规范的 隐私考量章节,因为其中包含 也适用于 DID的更一般性隐私考量。本节其余部分 涵盖特定于 去中心化标识符的隐私考量,并补充 受控标识符 v1.0 规范中提供的指导。

9.1 群体隐私

DID 主体与群体中的其他主体无法区分时, 隐私才可获得。当私下与另一方交互这一行为本身 就是一个可识别标志时,隐私会大幅减弱。

DIDDID 方法需要 致力于改善群体隐私,特别是为那些 合法且最需要它的人改善群体隐私。应选择默认保留匿名性和假名性的 技术和人机界面。为减少数字 指纹,应在请求方 实现之间共享通用设置,尽量减少有线协议上的协商选项,使用 加密传输层,并将消息填充到标准长度。

A. 示例

本节为非规范性内容。

A.1 DID 文档

本节为非规范性内容。

可选扩展和其他验证方法类型,见 验证方法类型 [DID-EXTENSIONS]。

这些示例仅供参考,最佳实践是避免将同一个验证方法用于 多个 目的。

示例 12:具有 1 种验证方法 类型的 DID 文档
  {
    "@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"
      }
    ]
}
示例 13:包含许多不同密钥类型的 DID 文档
{
  "@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)
      }
    }
  ]
}
示例 14:包含不同验证方法 类型的 DID 文档
{
  "@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"
    }
  }]
}
示例 15:使用相对 DID URL 的 DID 文档
  {
    "@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"
    ]
}

A.2 证明

本节为非规范性内容。

这些示例仅供参考。有关更多示例,见 可验证凭证数据模型 v2.0

示例 16:链接到 Multikey 类型验证 方法的可验证凭证
{
  // 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"
  }
}
示例 17:链接到 JsonWebKey 类型验证 方法的可验证凭证
{  // 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"
  }
}
示例 18:链接到 bls12381 验证方法的可验证凭证
{  // 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"
  }
}
示例 19:链接到 bls12381 验证方法的可验证凭证选择性披露零 知识证明
{
  // 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"
  }
}
示例 20:作为已解码 JWT 的可验证凭证
{ // 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"
}

A.3 加密

本节为非规范性内容。

这些示例仅供参考,最佳实践是避免在 JWE 标头中披露不必要的信息。

示例 21:通过 kid 链接到验证方法的 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"
}

B. 架构考量

本节为非规范性内容。

B.1 详细架构图

本节为非规范性内容。

下图展示了 4. 数据模型5. 核心属性7. 方法以及 [DID-RESOLUTION] 之间的关系。


  DID 和 DID 文档记录在可验证数据注册表上;DID 解析为
  DID 文档;DID 指代 DID 主体;DID 控制者控制 DID
  文档;DID URL 包含 DID;DID URL 被解引用为 DID 文档
  片段或外部资源;DID 解析器实现 resolve 函数;DID
  URL 解引用器实现 dereferencing 函数;DID 方法操作
  可验证数据注册表;DID 解析器和 DID URL 解引用器指示 DID
  方法。
4 DID 架构及其基本组件关系的详细概览。

B.2 DID 的创建

本节为非规范性内容。

DID 的创建是一个 由每种 DID 方法定义的过程。一些 DID 方法,例如 did:key,是纯 生成式的,也就是说,DIDDID 文档是通过 将一段密码学材料转换为符合要求的 表示形式而生成的。其他 DID 方法可能 要求使用 可验证数据注册表,其中 DIDDID 文档 只有在按照相应 DID 方法定义完成注册后,才会被第三方 认可为存在。相应 DID 方法还可能定义其他过程。

B.3 确定 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 的时间不同而不同。

B.4 指代 DID 文档

本节为非规范性内容。

DID 指代 DID 主体,并解析为 DID 文档(通过遵循 DID 方法规定的协议)。DID 文档 并不是独立于 DID 主体的单独资源,也没有一个 独立于 DIDURI。 相反,DID 文档DID 解析的产物,由 DID 控制者控制,目的是 支持与 DID 主体进行密码学可验证的交互。

下面的图模型说明了这种区别。


图示一个图模型,展示 DID 控制者如何分配 DID 来指代
DID 主体,并解析为描述 DID 主体的 DID 文档。
5 DID 是由 DID 控制者分配的标识符,用于指代 DID 主体,并解析为描述该 DID 主体DID 文档DID 文档DID 解析的产物,并不是区别于 DID 主体的单独资源。 另请参阅:叙述性 描述
图的顶部出现两个填充的黑色圆点,一个在左侧, 标记为 "DID Controller",一个在右侧,标记为 "DID Subject"。一个 矩形出现在下方,其右下角向内弯折形成一个小三角形, 其中包含标签 "DID Document"。箭头在这三个项目之间延伸, 如下所示。一条实心红色箭头从 DID Controller 圆点直接向右指向 DID Subject 圆点,其上方以 大字体标记为 "DID",下方以小号斜体标记为 "Identifies"。其他箭头 标签也使用小号斜体。一条虚线红色箭头,标记为 "Resolves to",从 DID Controller 延伸出来,与第一条箭头从同一水平线开始, 然后向下弯曲,指向 DID Document 矩形。一条绿色箭头, 标记为 "Controls",从 DID Controller 直接指向 DID Document。一条 绿色箭头标记为 "Controller",方向相反,从 DID Document 指向 DID Controller,并在图的左侧向外画弧。一条 蓝色箭头,标记为 "Describes",从 DID Document 直接指向 DID Subject。

B.5 DID 文档中的声明

本节为非规范性内容。

DID 文档中的每个属性都是 DID 控制者作出的声明,用于描述:

DID 文档中唯一必需的属性是 id, 因此这是唯一保证会出现在 DID 文档中的声明。 该声明在 5 中以 DIDDID 主体之间的直接链接示出。

B.6 发现 关于 DID 主体的更多信息

本节为非规范性内容。

用于发现更多关于 DID 主体信息的选项,取决于 DID 文档中存在的属性。如果存在 service 属性,则可以从 服务端点请求更多信息。例如,通过 查询支持针对一个或多个 描述 DID 主体的声明(属性)提供可验证凭证的 服务端点

另一种选择是在 DID 文档中存在 alsoKnownAs 属性时使用它。DID 控制者可以使用该属性 提供一个由其他 URI(包括其他 DID)组成的列表,这些 URI 指代 同一个 DID 主体。解析或解引用这些 URI 可能产生 该 DID 主体的其他描述或表示形式, 如下图所示。


          图示一个图模型,其中 alsoKnownAs 属性以弧线指向另一个节点,
          该节点表示一个不同资源,该资源可被解引用为
          DID 主体的另一种描述。
6 DID 文档可以使用 alsoKnownAs 属性来 断言另一个 URI(包括但不一定是另一个 DID)指代同一个 DID 主体。另请参阅:叙述性描述
图中包含三个小的黑色填充圆点、两个带弯折角的矩形、 它们之间的箭头以及标签,如下所示。左上方是一个 标记为 "DID Controller" 的圆点。右上方是一个标记为 "DID Subject" 的圆点。右下中部是一个没有标签的圆点。右下方是一个 标记为 "Description" 的矩形。图的中央是一个 标记为 "DID Document" 的矩形。在 DID Document 矩形内部,在 其标签下方,有两行代码:"alsoKnownAs: [" 和 "URI]"。一条黑色箭头 从第二行向右延伸,穿过矩形边界, 指向图右侧的无标签圆点。该箭头上方以大字体标记为 "URI",下方以斜体标记为 "Identifies"。一条黑色箭头从 无标签圆点向下指向 Description 矩形,标记为 "Dereferences to"。一条蓝色箭头, 标记为 "Describes",从 Description 向右画弧,向上指向 DID Subject。一条同样标记为 "Describes" 的蓝色箭头,从图中央 标记为 "DID Document" 的矩形,直接向右上指向 DID Subject 圆点。一条红色箭头,标记为 "alsoKnownAs",从 DID Subject 向下指向无标签圆点。一条红色箭头位于图像顶部,其上方以大字体标记为 "DID",下方以斜体字体标记为 "Identifies",从 DID Controller 指向 DID Subject。一条红色虚线从同一位置开始, 但分叉并向下弯曲,指向图像中央的 DID Document 矩形。一条绿色箭头, 标记为 "Controls",从 DID Controller 直接指向 DID Document。另一条 绿色箭头方向相反,标记为 "Controller",在图像左侧向外弯曲, 从 DID Document 指向 DID Controller。

B.7 提供 DID 主体的表示形式

本节为非规范性内容。

如果 DID 主体是可以从互联网检索的数字资源, DID 方法可以选择构造一个 DID URL, 该 URL 返回 DID 主体本身的表示形式。例如, 需要持久、密码学可验证标识符的数据模式 可以被分配一个 DID,并且传入指定的 路径查询可以作为一种 标准方式来检索该模式的 表示形式。

类似地,DID可用于指代 数字资源(例如图像),如果适用的 DID 方法 支持该功能,则该资源可以直接从 可验证数据注册表 返回。

B.8 为 现有 Web 资源分配 DID

本节为非规范性内容。

如果网页或任何其他 Web 资源的控制者希望为其 分配一个持久、密码学可验证的标识符, 控制者可以给它一个 DID。例如,由博客 托管公司托管的博客(位于该托管公司的域名之下)的作者 可以为该博客创建一个 DID。在 DID 文档中, 作者可以包含 alsoKnownAs 属性,指向 该博客的当前 URL,例如:

"alsoKnownAs": ["https://myblog.blogging-host.example/home"]

如果作者随后将博客迁移到另一家托管公司 (或迁移到作者自己的域名),作者可以更新 DID 文档, 使其指向该博客的新 URL,例如:

"alsoKnownAs": ["https://myblog.example/"]

DID实际上为 博客 URL 增加了一层间接性。这 层间接性由作者控制,而不是由博客托管 公司等外部行政权威控制。这就是 DID 能够有效作为增强型 URN(统一资源 名称)发挥作用的方式——即作为一种信息资源的持久标识符, 其网络位置可能随时间变化。

B.9 DID 控制者与 DID 主体之间的关系

本节为非规范性内容。

为避免混淆,根据 DID 主体DID 控制者之间的关系,将其分类为两个不相交的集合 会很有帮助。

B.9.1 集合 #1: DID 主体就是 DID 控制者

本节为非规范性内容。

第一种情况,如 7 所示,是 DID 主体同时也是 DID 控制者的常见场景。当个人或 组织创建 DID用于自我标识时,就是这种情况。


图示一个图模型,其中从 DID 主体到 DID 控制者存在等价弧线。
7 DID 主体DID 控制者是同一实体。另请 参阅:叙述性 描述
图中出现两个小黑色圆点,一个在左上方,标记为 "DID Controller",一个在右上方,标记为 "DID Subject"。一条实心红色 箭头从 DID Controller 圆点延伸到 DID Subject 圆点,箭头上方以 大号粗体文本标记为 "DID",箭头下方以小号斜体文本标记为 "Identifies"。一条虚线红色双向箭头,标记为 "Equivalence", 在两个圆点之间形成弧线,位于二者之间和上方的空间中。 图的下部是一个带弯折角、黑色轮廓的矩形, 其中包含标签 "DID Document"。箭头在该 DID Document 矩形与表示 DID Controller 和 DID Subject 的小黑色圆点之间指向,带有斜体标签,如下所示。 一条蓝色箭头从 DID Document 指向 DID Subject,标记为 "Describes"。 一条绿色箭头从 DID Controller 指向 DID Document,标记为 "Controls"。一条绿色箭头 从 DID Document 指向 DID Controller,向外成弧,标记为 "Controller"。一条虚线红色箭头,标记为 "Resolves to",从 DID controller 起始向右,从指向 DID Subject 的箭头处分叉,然后向下弯曲指向 DID Document。

从图模型的角度看,即使在 7 中被标识为 DID 控制者DID 主体的节点 是不同的,也有一条 逻辑弧线连接它们,以表达语义等价关系。

B.9.2 集合 #2:DID 主体不是 DID 控制者

本节为非规范性内容。

第二种情况是 DID 主体DID 控制者是分离的实体。例如,当父母为 子女创建 并维护一个 DID的控制权时;当 公司为子公司创建并 维护一个 DID的控制权时;或者 制造商为产品、物联网设备 或数字文件创建并维护一个 DID的控制权时,就是这种情况。

从图模型的角度看,与集合 1 的唯一区别是 DID 主体DID 控制者节点之间 不存在等价弧线关系。

B.10 多个 DID 控制者

本节为非规范性内容。

DID 文档可能具有多个 DID 控制者。这可能以两种方式之一发生。

B.10.1 独立控制

本节为非规范性内容。

在这种情况下,每个 DID 控制者都可以独自行动,也就是说, 每一个控制者都拥有独立更新 DID 文档的完整权限。从 图模型的角度看,在这种配置中:

  • 每个额外的 DID 控制者都是另一个 独立的图节点 (它可能由其自己的 DID 标识)。
  • 每个 DID 控制者DID 文档之间都存在相同的弧线("controls" 和 "controller")。

            图示三个 DID 控制者,每个都与 DID 文档具有独立的
            控制关系
8 多个可各自独立行动的独立 DID 控制者。另请 参阅:文本 描述
左侧垂直出现三个黑色圆点,每个都标记为 "DID Controller"。从每个圆点出发,一对绿色箭头向图中央延伸, 指向一个标记为 "DID Document" 的单个矩形。该 矩形右下角被剪切并向内弯折形成一个小三角形,仿佛表示一张 角被卷起的纸。每对绿色箭头由一条从黑色圆点指向 矩形、标记为 "Controls" 的箭头,以及一条方向相反、从 矩形指向黑色圆点、标记为 "Controller" 的箭头组成。从 矩形右侧延伸出一条蓝色箭头,标记为 "Describes",指向 一个标记为 "DID Subject" 的黑色圆点。

B.10.2 群组控制

本节为非规范性内容。

在群组控制的情况下,DID 控制者预期以某种方式 共同行动,例如使用一种需要多个数字签名("multi-sig")或阈值数量 数字签名("m-of-n")的密码学算法。用于 验证证明的这些额外阈值,可以在验证方法中表达,如 5.2 验证方法一节所述,或者可以作为 验证方法验证材料的内在组成部分,在这种情况下, 参与生成特定数字签名的 DID 控制者数量会出于 隐私原因被隐藏。要求由群组成员执行的密码学操作组合来产生证明的验证方法,可用于控制 DID 文档的内容;其具体实现方式取决于各个 DID 方法规范。

从功能角度看,此选项类似于单个 DID 控制者,因为尽管 DID 控制者群组中的每个 DID 控制者都有自己的图节点, 实际控制会折叠为一个单一逻辑图节点, 表示 DID 控制者群组,如 9 所示。


图示三个 DID 控制者共同作为单个 DID 控制者群组来控制 DID 文档
9 预期共同作为 DID 控制者群组行动的多个 DID 控制者。另请参阅:叙述性描述
左侧有三个黑色填充圆点,左边用一个大括号标记为 "DID Controller Group"。 从这三个圆点中的每一个,都有一条绿色箭头向右中央延伸。 这三条箭头汇聚到一个单一的白色填充圆点。该白色圆点右侧通过 一对水平绿色箭头连接到一个形状像带卷角页面的矩形, 该矩形标记为 "DID Document"。上方箭头向右,从白色圆点指向 矩形,标记为 "Controls"。下方箭头向左,从矩形指向 白色圆点,标记为 "Controller"。从矩形右侧延伸出一条 蓝色箭头,标记为 "Describes",指向一个黑色圆点,标记为 "DID Subject"。

DID 主体是 组织、公司、政府机构、社区或其他 不由单一个人控制的群组时,这种配置通常适用。

B.11 更改 DID 主体

本节为非规范性内容。

DID 文档具有正好一个 DID,它指代 DID 主体。该 DIDid 属性的值表示。此属性值在 DID 文档的生命周期内不可变。

然而,由 DID 标识的资源,即 DID 主体,可能会随时间变化。这属于 DID 控制者的专属权限。更多细节见 8.10 持久性一节。

B.12 更改 DID 控制者

本节为非规范性内容。

DID 文档DID 控制者可能会随时间变化。 但是,根据其实现方式,DID 控制者的变化可能不会通过 DID 文档 本身的变化表现出来。例如,如果该变化是通过底层密码学密钥或 用于 DID 文档中一个或多个 验证 方法的其他控制手段的所有权转移来实现的,它可能 与标准密钥轮换无法区分。

另一方面,如果该变化是通过更改 controller 属性的值来实现的,则这种变化将是透明的。

如果验证 DID 控制者的变化非常重要,建议实现者 根据修订后的 DID 文档中的 验证 方法,对新的 DID 控制者进行认证

C. 修订历史

本节为非规范性内容。

本节包含自本规范作为 W3C 首次公开工作草案发布以来 所作的更改。

自 DID v1.0 推荐标准以来的更改包括:

自 DID v1.0 第二次候选 推荐以来的更改包括:

自 DID v1.0 第一次候选 推荐以来的更改包括:

自 DID v1.0 首次公开工作 草案以来的更改包括:

D. 致谢

本节为非规范性内容。

工作组向我们的主席 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。

E. IANA 考量

当本规范成为 W3C 提议推荐标准时, 本节将提交给 Internet Engineering Steering Group (IESG) 进行审查、批准,并向 IANA 注册。

E.1 application/did

类型名称:
application
子类型名称:
did
必需参数:
可选参数:
编码考量:
RFC 8259,第 11 节
安全考量:
DID Core v1.1,安全 考量
互操作性考量:
不适用
已发布规范:
https://www.w3.org/TR/did/
使用此媒体类型的应用:
任何需要去中心化、持久、 密码学可验证且可解析标识符的应用。应用通常包括 密码学身份系统、设备的去中心化网络,以及 签发或验证可验证凭证的网站。
附加信息:
魔数:
不适用
文件扩展名:
.did
Macintosh 文件类型代码:
TEXT
获取更多信息的联系邮箱:
W3C Decentralized Identifiers Working Group public-did-wg@w3.org
预期用途:
通用
使用限制:
作者:
Drummond Reed, Manu Sporny, Markus Sabadello, Dave Longley, Christopher Allen
变更控制者:
W3C

JSON-LD 环境中使用的片段标识符按照与 JSON-LD 1.1:application/ld+json 媒体类型 [JSON-LD11] 相关联的规则处理。JSON 环境中使用的片段标识符 与 JSON-LD 环境中的片段标识符具有相同的语义解释。用于 执行片段解析的算法见 受控标识符 v1.0 规范的 第 3.4 节:片段解析, 该规范由 去中心化 标识符(DID)v1.1 规范扩展。

F. 参考文献

F.1 规范性参考文献

[CID]
受控标识符 v1.0. Michael Jones; Manu Sporny. W3C. 2025年5月15日. W3C 推荐标准. URL: https://www.w3.org/TR/cid-1.0/
[DID-CORE]
去中心化标识符(DID)v1.0. Manu Sporny; Amy Guy; Markus Sabadello; Drummond Reed. W3C. 2022年7月19日. W3C 推荐标准. URL: https://www.w3.org/TR/did-core/
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 现行标准. URL: https://infra.spec.whatwg.org/
[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 2020年7月16日. W3C 推荐标准. URL: https://www.w3.org/TR/json-ld11/
[RFC2119]
用于 RFC 中表示 要求级别的关键词. S. Bradner. IETF. 1997年3月. 最佳当前实践. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3552]
编写关于安全 考量的 RFC 文本指南. E. Rescorla; B. Korver. IETF. 2003年7月. 最佳当前实践. URL: https://www.rfc-editor.org/rfc/rfc3552
[RFC3986]
统一资源标识符(URI):通用 语法. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005年1月. 互联网 标准. URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC5234]
语法规范的增强型 BNF: ABNF. D. Crocker, Ed.; P. Overell. IETF. 2008年1月. 互联网标准. URL: https://www.rfc-editor.org/rfc/rfc5234
[RFC6838]
媒体类型规范和注册 程序. N. Freed; J. Klensin; T. Hansen. IETF. 2013年1月. 最佳当前 实践. URL: https://www.rfc-editor.org/rfc/rfc6838
[RFC8174]
RFC 2119 关键词中大写与小写的歧义. B. Leiba. IETF. 2017年5月. 最佳当前实践. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8259]
JavaScript Object Notation(JSON)数据 交换格式. T. Bray, Ed. IETF. 2017年12月. 互联网标准. URL: https://www.rfc-editor.org/rfc/rfc8259
[URL]
URL Standard. Anne van Kesteren. WHATWG. 现行标准. URL: https://url.spec.whatwg.org/
[XMLSCHEMA11-2]
W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 2012年4月5日. W3C 推荐标准. URL: https://www.w3.org/TR/xmlschema11-2/

F.2 资料性参考文献

[DID-1.1]
去中心化标识符(DID)v1.1. Manu Sporny; Dmitri Zagidulin. W3C. 2026年2月21日. W3C 工作草案. URL: https://www.w3.org/TR/did-1.1/
[DID-EXTENSIONS]
去中心化标识符 扩展. Manu Sporny; Markus Sabadello. W3C. 2025年12月11日. W3C 工作 组说明. URL: https://www.w3.org/TR/did-extensions/
[DID-RESOLUTION]
去中心化标识符解析(DID Resolution)v0.3. Markus Sabadello; Dmitri Zagidulin. W3C. 2026年2月8日. W3C 工作草案. URL: https://www.w3.org/TR/did-resolution/
[DID-RUBRIC]
DID 方法评估准则 v1.0. Joe Andrieu; Daniel Hardman. W3C. 2021年11月19日. W3C 工作组说明. URL: https://www.w3.org/TR/did-rubric/
[DID-USE-CASES]
去中心化 标识符的用例与要求. Joe Andrieu; Phil Archer; Kim Duffy; Ryan Grant; Adrian Gropper. W3C. 2021年3月17日. W3C 工作组说明. URL: https://www.w3.org/TR/did-use-cases/
[DNS-DID]
DNS 中的去中心化 标识符(DID). Alexander Mayrhofer; Dimitrij Klesev; Markus Sabadello. 2019年2月. Internet-Draft. URL: https://datatracker.ietf.org/doc/draft-mayrhofer-did-dns/
[IANA-URI-SCHEMES]
统一资源 标识符(URI)方案. IANA. URL: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
[MATRIX-URIS]
Matrix URIs - Ideas about Web Architecture. Tim Berners-Lee. 1996年12月. 个人观点. URL: https://www.w3.org/DesignIssues/MatrixURIs.html
[PRIVACY-BY-DESIGN]
Privacy by Design. Ann Cavoukian. Information and Privacy Commissioner. 2011. URL: https://iapp.org/media/pdf/resource_center/pbd_implement_7found_principles.pdf
[RFC6901]
JavaScript Object Notation(JSON) Pointer. P. Bryan, Ed.; K. Zyp; M. Nottingham, Ed. IETF. 2013年4月. 提议 标准. URL: https://www.rfc-editor.org/rfc/rfc6901
[RFC6973]
互联网 协议的隐私考量. A. Cooper; H. Tschofenig; B. Aboba; J. Peterson; J. Morris; M. Hansen; R. Smith. IETF. 2013年7月. 资料性. URL: https://www.rfc-editor.org/rfc/rfc6973
[RFC8141]
统一资源名称(URN). P. Saint-Andre; J. Klensin. IETF. 2017年4月. 提议标准. URL: https://www.rfc-editor.org/rfc/rfc8141
[RFC9110]
HTTP Semantics. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. 互联网标准. URL: https://httpwg.org/specs/rfc9110.html
[VC-DATA-MODEL]
可验证凭证数据模型 v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025年5月15日. W3C 推荐标准. URL: https://www.w3.org/TR/vc-data-model-2.0/