HarmonyOS 7 新特性(三十四)|分布式数字身份:DID、VC 与选择性披露 封面

HarmonyOS 7 开放的分布式数字身份能力,把“出示身份证明”从上传整张证件,转向 DID、可验证凭证(VC)和可验证表达(VP)。用户可以在得到同意后按需出示必要属性,例如只证明“已满 18 岁”,而不是暴露姓名、证件号和完整生日。

这项能力看起来像登录方案,实际更接近一套凭证生命周期系统。本文从颁发、持有、出示、验证、撤销和隐私最小化六个阶段,讨论可落地的工程设计。

一、先分清 DID、VC 与 VP

DID 是去中心化身份标识;VC 是颁发方签名的数字凭证;VP 是持有者向验证方提交的表达,支持选择性披露。三者角色不同,不能把一段 DID 字符串当成“已经实名认证”。

type Did = string

interface VerifiableCredential<T> {
  id: string
  issuer: Did
  subject: Did
  type: string[]
  claims: T
  issuedAt: string
  expiresAt?: string
  proof: unknown
}

业务可信的是颁发方签名和验证策略,而不是字段名看起来像身份证。

二、四个角色和两条信任链

典型系统包含颁发方、持有者钱包、验证方和信任注册表。颁发方证明属性,钱包安全保存,验证方按场景请求,注册表帮助判断颁发方是否受信。

第一条信任链是“验证方是否信任颁发方”,第二条是“当前出示是否由合法持有者控制”。缺少后者,截获的 VP 可能被重放。

interface PresentationRequest {
  verifier: Did
  purpose: string
  requestedClaims: string[]
  nonce: string
  audience: string
  expiresAt: number
}

请求必须说明用途、最小属性、受众、随机数和有效期。

三、颁发阶段不要把原始资料塞进凭证

颁发方完成实名、学历或资格核验后,只把后续场景需要的声明写入 VC。例如年龄场景可以颁发 ageOver18: true,而不是完整出生日期。

interface AgeCredentialClaims {
  ageOver18: boolean
  regionCode?: string
  assuranceLevel: 'BASIC' | 'STRONG'
}

凭证 ID 使用随机值,不包含身份证号。颁发日志记录证据摘要和策略版本,原始材料按合规期限单独保存。

HarmonyOS 7 新特性(三十四)|分布式数字身份:DID、VC 与选择性披露 核心链路

四、钱包存储和账号同步是两个问题

凭证应绑定设备安全存储和用户授权。是否允许跨设备同步,要根据凭证敏感度和颁发方政策决定,不能因为“多端方便”就默认同步全部 VC。

type CredentialStoragePolicy = {
  hardwareBacked: boolean
  exportable: boolean
  syncMode: 'NONE' | 'ENCRYPTED_BACKUP' | 'REISSUE'
  userAuthRequired: boolean
}

高价值凭证更适合换机后重新颁发。备份密文的恢复密钥、撤销旧设备和用户找回流程必须提前设计。

五、选择性披露从产品需求开始

验证方应先定义“完成业务最低需要什么”,再生成请求。酒类购买只需年龄门槛,园区访客可能只需当天访问资格,优惠权益只需会员等级。

const request: PresentationRequest = {
  verifier: 'did:example:merchant-001',
  purpose: '购买受年龄限制商品',
  requestedClaims: ['ageOver18'],
  nonce: cryptoRandom(),
  audience: 'checkout.example.com',
  expiresAt: Date.now() + 120_000
}

钱包 UI 要清楚展示“谁在请求、为什么、将披露什么”,并允许用户取消。不要把多个无关目的捆绑为一次授权。

六、VP 必须防重放和跨场景复用

持有者生成 VP 时绑定验证方、随机数、受众和过期时间。验证方保存已消费随机数,过期或重复请求直接拒绝。

function validateEnvelope(vp: Presentation, req: PresentationRequest): boolean {
  if (vp.nonce !== req.nonce) return false
  if (vp.audience !== req.audience) return false
  if (Date.now() > req.expiresAt) return false
  if (nonceStore.has(req.nonce)) return false
  return true
}

验证完成后原子地消费随机数。二维码出示还要限制扫码距离、会话时长和截屏复用风险。

七、验证不只是验一个签名

完整验证包括格式、签名、颁发方信任、凭证有效期、状态/撤销、声明语义、持有者绑定和业务策略。

type VerificationResult = {
  valid: boolean
  checks: {
    signature: boolean
    issuerTrusted: boolean
    notExpired: boolean
    notRevoked: boolean
    holderBound: boolean
    policySatisfied: boolean
  }
  reasonCode?: string
}

不要只返回布尔值。稳定的检查结果有助于排障,但对终端用户仍应提供最小、可理解的提示。

八、撤销与状态查询保护隐私

资格撤销、证件挂失和颁发方密钥轮换都要求状态机制。验证方查询状态时,不应让状态服务轻易推断“某个具体用户正在某商户出示凭证”。

可以使用批量状态列表、短周期缓存和匿名化查询。离线场景需要定义最大可接受状态陈旧时间;高风险业务在无法获取最新状态时转人工或在线验证。

九、DID 不是登录会话

完成 VP 验证只说明用户持有某项凭证,不等于已经建立应用账号和长期会话。登录仍需要账号绑定、会话令牌、设备管理和退出机制。

interface IdentityBinding {
  accountId: string
  subjectDidHash: string
  credentialType: string
  boundAt: number
  reverifyAfter: number
}

使用哈希或受控映射关联账户,避免在业务数据库到处复制 DID 和凭证内容。

十、密钥轮换和灾难恢复

颁发方和持有者密钥都可能轮换。凭证格式要能识别密钥版本,验证方缓存信任材料时设置过期。设备丢失后,用户应能撤销旧持有者密钥并重新领取凭证。

恢复流程是身份系统的高风险入口,需要更强认证和通知。任何客服人工操作都必须双人审批、可追踪且有时效。

十一、验收矩阵

覆盖正常颁发、用户取消、最小披露、过期 VC、撤销 VC、未知颁发方、密钥轮换、错误受众、随机数重放、离线状态和换机恢复。隐私测试检查日志、崩溃文件、剪贴板和截图中是否泄露声明。

  • 每个场景都有最小请求属性表;
  • 钱包授权页明确请求方、目的和字段;
  • VP 绑定随机数、受众和短有效期;
  • 验证覆盖签名、信任、有效期、撤销和持有者;
  • 状态查询不会泄露不必要的出示轨迹;
  • DID 凭证与登录会话职责分离;
  • 密钥轮换、换机和丢失有恢复流程;
  • 原始凭证内容不进入普通业务日志。

HarmonyOS 7 新特性(三十四)|分布式数字身份:DID、VC 与选择性披露 验收清单

结语

分布式数字身份的最大价值不是把纸质证件“电子化”,而是让身份属性以可验证、可撤销、可最小披露的方式流动。把凭证生命周期和业务会话分开,用一次性请求、防重放和完整验证链守住边界,才能真正减少隐私暴露,而不是制造另一套集中式身份数据库。

官方参考

  • Online Authentication Kit 术语:https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/online-authentication-glossary
  • HarmonyOS 7 新能力一览:https://developer.huawei.com/consumer/cn/features/
  • Online Authentication Kit API 导航:https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/api/ts-basic-components-navigation
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