核心概念 / 入门 / 8 分钟

去中心化标识符(DID)

跨系统通用的密码学身份——无需中央权威机构

DID 要解决的问题

传统标识符都依赖某个中央权威机构:

  • email@company.com —— 由公司控制;如果你离职,就会失去它
  • @username —— 由平台控制;如果账号被封,它就没了
  • API key abc123 —— 由服务提供商签发,也可以被吊销

当 AI 智能体需要跨组织边界运作时,谁来签发它们的身份? 如果 A 银行的智能体要与 B 银行的系统对话,B 银行不会信任由 A 银行控制的标识符——反之亦然。

**去中心化标识符(DID)**解决了这个问题:一种密钥由持有者本人掌控、而非由中央权威机构掌控的密码学标识符。


什么是 DID?

DID 是一个全局唯一的标识符,形式如下:

did:webvh:example.com:agent-42

拆解开来:

  • did: —— 表明这是一个 DID
  • webvh —— DID 方法(决定其解析方式)
  • example.com:agent-42 —— 特定于该方法的标识符

关键属性:

  1. 自我拥有 —— 你自己生成 DID 并持有私钥
  2. 可验证 —— 任何人都能通过密码学方式验证你确实控制它
  3. 可解析 —— DID 可解析为一个包含公钥和服务端点的 DID 文档
  4. 持久性 —— 只要你持有密钥,无论使用哪个服务,它都能正常工作

DID 的工作原理

1. 创建 DID

// 生成密钥对
const keyPair = await generateKeyPair('Ed25519')

// 创建 DID(方法: webvh)
const did = `did:webvh:yourcompany.com:agent-${uuid()}`

// DID 文档(存储在一个公开可知的位置)
const didDocument = {
  "@context": "https://www.w3.org/ns/did/v1",
  "id": did,
  "verificationMethod": [{
    "id": `${did}#key-1`,
    "type": "Ed25519VerificationKey2020",
    "controller": did,
    "publicKeyMultibase": keyPair.publicKey
  }]
}

2. 解析 DID

任何人都可以解析 DID,获取其对应的 DID 文档:

// 解析器获取 DID 文档
const didDoc = await resolve('did:webvh:yourcompany.com:agent-42')

// 返回公钥、服务端点等信息
console.log(didDoc.verificationMethod[0].publicKeyMultibase)

3. 证明控制权

要证明你控制某个 DID,需要用你的私钥对一个挑战值(challenge)进行签名:

// 验证者发送挑战值
const challenge = 'prove-you-control-this-DID'

// 你用私钥对其签名
const signature = await sign(challenge, privateKey)

// 验证者根据你 DID 中的公钥校验签名
const isValid = await verify(signature, challenge, didDoc.verificationMethod[0].publicKeyMultibase)
// → true

DID 方法:did:webvh

DID 方法有很多种(web、key、ion、ethr 等)。Affinidi 主要使用 did:webvh(Web 可验证历史):

为什么选择 did:webvh

  • 基于 Web —— 通过 HTTPS 解析,无需区块链
  • 可验证历史 —— 在防篡改日志中追踪密钥轮换
  • 可回溯——你可以解析出 DID 在历史任意时间点的状态
  • 安全的密钥轮换 —— 若密钥泄露,可轮换为新密钥而不会丢失该 DID

工作原理:

  1. DID 文档存储在 https://yourcompany.com/.well-known/did.json
  2. 每次更新都会创建一条新的、带版本控制的记录
  3. 哈希链确保历史记录不可被篡改重写
  4. 即使密钥轮换后,旧签名依然可验证

示例:

did:webvh:affinidi.com:agent-gateway
→ 解析为 https://affinidi.com/.well-known/did.json
→ 返回包含当前公钥 + 版本历史的 DID 文档

DID 与传统标识符对比

维度传统方式(例如 API 密钥)去中心化标识符(DID)
所有权由服务提供商控制由你控制(私钥)
可移植性绑定单一服务可在任何支持 DID 的系统中使用
吊销提供商可随时吊销只有你能吊销(或轮换密钥)
验证需要提供商确认任何人都可通过密码学方式验证
跨组织信任需要联合/SSO原生支持——无需共享基础设施

真实应用场景

1. AI 智能体身份

问题: 智能体共享服务账户,日志只会显示”账户执行了操作”,而不是”哪个智能体执行了操作”。

解决方案: 每个智能体获得一个 DID。每次操作都用该智能体的私钥签名 → 审计追踪能显示是哪个智能体执行的。

const agent = {
  did: 'did:webvh:company.com:agent-42',
  privateKey: '...'
}

// 智能体为每个请求签名
const request = { action: 'access-PHI', patient: '12345' }
const signature = await sign(request, agent.privateKey)

// 日志记录: 智能体 Agent-42(DID + 签名)访问了 PHI

2. 跨组织智能体信任

