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

四、钱包存储和账号同步是两个问题
凭证应绑定设备安全存储和用户授权。是否允许跨设备同步,要根据凭证敏感度和颁发方政策决定,不能因为“多端方便”就默认同步全部 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 凭证与登录会话职责分离;
- 密钥轮换、换机和丢失有恢复流程;
- 原始凭证内容不进入普通业务日志。

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



所有评论(0)