从前有个小镇,所有居民的身份都登记在镇中心的一座大档案楼里。你想进图书馆、租房、报名考试,工作人员都会先去档案楼核对你的身份证复印件。久而久之,你的姓名、生日、住址散落在几十个柜台,档案楼一旦停电或想偷偷改记录,整个镇子都会乱套。后来,大家发明了一本“自己保管的身份手册”:你随身携带手册,每页记录一个声明,封面有一个独一无二的书号;镇上最重要的公告板负责登记每本手册的索引,任何机构都可以按书号查到这个手册当前公开放置的验证信息。要证明“手册是我的”,你只需要用一个藏在口袋里的印章,在对方递来的挑战书上盖一下,对方对照公告板上的信息验一下印章,就能确认你是本人——全程不需要你交出整本手册,也不需要档案楼出面。这本书册,就是去中心化身份(DID)的化身:公开的索引在链上,隐私的细节在你手里,验证的钥匙是你自己的密码学签名。

岗位关联

掌握去中心化身份的思维,你会更懂 Web3 产品、区块链钱包、分布式 AI 数据授权背后的身份底座,这是从“平台替你认证”走向“自己掌握身份”的关键一步。

目录
  1. 可视化演示
  2. 基础概念:从“一张证”到“一本手册”
  3. 工作原理:封面书号与公告板索引
  4. 关键算法:口袋里的印章与验章台
  5. 性能特性:手册能随身带,也要能撕页
  6. 优化策略:公告板拥挤了,怎么办
  7. 应用案例:手册能开哪些门
  8. 挑战方案:手册丢了、有人冒名怎么办
  9. 未来趋势:从“我的手册”到“可组合身份”
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示去中心化身份三大核心:DID解析与文档获取流程、VC可验证凭证签发验证、ZKP零知识证明选择性披露,切换查看DID运行机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

DID解析与文档获取 区块链节点存储DID Document,解析返回公钥与服务端点 验证方通过DID获取文档,使用公钥验证签名 DID = did:method:specific-id W3C标准DID实现去中心化自主身份管理

基础概念:从“一张证”到“一本手册”

在传统小镇,居民证明身份只能举着登记处发的证件。办宽带、住酒店、注册应用都要把证件复印件交出去,每个商家都留一份,证件样式也全由登记处说了算。人们想要一本可以自己保管、自由组合的“身份手册”。

去中心化身份(Decentralized Identifier, DID)应运而生。它不是一张电子证,而是一套协议框架:一个唯一标识符(DID)、一份描述持有者的文档(DID Document)、一对控制身份的密钥。三者分离,让“你是谁”和“谁在验证你”解耦。DID 不需要中央注册表,任何人都可以生成大量标识符;DID 文档通常包含公钥、验证方法和服务端点。把文档哈希锚定到区块链,就可以防篡改。从数学上看,身份可以被理解为一组可验证的属性断言。

所以,去中心化身份像是你手里那本可以不断添加新页的手册,而不是档案楼里翻给你看的那一格。

ID≜{A1,A2,…,An}\mathrm{ID} \triangleq \{A_1, A_2, \dots, A_n\}
这个公式想说:身份不是一个神秘 ID,而是一组“我是谁、我会什么、我拥有什么”的可验证声明集合。
  1. 身份定义符ID 表示一个去中心化身份,它不是数据库里的一行记录。
    ID≜\mathrm{ID} \triangleq
  2. 属性成员A_1, A_2, \dots, A_n 是出生年份、学历、会员资格等声明项,每一项都能被签名验证。
    {A1,A2,…,An}\{A_1, A_2, \dots, A_n\}

工作原理:封面书号与公告板索引

每一本身份手册的封面都有独一无二的书号,也就是 DID 标识符。在 DID 世界里,它长成 did:example:123abc 这样。DID 标识符本身不承载隐私,它只是一个入口。

拿到书号后,验证方去公告板(区块链)查找 DID 文档。文档类比手册的公开目录页,告诉别人“该用什么方法验章、公钥是什么、服务入口在哪”。注册 DID,就是把 DID 文档的哈希发布到链上;解析 DID,就是根据标识符找到对应的文档。这个过程不依赖单一服务器,任何持有一份区块链副本的人都能独立回答“这个书号当前指向哪本手册”。

从结构上看,DID 标识符遵循一种统一文法:

公告板上只写“书号 → 手册目录的位置”,不会把手册内容全抄上去。