问题: A 银行的智能体与 B 银行的系统对话——B 银行如何信任它?

解决方案: 智能体携带 DID + 签名过的 Mandate。B 银行验证 DID 签名并检查授权情况。

// A 银行的智能体
const agentDID = 'did:webvh:bankA.com:trading-agent-5'

// Mandate(由 A 银行签名)
const mandate = {
  agent: agentDID,
  authorizedBy: 'did:webvh:bankA.com:trader-alice',
  permissions: ['execute-trades'],
  expiry: '2026-12-31'
}

// B 银行验证:
// 1. 智能体的 DID 签名是否有效
// 2. A 银行对 Mandate 的签名是否有效
// 3. 智能体是否仍获授权 (检查信任注册表)

3. 按智能体归因

问题: 事件响应——“是哪个智能体修改了生产环境?”

解决方案: 每个智能体都有一个 DID,每次变更都记录 DID + 签名。

// 审计日志条目
{
  timestamp: '2026-07-21T19:15:00Z',
  action: 'modify-config',
  actor: 'did:webvh:company.com:agent-99',
  signature: '...',
  authorizer: 'did:webvh:company.com:engineer-bob'
}

// 即时归因——无需侦探式排查

Affinidi 技术栈中的 DID

Agent Gateway 为每个智能体签发 DID:

// 智能体入驻
const newAgent = await agentGateway.createAgent({
  name: 'Trading Agent 5',
  authorizedBy: 'trader-alice@bankA.com'
})

// 返回:
{
  did: 'did:webvh:bankA.com:agent-5',
  keyPair: { public, private },
  didDocument: { ... }
}

信任注册表 存储与 DID 关联的授权策略:

// 查询: 该 DID 是否获得授权?
const isAuthorized = await trustRegistry.query({
  agent: 'did:webvh:bankA.com:agent-5',
  action: 'execute-trades',
  resource: 'AAPL'
})
// → { authorized: true, authorizedBy: 'did:webvh:bankA.com:trader-alice' }

Elements Services 向 DID 签发可验证凭证:

// 签发一份 Mandate 凭证
const mandate = await elements.issueCredential({
  holder: 'did:webvh:bankA.com:agent-5',
  type: 'TradingMandate',
  claims: {
    authorizedBy: 'trader-alice',
    permissions: ['execute-trades'],
    expiry: '2026-12-31'
  }
})

快速上手

面向开发者

创建一个 DID:

npm install @affinidi/affinidi-tdk
import { DID } from '@affinidi/affinidi-tdk'

const did = await DID.create({
  method: 'webvh',
  domain: 'yourcompany.com'
})

console.log(did.id) // did:webvh:yourcompany.com:...
console.log(did.keyPair) // { public, private }

解析一个 DID:

const didDoc = await DID.resolve('did:webvh:affinidi.com:agent-gateway')
console.log(didDoc.verificationMethod)

面向架构师

何时应使用 DID:

  • ✅ 智能体需要跨组织边界运作
  • ✅ 审计追踪需要以密码学方式证明身份
  • ✅ 避免共享凭据/服务账户
  • ✅ 需要在密钥轮换后依然存续的长期智能体身份

何时不应使用 DID:

  • ❌ 内部人类认证(使用 SSO/OIDC)
  • ❌ 短生命周期的临时进程
  • ❌ 密码学验证显得大材小用的系统

延伸阅读

W3C 规范:

Affinidi 文档:

相关深度解析:

相关解决方案:

Cookie Preferences

We use cookies to enhance your experience. You can manage your preferences below. For more information, read our Cookie Policy.

Strictly Necessary Always Active

These cookies are essential for core website functions such as security, session integrity, and cookie preference storage. They cannot be disabled.

  • _cf_bm: Distinguishes humans from bots (Cloudflare) · 30m
  • _cfuvid: Ensures secure browsing (Cloudflare) · Session
  • __hs_initial_opt_in: Prevents HubSpot's banner · 7 days
  • _gtm_debug: GTM debug mode (testing only) · Session
Analytics

These cookies help us understand how visitors interact with the site so we can improve content and performance. All data is aggregated and anonymous.

  • _ga, _gid, _gat: Google Analytics · Session – 2 years
  • __hstc, hubspotutk, __hssrc: HubSpot visitor tracking · 13 months
  • __hs_opt_out: HubSpot opt-out preference · 6 months
Marketing & Targeting

These cookies allow us and our partners to serve personalised ads and measure campaign performance.

  • _gcl_au, _gcl_dc: Google Ads conversion tracking · 90 days
  • IDE: Google Display Network personalisation · 1 year
  • _fbp: Meta / Facebook remarketing · 90 days
  • li_gc, _li_fat_id, bcookie: LinkedIn tracking · 1–24 months
  • guest_id, personalization_id: Twitter/X analytics · 2 years