1. 项目概述:自管理身份中的选择性披露技术
在数字世界里,证明“你是谁”或“你拥有什么”正变得越来越复杂。想象一下,你走进一家酒吧,酒保需要确认你已成年。在物理世界,你出示驾照,酒保瞥一眼出生日期即可。但在数字场景中,如果你出示一个数字驾照凭证,传统的验证方式可能会迫使你暴露全部信息——姓名、地址、驾照号码——而不仅仅是你的年龄。这种“全有或全无”的信息披露方式,与隐私保护的基本原则“数据最小化”背道而驰。
这就是自管理身份范式要解决的核心问题之一。SSI 赋予个人对其数字凭证的完全控制权,就像把驾照、护照、学历证书都放进一个只有你自己能打开的加密数字钱包。而选择性披露,则是这个钱包里最精巧的一把锁。它允许你从一份由权威机构(如大学、车管所)签发的、包含多个声明的完整凭证中,仅向验证方揭示必要的部分,同时其他信息保持加密或隐藏状态,且整个凭证的签名依然有效。
听起来很美好,但实现起来技术路径众多。是应该把每个属性单独做成一个微型凭证?还是用哈希把信息“锁”起来,只给验证方看特定信息的“钥匙”?或是用加密技术?亦或是借助区块链中常见的默克尔树数据结构?还是使用前沿的、能生成零知识证明的 BBS 签名?每种方法在性能、凭证大小、计算开销和易用性上各有千秋。对于要在资源受限的移动设备上运行钱包的用户,或需要高频、快速验证的海量服务场景,选择哪种技术方案,直接决定了系统的可用性和用户体验。
本文源于一篇系统的学术研究,但我们将抛开复杂的公式和算法描述,从一个实践者的角度,深入剖析基于原子凭证、哈希、加密、哈希树和 BBS 签名这五种主流选择性披露方法。我将结合自己的理解和行业经验,为你拆解它们背后的核心思想、实现细节,并重点分享一项全面的性能基准测试结果。无论你是正在设计身份系统的架构师,还是对隐私增强技术感兴趣的开发者,这篇文章都将为你提供一份清晰的“技术选型地图”。
2. 核心思路与方案选型背后的逻辑
在深入细节之前,我们首先要理解为什么会有这么多种方法,以及它们各自的设计哲学是什么。选择性披露不是一个单一的技术点,而是一系列在隐私、性能、凭证复杂度和实现成本之间寻求平衡的工程方案。
2.1 设计目标与核心挑战
任何选择性披露方案都必须满足几个基本要求:
- 完整性:验证方必须能确信被披露的声明确实来自原始签发者,且未被篡改。
- 隐私性:未披露的声明信息必须对验证方保密。
- 最小化:验证方只能获取其请求的、且持有者同意披露的那部分信息。
- 高效性:整个流程(签发、选择性披露、验证)的开销应在可接受范围内,尤其是在移动设备上。
核心挑战在于,传统的数字签名(如 ECDSA)是对整个文档(凭证)的哈希值进行签名。如果你隐藏了文档的任何部分,哈希值就会改变,导致签名失效。因此,所有选择性披露方案都在探索如何在签名固定后,还能安全地“隐藏”部分内容。
2.2 五种技术路径的定性分析
下表概括了五种方法的核心思路与关键权衡:
| 方法 | 核心思想 | 签发者负担 | 持有者负担 | 验证者负担 | 凭证大小 | 关键优势 | 主要劣势 |
|---|---|---|---|---|---|---|---|
| 原子凭证 | 每个声明单独签发一个凭证。 | 高(N个签名) | 低(仅选择) | 中(验证N个签名) | 大(与声明数线性相关) | 概念简单,易于实现和理解。 | 凭证数量爆炸,管理复杂,验证开销大。 |
| 哈希 | 签发包含声明哈希值的凭证;持有者提供明文和盐值供验证。 | 中(计算N个HMAC) | 低(复制盐值与明文) | 低(计算N个HMAC) | 大(存储所有哈希值) | 实现相对简单,密码学组件成熟。 | 凭证体积随声明数增长,哈希值暴露了声明数量。 |
| 加密 | 签发包含加密声明的凭证;持有者提供密钥供解密。 | 中(N次加密) | 低(复制密钥) | 低(N次解密) | 中(密文略大于明文) | 安全性基于加密强度,密文不揭示信息。 | 密钥管理负担,需安全通道传输密钥。 |
| 哈希树 | 将声明构建为默克尔树,凭证只存储树根哈希;持有者提供路径证明。 | 中高(构建树,生成证明) | 中(提供证明) | 中(验证证明) | 极小(仅树根) | 凭证大小恒定,非常紧凑。 | 展示证明体积大,计算和验证证明有对数级开销。 |
| BBS签名 | 使用支持零知识证明的签名,一次性签署所有声明;持有者生成选择性披露证明。 | 高(BBS签名计算) | 高(生成零知识证明) | 高(验证零知识证明) | 小(恒定大小的签名) | 凭证小,提供最强的隐私属性(如不可链接性)。 | 计算最密集,依赖较新的、复杂的密码学。 |
提示:选择方案时,首先要问“谁是瓶颈?”如果持有者是智能手机用户,那么BBS签名的高证明生成开销可能成为问题。如果网络带宽或存储成本是主要关切,那么哈希树恒定的凭证大小就极具吸引力。
2.3 为什么选择这些方法进行比较?
这五种方法覆盖了从最直观到最前沿的技术光谱:
- 原子凭证代表了“分而治之”的朴素思想,是性能对比的基线,也揭示了多签名管理的天然缺陷。
- 哈希与加密是应用密码学的经典组合,它们将选择性披露转化为“承诺-揭示”范式,在现有系统中易于集成。
- 哈希树借鉴了区块链的数据完整性验证思想,在空间效率上做到了极致,是“以计算换空间”的典型。
- BBS签名代表了基于高级密码学原语(零知识证明)的下一代方案,它提供了最优雅的数学保证和最丰富的隐私特性,但代价是计算复杂性。
本次实验比较的价值,就在于用量化的数据(时间、空间)来印证或挑战我们上述的定性分析,为实战选型提供硬核依据。
3. 方法深度解析与实操要点
让我们暂时放下宏观对比,深入到每一种方法的内部,看看它们具体是如何运作的。我会用“大学学位证书”这个例子贯穿始终:假设凭证包含姓名、学号、专业、入学日期、毕业日期、GPA六个声明。现在你向招聘公司申请,只需要证明你的专业和毕业日期。
3.1 原子凭证法:简单粗暴的“碎片化”
核心流程:
- 签发:大学不是签发一份包含6个声明的凭证,而是签发6份独立的微凭证,每份只包含一个声明(如
{"专业": "计算机科学"})并单独签名。 - 持有:你的钱包里收到6个独立的、已签名的JSON Web Token文件。
- 披露:你创建一个新的展示,只放入
专业和毕业日期对应的那两个JWT文件,然后对这个“展示包”进行签名。 - 验证:招聘公司验证你的展示签名,然后分别验证
专业.jwt和毕业日期.jwt这两个文件的签名。
实操要点与坑:
- 捆绑攻击:这是原子凭证法最大的安全隐患。攻击者可能将来自不同人(或不同时间)的
专业凭证和毕业日期凭证组合在一起,伪造一份有效的展示。解决方案是必须在每个微凭证的元数据中,加入一个强大的、不可预测的“凭证集标识符”,并在验证时检查所有被展示的凭证是否拥有相同的标识符。 - 管理噩梦:想象一下你的钱包里有几十个服务商签发的上百个属性,每个属性都是一个单独的文件。备份、同步、查找都会变得异常繁琐。这不是一个可扩展的方案。
- 签名开销:签发和验证的签名操作次数与声明数量成正比(O(n))。在我们的例子中,签发需要6次签名,验证需要3次(2个凭证+1个展示)。
3.2 哈希法:基于“承诺”的揭示
核心流程:
- 签发:大学为每个声明生成一个随机盐值,计算
HMAC(盐值, 声明值),得到哈希值。凭证中包含所有6个声明的哈希值,并被签名。同时,大学将6个声明的明文和对应的盐值通过安全通道单独发给你。 - 持有:你持有签名的哈希凭证,以及明文字典
{专业: [“计算机科学”, salt1], 毕业日期: [“2023-06-01”, salt2], ...}。 - 披露:你创建展示,包含完整的哈希凭证,并在展示的元数据中附上你想披露的声明的明文和盐值(如
专业和毕业日期的明文与盐)。 - 验证:招聘公司验证凭证签名后,对你提供的明文和盐,重新计算HMAC,并检查结果是否与凭证中对应声明的哈希值匹配。
实操要点与坑:
- 盐值的重要性:绝对不要直接哈希明文!否则,对于
性别:“男”这类低熵值声明,攻击者可以轻易通过彩虹表猜出原文。盐值确保了哈希的随机性。 - 哈希函数的选择:实验测试了SHA3-256和SHA3-512。更长的输出(512位)更安全,但会使凭证更大。对于大多数场景,256位已足够。
- 凭证膨胀:凭证大小随声明数线性增长,因为要存储所有哈希值。虽然哈希是固定长度,但比起短文本(如“男”),存储开销依然显著。
- 密钥(盐值)管理:盐值必须保密并安全传输给持有者。如果盐值泄露,对应声明的隐私性就丧失了。在实际系统中,这部分通常通过持有者与签发者之间建立的安全通道(如使用持有者的公钥加密)来完成。
3.3 加密法:可解密的“黑盒”
核心流程: 与哈希法高度相似,但将哈希替换为对称加密。
- 签发:大学为每个声明生成一个随机密钥和初始向量,用AES等算法加密声明值。凭证中包含所有6个声明的密文,并被签名。密钥和IV通过安全通道发送给持有者。
- 持有:你持有签名的密文凭证,以及解密用的密钥字典。
- 披露:你创建展示,包含完整的密文凭证,并在元数据中附上你想披露的声明对应的解密密钥和IV。
- 验证:验证签名后,招聘公司使用你提供的密钥和IV,解密凭证中对应的密文,得到明文。
实操要点与坑:
- 加密模式选择:需要使用带认证的加密模式(如AES-GCM),或至少是确保完整性的模式(如AES-CBC with HMAC)。实验中使用的是AES,但实际部署必须考虑模式选择。
- 性能考量:对于短明文,加密/解密的计算开销通常低于HMAC(因为HMAC要哈希两次)。但随着明文变长,加密开销会增长,而哈希开销基本不变。实验发现,当声明值长度超过约60字符时,哈希法在生成凭证的速度上开始反超加密法。
- 密文长度:密文长度略大于明文(由于填充和可能的认证标签)。对于非常短的声明,这可能导致加密法凭证比哈希法凭证更小(因为哈希输出是固定的256/512位)。
- 同样的密钥管理问题:安全分发和存储解密密钥是关键。
3.4 哈希树法:极致的空间压缩
核心流程:
- 签发:大学将6个声明(加盐哈希后)作为叶子节点,构建一棵默克尔树或默克尔帕特里夏树。对树根哈希进行签名,作为凭证。同时,为每个声明计算一个“成员证明”(从该叶节点到树根的路径上的兄弟节点哈希值),并将声明明文、盐值和证明发送给持有者。
- 持有:你持有仅包含树根哈希的微小凭证,以及一个包含所有声明明文和对应证明的附件。
- 披露:你创建展示,包含树根凭证,并在元数据中附上想披露的声明(
专业,毕业日期)的明文、盐值和对应的成员证明。 - 验证:招聘公司验证树根签名后,使用你提供的明文和盐值重新计算叶节点哈希,然后利用你提供的成员证明,一步步计算到树根,看是否与凭证中的树根哈希匹配。
实操要点与坑:
- 树结构的选择:
- 默克尔树:简单,叶子节点是声明的哈希。证明大小约为
O(log n)。 - 默克尔帕特里夏树:以太坊使用的数据结构,叶子节点通过键(声明名)组织。对于需要按名查找的场景更高效,但实现更复杂,证明通常也略大。
- 默克尔树:简单,叶子节点是声明的哈希。证明大小约为
- 证明压缩是必须的:这是哈希树法最大的痛点。即使只披露两个声明,你也需要附带两个
O(log n)大小的证明。实验中对证明进行Brotli压缩后,展示大小减少了50%以上,但代价是增加了一定的压缩/解压缩时间。在带宽敏感的场景,压缩至关重要。 - 计算开销:构建树和生成证明是
O(n)和O(n log n)的操作。对于声明数超过64的凭证,其创建时间开始显著高于哈希法和加密法。 - 凭证极小化的优势:无论凭证包含1个还是1000个声明,签名后的凭证大小几乎不变(只有一个树根哈希)。这在链上存储或传输成本极高的场景下是巨大优势。
3.5 BBS签名法:密码学的“魔法”
核心流程:
- 签发:大学使用BBS签名方案,用其私钥对所有6个声明进行一次签名,生成一个固定大小的签名。凭证中包含这个签名和对应的公钥,并被签名。
- 持有:你持有这个包含BBS签名的凭证,以及所有声明的明文。
- 披露:当需要披露
专业和毕业日期时,你的钱包不直接发送明文,而是利用BBS签名的特性,生成一个“零知识证明”。这个证明能向验证方证实:“我拥有一个由大学私钥签署的、包含专业=计算机科学和毕业日期=2023-06-01的凭证签名”,而无需透露其他声明信息,也无需透露完整的原始签名。 - 验证:招聘公司使用大学的BBS公钥,验证你提供的零知识证明的有效性。
实操要点与坑:
- 这不是“选择性披露”,而是“选择性证明”:这是最关键的理念升级。持有者从未发送过原始声明明文,甚至不发送加密或哈希值。发送的是一个密码学证明。这提供了更强的隐私属性,比如不可链接性:验证方无法判断两次出示的不同证明是否来自同一份原始凭证。
- 极高的计算开销:生成和验证零知识证明是计算密集型操作,比其他方法慢一到两个数量级。实验中使用BLS12-381曲线,为1024个声明生成证明需要数秒时间。这决定了它目前不太适合移动设备或高频验证场景。
- 凭证小巧:和哈希树法一样,凭证大小恒定,不随声明数增长。
- 标准化与库的成熟度:BBS签名仍在标准化过程中,可用的生产级密码学库相对较少,集成复杂度高。
4. 实验评估:数据驱动的性能洞察
理论分析固然重要,但实际性能如何?我们基于一个统一的框架(使用JWT格式、以太坊DID、Node.js实现),在标准硬件上对五种方法进行了全面的基准测试。以下是我从实验数据中提炼出的核心结论和实战建议。
4.1 测试配置与核心指标
- 变量:
- 声明数量 N:从 2 到 1024(2的幂次)。
- 披露比例:100%, 75%, 50%, 25%。
- 密码学配置:不同密钥长度(AES-128/192/256)、哈希函数(SHA3-256/512)、树类型(MT/MPT)。
- 指标:
- 创建时间:签发凭证和生成展示所需的时间(毫秒)。
- 验证时间:验证凭证和展示所需的时间(毫秒)。
- 文档大小:凭证和展示的字节数。
4.2 可验证凭证的性能表现
创建时间:
- BBS签名法最慢:因为它需要对所有声明进行复杂的多消息签名运算。
- 原子凭证法次之:需要对每个声明进行独立的签名操作,开销线性增长。
- 哈希树法(MPT)和哈希法紧随其后,加密法最快。对于小规模声明(<64),加密法和哈希树法(MT)速度接近。
凭证大小:
- 哈希树法和BBS法具有恒定大小:这是它们的王牌优势。哈希树法凭证仅存储树根(~1200字节),BBS法存储签名和公钥(~5644字节)。
- 原子凭证法最大:每个声明带一个签名,体积膨胀严重。
- 哈希法由于存储所有固定长度的哈希值,体积也较大。
- 加密法的凭证大小与原始声明总长度大致成正比,对于短文本声明,它比哈希法更节省空间。
验证时间:
- 原子凭证法验证最慢(线性于声明数),因为要验证多个签名。
- 其他方法的验证时间主要花在验证一个凭证签名上,与声明数关系不大。
心得:如果您的场景中,凭证由资源丰富的服务器签发,且签发频率低(如学位证书一年签发一次),那么签发开销不是首要考虑因素。此时,哈希树法和BBS法因其极小的凭证体积,在存储和传输上优势巨大,尤其适合上链存证。
4.3 可验证展示的性能表现(披露100%声明)
这是最消耗资源的场景,代表了性能上限。
创建时间:
- BBS法依然最慢,证明生成是瓶颈。
- 哈希树法第二慢,因为要为每个披露的声明收集和打包成员证明。
- 原子、哈希、加密法速度处于同一梯队,且明显快于前两者。它们的主要操作是复制数据和签名。
展示大小:
- 哈希树法(未压缩)的展示巨大:因为它包含了所有披露声明的
O(k log n)大小的证明。这是该方法最严重的缺点。 - 原子、哈希法的展示也很大,因为它们包含了所有声明的完整信息(哈希或完整凭证)。
- 加密法和BBS法在声明数较多时,展示大小相对有优势。BBS法的证明大小增长较缓。
验证时间:
- BBS法验证最慢。
- 哈希树法次之,验证证明需要多次哈希计算。
- 原子、哈希、加密法验证最快,且速度接近。
4.4 披露比例的影响与压缩优化
- 披露比例的影响:对于原子、哈希、加密法,展示的创建时间、大小和验证时间几乎与披露的声明数
k成正比。减少披露比例能线性提升性能。对于哈希树法和BBS法,创建和验证时间也与k正相关,但关系并非完全线性(BBS证明生成有固定开销,哈希树证明收集也有开销)。 - 哈希树证明压缩:实验证明,对哈希树法的成员证明进行Brotli压缩,能将展示大小减少50%以上,且验证时间几乎不变(因为验证时解压开销远小于密码学验证)。这是一个非常重要的优化手段。强烈建议在任何使用哈希树法的生产系统中启用证明压缩。
4.5 综合性能对比表格
下表总结了在典型场景(声明数适中,如16-64个)下的定性性能排名:
| 方法 | 凭证创建开销 | 凭证大小 | 展示创建开销 (低k) | 展示大小 (低k) | 验证开销 | 适合场景 |
|---|---|---|---|---|---|---|
| 原子凭证 | 高 | 差 | 优 | 中/差 | 中 | 声明数极少(<5),且系统极度简单的原型 |
| 哈希 | 中 | 中 | 优 | 中 | 优 | 通用场景,追求实现简单和验证速度快 |
| 加密 | 优 | 优(短文本) | 优 | 优(短文本) | 优 | 通用场景,尤其关注凭证体积且声明值较短 |
| 哈希树 | 中 | 极优 | 中 | 差 (需压缩) | 中 | 凭证存储/传输成本极高,或声明数极多 |
| BBS签名 | 差 | 优 | 差 | 优(低k) | 差 | 对隐私要求极高(需不可链接性),且可接受高计算延迟 |
注意:“低k”指披露的声明数较少。当k很大时,BBS法的展示大小优势会减弱,而哈希树法(即使压缩后)的展示体积劣势会非常突出。
5. 选型指南与实战建议
经过以上分析,我们可以得出一些清晰的选型逻辑。没有“最好”的方法,只有“最适合”的场景。
5.1 根据角色和约束选择
面向持有者(通常是移动设备):
- 首要考虑:展示创建速度和电量消耗。BBS签名法因其高昂的证明生成开销,目前不适合移动端主导生成的场景。哈希法和加密法是更安全的选择,它们展示创建极快。
- 次要考虑:存储。如果钱包需要存储大量凭证,哈希树法和BBS法的极小化凭证有巨大优势。
面向签发者(通常是服务器):
- 首要考虑:签发开销和凭证管理。如果签发频率高,加密法和哈希法的较低签发开销更有利。如果需要将凭证锚定在区块链上(存储成本高),哈希树法的恒定大小凭证是首选。
- 原子凭证法会给签发者带来巨大的签名和管理负担,应避免。
面向验证者(服务提供方):
- 首要考虑:验证速度和吞吐量。哈希法和加密法的验证速度最快,适合高并发验证场景(如门票查验)。
- BBS签名法的验证虽然慢,但提供了不可链接性,适合对隐私极度敏感、验证频率不高的场景(如匿名投票资格证明)。
5.2 根据应用场景选择
物联网设备/资源受限环境:
- 挑战:设备计算能力弱、存储小、电量有限。
- 推荐:加密法或哈希法。它们计算轻量,实现库成熟。避免BBS和复杂的哈希树(除非证明被预处理并存储在云端)。
学历、资质等长期凭证:
- 挑战:凭证可能包含大量声明(课程成绩、活动记录),但每次只披露少数(如学位名称、毕业时间)。凭证可能上链存储。
- 推荐:哈希树法(启用压缩)。凭证上链成本低,展示时虽然证明略大,但披露声明少,整体可接受。BBS法也可考虑,但需评估验证方能否接受其性能。
年龄验证、会员资格等高频简单验证:
- 挑战:需要极快的验证速度,用户体验至关重要。
- 推荐:哈希法或加密法。验证几乎是瞬间完成的。
匿名凭证或高级隐私保护:
- 挑战:需要防止不同验证场合之间的身份关联。
- 唯一选择:BBS签名法(或其他支持零知识证明的签名方案)。这是目前提供不可链接性等高级隐私特性的主要技术路径。
5.3 实施注意事项与常见陷阱
- 密钥与盐值管理:对于哈希法和加密法,如何将盐值或密钥安全地传递给持有者是一大挑战。必须使用持有者的公钥进行加密传输,并确保在钱包中安全存储。
- 声明编码与标准化:声明值必须进行规范化编码(如日期用ISO8601,字符串用UTF-8),否则哈希或加密结果会因编码不同而不匹配,导致验证失败。建议使用JSON-LD等技术定义数据类型。
- 密码学算法敏捷性:系统设计应支持密码学套件的升级。例如,今天使用SHA3-256,未来量子计算威胁出现后,应能平滑切换到抗量子哈希函数。避免将算法硬编码在凭证结构中。
- 撤销机制的兼容性:选择性披露方案需要与凭证撤销机制协同工作。原子凭证法会导致撤销列表暴增。其他方法中,撤销通常作用于整个凭证,与选择性披露无关。
- 库的成熟度与审计:BBS签名等前沿方案,务必选择经过密码学审计的库(如
mattrglobal/bbs-signatures)。哈希和加密法可依赖操作系统或语言标准库(如OpenSSL, Node.js crypto),更为稳健。
6. 未来展望与个人思考
这次深入的实验比较揭示了一个清晰的现状:哈希法和加密法在性能、复杂度和成熟度上取得了最佳的平衡,是当前大多数SSI项目起步的务实选择。哈希树法在空间效率上独树一帜,为特定场景提供了优化方向。BBS签名法则代表了未来的隐私高度,但需要等待硬件性能的提升和库的进一步优化。
从我个人的工程经验来看,选择性披露技术的落地,下一步的焦点可能不在密码学本身,而在协议层和用户体验层。
首先,亟需标准化和互操作性。目前W3C可验证凭证数据模型定义了抽象框架,但具体到选择性披露的实现(如SD-JWT for hash-based approach),需要更细致的标准来确保不同厂商的钱包和验证器能够无缝协作。IETF正在推进的SD-JWT草案是一个好的开始。
其次,是声明披露的智能协商。现在的模型是验证方索要,持有者提供。未来是否可以更智能?钱包能否根据用户的隐私偏好和历史披露记录,自动与验证方协商出一个最小的、足够的声明集?甚至运用博弈论,在满足服务要求的同时最大化隐私保护。
最后,是签发方策略的引入。目前选择性披露的主动权完全在持有者。但有些凭证可能包含敏感信息,签发方希望限制其可被验证的上下文。例如,一份心理评估报告可能只允许被特定的医疗机构验证。如何将签发方的策略(如“此声明仅可用于医疗目的”)与选择性披露机制结合,是一个值得探索的方向。
技术总是在权衡中前进。通过这次对五种选择性披露方法的拆解和对比,我希望你能更清晰地看到每一条技术路径上的风景与沟壑。最酷的技术不一定是最合适的,最适合场景的技术才是好技术。在构建你的下一个隐私优先的身份系统时,不妨回到文中的性能数据表和选型指南,它或许能帮你做出更明智的第一次选择。