did:method:method-specific-id\mathrm{did} : \mathrm{method} : \mathrm{method\text{-}specific\text{-}id}
可以把这三个部分想象成“身份手册”分类号:前缀告诉所有人“这是 DID”,中间是采用哪本分类法,最后是镇上公告板上的唯一索引。
  1. 固定前缀did: 是协议识别标记,用来区分 DID 与其他 URI。
    did:\mathrm{did} :
  2. 方法与方法特定标识method 指定解析协议或底层网络,method-specific-id 是该方法空间内的唯一 ID。
    method:method-specific-id\mathrm{method} : \mathrm{method\text{-}specific\text{-}id}

关键算法:口袋里的印章与验章台

你要证明手册是自己的,靠的不是人脸,而是数学印章。系统先生成一对密钥:私钥你贴身保管,公钥写进 DID 文档。验证方给出一个随机挑战(比如“请对当前时间戳签名”),你用私钥对挑战的哈希做签名,验证方用公钥验签。这既证明你拥有私钥,又不泄露私钥。

可验证凭证(VC)也沿用同一逻辑:签发方用私钥对声明签名,持有者保存声明,验证者只需要验证签发方的签名。整个过程不需要把整本手册交给对方。常用的 RSA 签名类算法可以概括为:

印章从不离开口袋,对方只看到盖出来的结果。

S=H(m)d mod n,H(m)≡Se(modn)S = H(m)^d \bmod n,\qquad H(m) \equiv S^e \pmod n
意思是:先用哈希函数给消息盖上“内容指纹”,再用私钥把指纹变成签名;验证者用公钥还原指纹,比对一致就通过。
  1. 哈希摘要消息 m 先被哈希成固定长度的数字 H(m)。
    H(m)H(m)
  2. 私钥印章用私钥 d 对摘要做幂模运算,得到签名 S。
    S=H(m)d mod nS = H(m)^d \bmod n
  3. 公钥验章验证者用公钥 e 对 S 做幂模运算,看看是否还原出 H(m)。
    H(m)≡Se(modn)H(m) \equiv S^e \pmod n

性能特性:手册能随身带,也要能撕页

手册比一张证更灵活:可以随身携带(可移植),可以只展示某一页(隐私保护),还可以在丢页时宣布作废(可撤销)。DID 的可移植性来自标识符与算法解耦:不换 DID,只换 DID 文档中的公钥。隐私保护通过可验证呈现实现:只披露一个属性,不必交出全部属性。可撤销性由 DID 注册表或解析规则支持,就像在公告板上贴一张作废通知。

抗审查性也是重要特性:由于解析依赖的是多副本的区块链,而不是某个动不动就被关停的企业服务器,单点封锁很难奏效。在工程上,DID 解析需要读取链上数据并本地验证签名。如果链很慢,解析就慢;但验签通常在毫秒级。延迟约等于链上访问时间加上本地验证时间:

所以 DID 并非天生慢,慢的地方是公告板,而不是你手里的手册。

Tresolve=Tchain+TverifyT_{\text{resolve}} = T_{\text{chain}} + T_{\text{verify}}
这个公式提醒我们:DID 的性能瓶颈通常在“跑公告板”的路上,而不是在你口袋里的验章台。
  1. 链上访问时间T_{\text{chain}} 是从区块链读取 DID 文档所在状态的开销。
    TchainT_{\text{chain}}
  2. 本地验证时间T_{\text{verify}} 是客户端验签、检查有效期等本地计算开销。
    TverifyT_{\text{verify}}

优化策略:公告板拥挤了,怎么办

当整个小镇的人都把书号登到同一块公告板上,公告板开始拥挤,手续费上涨。优化方向不是取消公告板,而是分层提效。常见策略有四种:用二层网络(L2)打包批量写入,降低单次上链成本;把大文档或凭证内容放链下(IPFS 等),链上只存哈希;对多个签名做批量验证,节省验证开销;通过跨链协议让不同链上的 DID 可以互相解析。

这些优化让 DID 系统在不牺牲去中心化的前提下提高吞吐。可以用“每秒上链处理量”来观察优化效果:

这就相当于小镇给公告板加了快速通道、临时仓库和错峰规则,书号索引依旧公开可查。

TPS=NtxTblock\mathrm{TPS} = \frac{N_{\text{tx}}}{T_{\text{block}}}
意思是每秒能处理的 DID 相关交易数,等于每个区块打包的交易数除以出块时间。
  1. 交易数量N_{\text{tx}} 是每个区块装入的 DID 相关交易数。
    NtxN_{\text{tx}}
  2. 出块时间T_{\text{block}} 是生成一个区块所需的秒数。
    TblockT_{\text{block}}

应用案例:手册能开哪些门

