引言:数字身份的困局
在当今的互联网生态中,我们的数字身份被割裂在数十个甚至上百个平台之中。每个平台都维护着我们的一份身份副本——用户名、密码、个人资料——而这些副本之间互不连通、互不认证。用户没有真正"拥有"自己的身份,平台可以随时删除、冻结或滥用这些身份数据。
去中心化身份(Decentralized Identity, DID)的出现,正是为了将数字身份的控制权归还给用户。这一理念源于"自我主权身份"(Self-Sovereign Identity, SSI)运动,经过 W3C 标准化、DIF(Decentralized Identity Foundation)等组织的推动,已经成为 Web3 基础设施的关键组成部分。
本文将从协议的底层架构出发,深入拆解 DID 和 VC 的技术原理,并通过完整的工程实践,展示如何构建一个可用的去中心化身份系统。
一、DID 核心规范解析
1.1 什么是 DID?
DID(去中心化标识符)是一种新型的全局唯一标识符,具有以下核心特征:
- 去中心化:无需中央注册机构即可生成和解析
- 持久性:一旦创建即永久存在,不依赖单一组织
- 可加密验证:可通过密码学方法证明对标识符的控制权
- 可解析性:可解析为包含公钥、服务端点等元数据的 DID 文档
一个典型的 DID 字符串格式如下:
did:example:123456789abcdefghi
did:ethr:0x1234...
did:key:z6MkhaX...
did:web:example.com:user:alice
did:ion:EOJson...
其中 did: 是 URI scheme,example/ethr/key/web/ion 是 DID 方法名,后面的部分是方法的特定标识符。
1.2 DID 文档结构
每个 DID 都关联一个 DID 文档(DID Document),这是 DID 生态的数据基础:
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2020/v1"
],
"id": "did:example:123456789abcdefghi",
"authentication": [{
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Ed25519VerificationKey2020",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}],
"assertionMethod": [{
"id": "did:example:123456789abcdefghi#keys-2",
"type": "Ed25519VerificationKey2020",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}],
"service": [{
"id": "did:example:123456789abcdefghi#vcs",
"type": "VerifiableCredentialService",
"serviceEndpoint": "https://example.com/vc/"
}]
}
DID 文档包含以下关键字段:
- authentication:用于身份认证的密钥和方法
- assertionMethod:用于签发可验证凭证的密钥
- service:关联服务端点(如 VC 服务、消息代理等)
- capabilityInvocation:能力调用密钥
- capabilityDelegation:能力委托密钥
1.3 常见 DID 方法
W3C 注册了超过 100 种 DID 方法,以下是工程中最常用的几种:
| DID 方法 | 底层 | 适用场景 | 优缺点 |
|---|---|---|---|
did:key | 无状态 | 临时身份、点对点通信 | 无需链上操作,但无法更新 |
did:web | DNS/Web | 企业身份、域名绑定 | 简单易用,依赖 DNS 安全 |
did:ethr | 以太坊 | DeFi、DAO 治理 | 生态成熟,Gas 成本高 |
did:ion | 比特币 | 长期身份、高安全性 | 利用 BTC 强大算力保护 |
did:peer | 无状态 | 私有网络、离线场景 | 无需任何基础设施 |
二、可验证凭证(Verifiable Credentials)
2.1 VC 数据模型
可验证凭证(VC)是 DID 生态中承载"声明"(Claim)的核心数据结构。一份典型的 VC:
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
"id": "http://example.edu/credentials/3732",
"type": ["VerifiableCredential", "AlumniCredential"],
"issuer": "did:example:76e12ec712ebc6f1c221ebfeb1f",
"issuanceDate": "2024-01-01T00:00:00Z",
"credentialSubject": {
"id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
"alumniOf": {
"id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
"name": "Example University"
}
},
"proof": {
"type": "Ed25519Signature2020",
"created": "2024-01-01T00:00:00Z",
"verificationMethod": "did:example:76e12ec712ebc6f1c221ebfeb1f#keys-1",
"proofPurpose": "assertionMethod",
"jws": "eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19"
}
}
VC 由三方参与:
- 签发者(Issuer):创建和签署 VC 的可信实体
- 持有者(Holder):接收并持有 VC 的用户
- 验证者(Verifier):核实 VC 真实性的第三方
2.2 VC 签发与验证流程
┌─────────┐ 签发 VC ┌─────────┐
│ │ ──────────────────> │ │
│ Issuer │ │ Holder │
│ (签发者) │ <── 出示 VP ── │ (持有者) │
│ │ │ │
└─────────┘ └─────────┘
^ │
│ 验证 VP │
└──────────────────────────────┘
Verifier (验证者)
持有者不直接出示 VC,而是将一份或多份 VC 打包为可验证展示(Verifiable Presentation, VP),由验证者验证其合法性。
三、工程实践:构建去中心化身份系统
3.1 技术选型
我们将基于以下技术栈构建一个去中心化身份系统:
- DID 方法:
did:key(零依赖)+did:web(企业集成) - 签名方案:Ed25519(高效)+ secp256k1(以太坊兼容)
- VC 格式:JWT-VC(紧凑)和 Linked Data Proofs(标准化)
- 存储层:IPFS(凭证存储)+ 区块链(DID 锚定)
3.2 DID 生成与解析
import { DIDResolver } from 'did-resolver'
import { getResolver as getDidKeyResolver } from 'did-resolver'
import { getResolver as getDidWebResolver } from 'did-resolver'
// 创建解析器实例
const resolver = new DIDResolver({
...getDidKeyResolver(),
...getDidWebResolver(),
})
// 解析 DID 文档
async function resolveDid(did) {
const result = await resolver.resolve(did)
if (result.didResolutionMetadata.error) {
throw new Error(`DID 解析失败: ${result.didResolutionMetadata.error}`)
}
return result.didDocument
}
// 示例:解析 did:key
const didDoc = await resolveDid('did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK')
console.log('DID 文档:', JSON.stringify(didDoc, null, 2))
3.3 VC 签发实现
import { Ed25519Signature2020 } from '@digitalbazaar/ed25519-signature-2020'
import { Ed25519VerificationKey2020 } from '@digitalbazaar/ed25519-verification-key-2020'
import vc from '@digitalbazaar/vc'
// 签发者密钥对
const issuerKeyPair = await Ed25519VerificationKey2020.generate({
id: 'did:example:issuer#key-1',
controller: 'did:example:issuer'
})
// 创建 VC
async function issueCredential(issuerDid, holderDid, claims) {
const credential = {
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiableCredential', 'ProfessionalCredential'],
issuer: issuerDid,
issuanceDate: new Date().toISOString(),
credentialSubject: {
id: holderDid,
...claims
}
}
// 签名 VC
const signedVC = await vc.issue({
credential,
suite: new Ed25519Signature2020({ key: issuerKeyPair }),
documentLoader: customDocumentLoader
})
return signedVC
}
// 示例:签发一份职业认证
const vc = await issueCredential(
'did:example:issuer',
'did:key:z6MkhaX...',
{
title: 'Senior Blockchain Engineer',
organization: 'Web3 Foundation',
experience: '5+ years'
}
)
console.log('签发的 VC:', JSON.stringify(vc, null, 2))
3.4 VC 验证实现
async function verifyCredential(signedVC) {
const result = await vc.verifyCredential({
credential: signedVC,
suite: [new Ed25519Signature2020()],
documentLoader: customDocumentLoader,
// 自定义检查:验证签发者是否为白名单中的实体
checkStatus: async (credential) => {
// 检查 VC 是否被吊销(查询吊销列表或状态合约)
const status = await checkRevocationStatus(credential)
if (status.revoked) {
throw new Error('该凭证已被签发者吊销')
}
}
})
if (result.verified) {
console.log('✅ VC 验证通过')
console.log('持卡人:', result.credential.credentialSubject.id)
console.log('声明:', result.credential.credentialSubject)
} else {
console.log('❌ VC 验证失败:', result.results[0].error?.message)
}
}
await verifyCredential(vc)
3.5 DID Auth 认证流程
// DID Auth 服务端挑战生成
function generateChallenge() {
return crypto.getRandomValues(new Uint8Array(32)).toString('hex')
}
// DID Auth 客户端签名
async function respondToAuthChallenge(did, privateKey, challenge) {
const message = `DID Auth Challenge: ${challenge}\nTimestamp: ${Date.now()}`
const signature = await ed.sign(
new TextEncoder().encode(message),
privateKey
)
return {
did,
challenge,
signature: base64Encode(signature),
timestamp: Date.now()
}
}
// DID Auth 服务端验证
async function verifyAuthResponse(authResponse) {
// 1. 解析 DID 获取公钥
const didDoc = await resolveDid(authResponse.did)
const publicKey = extractPublicKey(didDoc, 'authentication')
// 2. 验证挑战时效性(防重放)
if (Date.now() - authResponse.timestamp > 300000) { // 5分钟过期
throw new Error('挑战已过期')
}
// 3. 验证签名
const message = `DID Auth Challenge: ${authResponse.challenge}\nTimestamp: ${authResponse.timestamp}`
const isValid = await ed.verify(
base64Decode(authResponse.signature),
new TextEncoder().encode(message),
publicKey
)
return { verified: isValid, did: authResponse.did }
}
四、进阶主题
4.1 零知识证明与选择性披露
传统的 VC 验证要求持有者披露完整凭证,这可能泄露敏感信息。零知识证明(ZKP)技术可以在不泄露原始数据的情况下证明声明的有效性:
// 使用 BBS+ 签名实现选择性披露
async function createSelectivePresentation(fullVC, disclosedFields) {
// 只暴露指定字段,其他字段保持隐藏
const derivedProof = await deriveProof({
presentation: fullVC,
disclosedAttributes: disclosedFields,
// 例如只披露 "年龄 > 18",而不暴露具体出生日期
predicateProofs: [
{
attribute: 'birthDate',
predicate: 'age >= 18',
// 零知识证明验证此谓词为真
}
]
})
return derivedProof
}
// 示例:用户只证明"已成年"而不暴露出生日期
const presentation = await createSelectivePresentation(idVC, [
{ attribute: 'isAdult', revealed: true }, // "年龄 >= 18"
{ attribute: 'birthDate', revealed: false } // 隐藏具体日期
])
4.2 吊销机制设计
- 累积器方案(Accumulator):签发者维护一个非成员累积器,验证时检查凭证哈希是否在累积器中
- 链上吊销合约:在智能合约中维护吊销列表,优点是去中心化,缺点是 Gas 成本
- 短期凭证 + 刷新机制:设置短有效期,要求持有者定期刷新,过期未刷新则视为吊销
- 状态列表 2021(Status List 2021):W3C 推荐的基于位图的吊销列表方案
4.3 跨链 DID 互操作
在多链时代,单一 DID 方法无法满足所有场景需求。DID 互操作通常通过以下方式实现:
- DID 别名(DID Alias):一个 DID 在多个链上注册为别名,指向同一个 DID 文档
- 跨链解析桥(Cross-Chain Bridge):如 ION(Bitcoin)和 ethr(Ethereum)之间的解析桥
- 通用解析器(Universal Resolver):支持解析所有已注册 DID 方法的统一接口
五、生产部署考量
5.1 密钥管理
密钥管理是 DID 系统安全的核心,推荐的分层方案:
层级 0: 根密钥(Master Key)
├── 存储于硬件安全模块(HSM)或安全飞地
├── 仅用于派生其他密钥,不直接签名
│
层级 1: 身份密钥(Identity Key)
├── 用于 DID 文档中的 authentication
├── 可存储在硬件钱包或本地安全存储
│
层级 2: 操作密钥(Operational Keys)
├── assertionMethod: 签发 VC
├── capabilityInvocation: 能力调用
└── keyAgreement: 加密通信
5.2 性能优化
- DID 文档缓存:使用 CDN 缓存静态 DID 文档,TTL 根据 DID 方法的可变性设定
- 批量验证:使用 BLS 签名聚合技术实现 VC 的批量验证
- 轻量级客户端:对于移动端场景,使用轻客户端协议而非完整解析
- 边缘计算:将 DID 解析和 VC 验证下沉到 CDN 边缘节点
5.3 合规与隐私
去中心化身份系统在部署时需要考虑以下合规要求:
- GDPR:"被遗忘权"与区块链不可篡改性之间的冲突,通过链上仅存储哈希、链下存储原始数据来解决
- eIDAS 2.0:欧盟电子身份框架对 DID 的信任服务级别要求
- CCPA:加州消费者隐私法案对可验证凭证中个人信息的保护要求
六、未来展望
去中心化身份技术正在快速演进,以下几个方向值得关注:
- DIDComm v2:DID 之间的安全通信协议,支持端到端加密的消息传递,将成为 Web3 的消息层标准
- 可验证数据注册表(VDR):在去中心化存储网络上构建的可验证数据注册表,支持更复杂的数据治理场景
- AI Agent 身份:随着 AI Agent 的兴起,DID 将成为 Agent 身份认证和信任评估的基础设施
- 生物特征绑定:将 DID 与生物特征(虹膜、指纹)结合,实现"人-身份-密钥"的强绑定
- 国际标准统一:ITU-T、ISO 等国际标准化组织正在推动 DID 的全球统一标准
去中心化身份不是对现有身份系统的简单替代,而是对"信任"这一数字世界基础设施的重新构建。从 W3C 的标准化进程到以太坊生态的工程实践,DID 正在从概念走向生产。掌握这一技术栈,将是构建下一代互联网应用的关键能力。

发表评论 取消回复