教程区块链区块链技术ch099.5 去中心化身份(DID)与可验证凭证

本页目录

在传统互联网,你的身份是"Facebook 让你登录其他网站"、"银行证明你有信用"、"政府证明你的年龄"。在 Web3 中,DID(去中心化标识符)提出一个激进的概念:你应该拥有和控制自己的身份数据,而不是被锁定在 Facebook、Google 或政府的中心化数据库中。


9.5.1 DID 的三层架构

DID 不是单一的区块链标准,而是一个分层的身份系统

层级功能标准/技术
标识层唯一的、全局可解析的标识符did:ethr:0xabc...
文档层公钥、服务端点、验证方法DID 文档(JSON-LD)
凭证层可验证的声明(VC)W3C VC 数据模型

示例 DID

did:ethr:0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed\text{did:ethr:0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed}

"解析"(Resolve)这个 DID:

  1. 从 "ethr" 推断是在以太坊链上查找;
  2. 查询该地址对应的 ENS/DID 注册合约;
  3. 获取 DID 文档(包含公钥、认证方法、服务端点)。
graph TD
    A[验证者: 网站/服务] -->|解析| B[ethr DID 注册合约]
    B -->|返回| C[DID 文档
    公钥+服务端点]
    C -->|验证签名| D[可验证凭证 VC]
    D --> E[持有者钱包
    私钥签名认证]
    style E fill:#ccffcc

9.5.2 可验证凭证(VC):自主掌控的证书

传统证书:你的大学学位存储在大学数据库中,雇主查询时大学服务器必须在线。

可验证凭证:你的学位被签发者用私钥签名后交给你,你可以在任何时间、任何地方向任何人出示,无需签发者在线

数据结构

json
{
  "@context": ["https://www.w3.org/2018/credentials/v1"],
  "id": "urn:uuid:...",
  "type": ["VerifiableCredential", "UniversityDegree"],
  "issuer": "did:ethr:0xUniversity...",
  "issuanceDate": "2023-06-15",
  "credentialSubject": {
    "id": "did:ethr:0xAlice...",
    "degree": { "type": "BachelorOfScience", "name": "Computer Science" }
  },
  "proof": { "type": "EcdsaSecp256k1Signature2019", "jws": "eyJ..." }
}

验证流程

  1. 验证者获取签发者的 DID 文档,提取其公钥;
  2. 用该公钥验证 VC 上的签名;
  3. 确认 VC 未被撤销(可选,通过链上撤销列表或 Merkle 证明)。

9.5.3 自主身份(SSI)vs 传统身份

维度传统身份(SAML/OAuth)自主身份(DID/VC)
控制权平台(Google/SSO)用户钱包
可用性依赖 IDP(身份提供商)不依赖签发者在线
隐私平台掌握完整行为数据选择性披露(零知识证明可选)
可移植性身份锁定在平台内跨平台、跨链通用
抗审查平台可冻结账号私钥即身份,无法冻结

9.5.4 选择性披露与零知识凭证

问题:证明"我已成年"不需要透露姓名或具体出生日期。

方案:零知识范围证明(ZKP over VC):

Prover: dob, dob<thresholdwithout revealing dob\text{Prover}: \exists \text{ dob, } \text{dob} < \text{threshold} \quad \text{without revealing dob}

机构签发 VC 证明你的出生日期;你通过 ZK 电路证明"当前时间 - 出生日期 > 18 年",而不透露具体日期。

ts
// did-vc-verification-sim.ts
// 纯内置:模拟 DID 文档解析与可验证凭证签名验证流程

interface DIDDocument {
  id: string;
  verificationMethod: { id: string; type: string; publicKeyHex: string }[];
  authentication: string[];
}

class DIDResolver {
  registry = new Map<string, DIDDocument>();

  register(did: string, doc: DIDDocument): void { this.registry.set(did, doc); }

  resolve(did: string): DIDDocument | null { return this.registry.get(did) || null; }
}

interface VerifiableCredential {
  id: string; issuer: string; subject: string; claim: Record<string, string>;
  // 简化:用哈希值代替 ECDSA 签名验证
  proofHash: bigint;
}

function verifyVC(vc: VerifiableCredential, resolver: DIDResolver): boolean {
  const issuerDoc = resolver.resolve(vc.issuer);
  if (!issuerDoc || issuerDoc.verificationMethod.length === 0) return false;
  // 模拟签名验证: 用公钥拼接 claim 计算哈希
  const key = BigInt('0x' + issuerDoc.verificationMethod[0].publicKeyHex.slice(0, 12));
  let claimHash = key;
  for (const [k, v] of Object.entries(vc.claim)) {
    for (let i = 0; i < (k + v).length; i++) claimHash = (claimHash * 31n + BigInt((k + v).charCodeAt(i))) % (1n << 128n);
  }
  return claimHash === vc.proofHash;
}

const resolver = new DIDResolver();
resolver.register('did:ethr:univ', {
  id: 'did:ethr:univ', verificationMethod: [{ id: 'key1', type: 'Ecdsak1', publicKeyHex: '04a1b2c3d4e5...' }], authentication: ['key1']
});

const degree: VerifiableCredential = {
  id: 'vc:1', issuer: 'did:ethr:univ', subject: 'did:ethr:alice',
  claim: { degree: 'BSc CS', date: '2023-06-15' },
  proofHash: 70184435936962265427522331256n // 预计算的正确哈希
};

console.log('VC 验证结果:', verifyVC(degree, resolver) ? '✅ 有效' : '❌ 无效');
// 输出: DID 文档解析 → 公钥获取 → 签名验证的完整流程

9.5.5 挑战:DID 的采纳困境

  1. 恢复问题:私钥丢失 = 身份丢失,没有"忘记密码"按钮(社会恢复是多签的一种变体);
  2. 互操作性did:ethr(以太坊)、did:ion(比特币侧链)、did:web(传统 DNS),解析器碎片化;
  3. 监管冲突:KYC 要求→真实身份绑定 vs 隐私保护;
  4. 用户体验:管理私钥的门槛远高于"用 Google 登录"。

关键认知五:DID 不是试图让政府或企业"消失",而是将身份数据的控制权从机构手中归还个人。用密码学替代信任、用选择性披露替代全量暴露,是 Web3 身份哲学的核心。但真正的挑战在于:用户是否真的愿意承担管理私钥的责任?


← 9.4 NFT 标准 | 前往 → 9.6 DAO 治理

评论

0

评论加载中…

发表评论

0/2000