有了可自己掌控的手册,很多行业开始换门锁。第一个典型场景是分布式 AI 数据授权:AI 需要大量数据,传统模式是平台掌握账户,用户交数据。使用 DID 后,每个数据贡献者用自己的 DID 签名授权某个训练任务,授权记录上链,可审计、可撤销。

第二个场景是数字身份钱包:用 DID 做 Web3 社交登录,不再出现“用微信登录后隐私被平台拿走”的情况。第三个场景是供应链溯源:链条上每个参与方都有 DID,货物流转时用可验证凭证记录产地、质检报告,消费者可验真。这些场景的共同点是:把“身份验证”和“数据披露”分开,用签名代替交钥匙。一次典型的授权可以写成元组:

每一扇门都只看手册的授权页,而不是整本手册。

Auth=(did,scope,exp,sig)\mathrm{Auth} = (\mathrm{did}, \mathrm{scope}, \mathrm{exp}, \mathrm{sig})
通俗说,就是“谁、可以访问什么、到什么时候为止、签名证明授权真实”。
  1. 授权主体与范围did 是授权者的 DID,scope 是允许访问的数据范围。
    did,scope\mathrm{did}, \mathrm{scope}
  2. 期限与签名exp 是授权过期时间,sig 是持有者或签发方对声明的签名。
    exp,sig\mathrm{exp}, \mathrm{sig}

挑战方案:手册丢了、有人冒名怎么办

自己保管手册也有烦恼:手册可能丢、印章可能被偷、有人注册一堆手册冒充别人。私钥丢失是 DID 落地中最让人担心的问题。社区用密钥托管、社交恢复和秘密分享来降低风险:把私钥碎片分给多个信任节点,凑够阈值就能恢复。女巫攻击可以用声誉锚定、质押和信任图缓解。合规难题(如 KYC/AML)可以用可验证凭证加上零知识证明,既验证“确实通过 KYC”,又不暴露身份证号。

这些方案并没有让“DID 代表一把钥匙”变得复杂,而是在钥匙周围加了一层保险和约定。秘密分享的恢复过程可以概括为:

像把备用钥匙切成三截交给三位邻居:一个人打不开门,两个人合起来才能进。

S=∑i=1tλiSiS = \sum_{i=1}^t \lambda_i S_i
意思是从 t 个碎片中,用插值系数合成完整的签名或私钥。
  1. 碎片签名S_i 是第 i 个托管人手中的私钥碎片。
    SiS_i
  2. 阈值恢复\lambda_i 是插值系数,凑够 t 个碎片即可合成原私钥或签名。
    ∑i=1tλiSi\sum_{i=1}^t \lambda_i S_i

未来趋势:从“我的手册”到“可组合身份”

当身份能被自己掌控,下一步就是身份模块化。智能合约可以持有、管理 DID,实现自动化的链上身份行为;去中心化信用体系用链上身份行为数据替代拍脑袋评分;W3C 等标准组织正在统一不同 DID 方法,让不同链上的身份可以联通;AI Agent 也值得拥有 DID,用来在跨组织协作中证明“它的动作得到了授权”。

未来一个 DID 可能是多个子身份的聚合:人的档案、AI 助理、设备身份组合成一个动态身份。用数学语言可以写成:

身份手册不再只有一本,而是可以像积木一样拼出新的验证关系,但每一块积木仍归自己保管。

DIDagg=f(DID1,DID2,… )\mathrm{DID}_{\text{agg}} = f(\mathrm{DID}_1, \mathrm{DID}_2, \dots)
意思是多个来源的身份标识可以“拼”成一个更大的可验证身份,而每一块积木仍然归各自保管。
  1. 源身份集合DID_1, DID_2, \dots 是自然人、AI 代理、设备等不同主体的标识符。
    DID1,DID2,…\mathrm{DID}_1, \mathrm{DID}_2, \dots
  2. 聚合函数f 定义如何结合这些标识符,形成可验证的聚合身份。
    DIDagg=f(… )\mathrm{DID}_{\text{agg}} = f(\dots)

AI 应用场景

分布式AI训练中的身份授权

阶段:数据接入与模型训练

解决的问题:传统集中式平台用账号密码管理数据贡献者,用户看不到数据被谁用了,权限只能通过平台接口申请。DID 让每个数据贡献者用私钥签发数据访问授权,授权可链下验证、上链审计,撤回随时生效。

具体案例:联邦学习平台中,医院 A 用 DID 登录节点,将本地方数据集的“训练许可”做成可验证凭证,签名授权给某个模型任务;训练完成后,任务方出示授权和审计日志,医院 A 可验证任务方确实只读取了允许的字段。

去中心化AI内容溯源

阶段:内容生成与版权确认

解决的问题:AI 生成内容泛滥,传统水印容易被移除。创作者用 DID 签名内容哈希,验证者通过 DID 文档获得公钥验签,从而确认真实作者。

具体案例:数字艺术平台发布 AI 生成作品时,作者用自己的 DID 对作品哈希签名,平台展示验签结果,用户可以随时查看版权归属和创作时间。

数据钱包的隐私保护

阶段:AI 应用登录与用户画像

解决的问题:用户登录 AI 应用时往往被要求提供邮箱和手机号,造成过度收集。用 DID 钱包做社交登录,只披露必要属性。

具体案例:某个 AI 聊天助手支持通过 DID 钱包登录;当应用需要验证“已满18岁”时,用户只出示年龄范围证明,不暴露生日和身份证。

Python 演示

python52 行
import hashlib  def hash_to_int(message, n):    digest = hashlib.sha256(message.encode()).digest()    return int.from_bytes(digest, "big") % n  def generate_keys():    p, q = 61, 53    n = p * q    phi = (p - 1) * (q - 1)    e = 17    d = pow(e, -1, phi)    return (e, n), (d, n)  def sign(message, private_key):    d, n = private_key    m = hash_to_int(message, n)    return pow(m, d, n)  def verify(message, signature, public_key):    e, n = public_key    m = hash_to_int(message, n)    return pow(signature, e, n) == m  def main():    public_key, private_key = generate_keys()    ledger = {}    did = "did:example:alice"    ledger[did] = {"public_key": public_key, "revoked": False}     def resolve_did(did):        if did not in ledger:            raise ValueError("DID不存在")        info = ledger[did]        if info["revoked"]:            raise ValueError("DID已撤销")        return info     challenge = "证明你是did的主人"    signature = sign(challenge, private_key)    doc = resolve_did(did)    ok = verify(challenge, signature, doc["public_key"])    print("验证通过" if ok else "验证失败")  if __name__ == "__main__":    main()
目的:演示 DID 生命周期中的注册、解析、签名认证与撤销检查:持有者用私钥对挑战签名,验证方从模拟区块链解析 DID 文档并验签。
  1. def sign(message, private_key):签名入口,私钥藏在函数内部,不发给任何人。
  2. m = hash_to_int(message, n)把一条消息变成固定大小、可参与幂模运算的数字摘要。
  3. return pow(m, d, n)用私钥对摘要做幂模运算,形成签名“印章”。
  4. return pow(signature, e, n) == m用公钥验签并比对,成功就说明消息确实由私钥持有者签名。
  5. ledger[did] = {"public_key": public_key, "revoked": False}把 DID 文档写进模拟区块链账本。
  6. resolve_did(did)验证方按 DID 标识符查询链上文档。
  7. if info["revoked"]: raise ValueError("DID已撤销")检查 DID 是否已被撤销,保证失效身份不会被继续使用。

常见误区

误区我以为 DID 就是钱包地址,甚至可以直接把 DID 字符串当成公钥拿去验证签名。

正解DID 是持久标识符,公钥和验证方法存放在 DID 文档里,而且可以轮换。就像手册的封面书号不变,但你可以换锁换钥匙。

为何常见:因为最早接触 Web3 时只有钱包地址,容易把“标识符”和“验证信息”混为一谈。

误区去中心化身份应该是完全匿名的,任何情况下都追踪不到我是谁。

正解DID 是假名化:同一个 DID 在不同场合复用就可能被关联。它不依赖平台,但不是绝对匿名。想达到更强隐私,需要零知识证明等附加技术。

为何常见:“去中心化”让人误以为没有标识,其实只是没有中心管理者。

误区既然叫“去中心化”,DID 就应该是零信任,谁都不能骗我。

正解DID 移除了身份提供商这个单点信任,但引入了新的信任假设:信任区块链共识、信任特定 DID 方法的解析规则、信任 VC 签发方的公钥。公告板可以被任何人验证,但仍要信它的状态来源。

为何常见:“去中心化”这个词让人以为可以取消所有信任,其实只是重新分配信任。

误区忘记私钥就拨打客服或者找平台管理员,像“找回密码”一样重置身份。

正解正因为去中心化,管理员没有重置私钥的权限。所以需要事先用秘密分享、社交恢复或托管方案兜底。把备用钥匙切成三截分给不同人,不意味着把钥匙交给中心。

为何常见:用户用多了找回密码功能,以为 DID 也有后台重置入口。

误区可验证凭证就是把身份证整个数字化,发给对方后所有隐私都会暴露。

正解VC 支持选择性披露和零知识证明:签发的声明可以只展示部分字段,或给出“年龄大于18岁”的证明,而不必交出整份身份证。验证者验的是签名,不是全量数据。

为何常见:大家习惯办证时把整页信息复印出去,以为 VC 也一样。

面试题

Q1. 在 DID 体系中,用户身份的核心凭证是什么?

单选题 · easy

  • A.平台分配的会员号
  • B.自己保管的密钥对← 正确答案
  • C.手机号加验证码
  • D.区块链矿工地址

答案:B。DID 的核心不是平台发的号,而是自己保管的密钥对。会员号是档案楼发给你的,密钥对是你口袋里的印章。矿工地址只是记账地址,不是身份核心。

Q2. DID 标识符(例如 did:example:123)中的 did 是什么意思?

单选题 · easy

  • A.标识协议的固定前缀← 正确答案
  • B.身份所属国家代码
  • C.区块链网络名称
  • D.发行方组织编号

答案:A。did 是协议固定前缀,不表示国家、链或组织。它像手册封面的统一书号标识,只是告诉别人“这是一个 DID”。

Q3. DID 文档在链上存储的主要作用是什么?

单选题 · mid

  • A.存放用户隐私数据
  • B.直接保存用户私钥
  • C.记录公钥与验证方法← 正确答案
  • D.缓存好友和聊天记录

答案:C。DID 文档记录公钥、验证方法和服务端点,类似于手册的公开页只写“用什么方式验章”。隐私数据和私钥都不应该放在文档中。

Q4. 用户更换密钥后,DID 标识符应如何处理?

单选题 · mid

  • A.必须申请全新DID
  • B.保持DID不变更新文档← 正确答案
  • C.连同旧DID一起注销
  • D.需要向发证机关备案

答案:B。DID 标识符与验证方法解耦,公钥更换只需更新 DID 文档,不需要换 DID。好比封面书号不变,换锁后更新公告板索引即可。

Q5. 下列哪些是 DID 的核心特性?(多选)

多选题 · mid

  • A.可移植且不受平台锁定← 正确答案
  • B.完全匿名不可追踪
  • C.用户可控制撤销权限← 正确答案
  • D.依赖单一身份验证机构

答案:AC。可移植和可撤销都是 DID 的核心特性。B 是过度承诺,链上更多是假名;D 恰恰是 DID 要消除的中心化依赖。

Q6. 可验证凭证(VC)能验证通过的信任根是什么?

单选题 · hard

  • A.拿凭证的人是否诚实
  • B.签发方的有效数字签名← 正确答案
  • C.区块链上代币数量
  • D.验证服务器网络延迟

答案:B。VC 的可信根是签发方签名,凭证展示者是否诚实并不会改变密码学验证结果。类比镇政府的盖章才是关键,而不是来办事的人的笑容。

Q7. 下列哪些是 DID 相关的优化策略?(多选)

多选题 · hard

  • A.采用二层网络扩容← 正确答案
  • B.把大文档移到链下← 正确答案
  • C.批量处理签名验证← 正确答案
  • D.关闭跨链互操作接口

答案:ABC。L2 扩容、链下存储、批量验证都是 DID 常见优化手段。关闭跨链互操作与主流方向相反,不是优化策略。

Q8. 分布式 AI 训练中,DID 最适合承担哪项工作?

单选题 · hard

  • A.缩短模型推理时间
  • B.提供数据授权和审计← 正确答案
  • C.替代损失函数计算
  • D.提高GPU显存容量

答案:B。在分布式 AI 中,DID 主要负责数据授权和审计,与模型算力无关。好比手册的授权页决定 AI 能不能读数据,而不是让 AI 算得更快。

Q9. 私钥丢失时,社区常见的补救方法有哪些?(多选)

多选题 · mid

  • A.找中心化数据库找回
  • B.把私钥碎片分给托管人← 正确答案
  • C.写进社交恢复合约← 正确答案
  • D.向矿工广播私钥

答案:BC。私钥丢失后常用秘密分享和社交恢复。中心化找回违背去中心化初衷,广播私钥会直接泄露密钥。

Q10. 若想证明“我是密钥持有者且不泄露密钥”,应当使用哪种操作?

单选题 · extreme

  • A.把私钥发送给验证者
  • B.用私钥对挑战做数字签名← 正确答案
  • C.公开公钥和私钥对比
  • D.用私钥加密整个DID文档

答案:B。数字签名可以证明知道私钥且不泄露私钥。把私钥发出去、公开公钥和私钥、用私钥加密文档都不是知识证明。好比盖一个章,不必让验章人复制印章。