匿名凭证:图解入门(第二部分)
摘要
图解入门系列的第二部分,介绍 Privacy Pass 和 Google 年龄验证提案等真实世界的匿名凭证系统,重点讲解如何防止凭证克隆,并在不牺牲用户隐私的前提下实现富有表现力的证明。
暂无内容
查看缓存全文
缓存时间: 2026/04/22 19:07
# 匿名凭证:图解入门(第二部分)
来源:https://blog.cryptographyengineering.com/2026/04/17/anonymous-credentials-an-illustrated-primer-part-2/
*这是关于匿名凭证系列文章的第二篇,第一篇见此。(https://blog.cryptographyengineering.com/2026/03/02/anonymous-credentials-an-illustrated-primer/)*
上一篇我们介绍了“匿名凭证”——一种让用户在*不*牺牲隐私的前提下向网站完成身份验证的技术。
快速回顾:匿名凭证系统包含几方:一个发放凭证的**Issuer**、一个或多个**Resource**(例如网站,有时与 Issuer 是同一实体),以及众多**User**。User 先以非匿名方式向 Issuer 证明自己的身份,获得凭证。之后每次访问 Resource 时,User 可以“出示”该凭证。真正的匿名性体现在“出示”环节:正确实现时,任何一方(Resource、Issuer 或二者合谋)都无法把这次“出示”与当初发给该 User 的凭证关联起来。
我们还提到匿名凭证系统最好具备的两项实用功能:
1. **限制单张凭证的使用次数**,防止*凭证克隆攻击*——黑客(或恶意用户)偷走凭证后复制出大量“机器人”账户。由于凭证天生不可追溯,一张被盗凭证可被无限克隆而难以发现。上一篇也给出过几种缓解思路。
2. **让凭证更“表达”**。例如驾照这种(非匿名)凭证能声明年龄、准驾车型、所在州等信息。*表达力强*的匿名凭证允许 User 在不泄露额外信息的前提下,对数据做各种证明。
上一篇偏理论,今天这篇——既然是“密码学*工程*”博客——就要落地:具体介绍两个现实世界已在运行的凭证系统。第一个是**Privacy Pass**(https://privacypass.github.io/),被 Cloudflare、Apple 等公司广泛采用;第二个是 Google 正在标准化的匿名年龄验证新提案。
---
### Privacy Pass
Privacy Pass 是全球部署最广泛的匿名凭证标准。
以不同名字出现的 Privacy Pass 遍布互联网,主要由大型科技公司使用。最出名的当属 **Cloudflare**(https://developers.cloudflare.com/waf/tools/privacy-pass/),其研究员参与制定了标准(https://petsymposium.org/popets/2018/popets-2018-0026.php),用来跳过验证码等反滥用流程。同样协议还被 Apple 称作“Private Access Tokens”(https://developer.apple.com/news/?id=huqjyh7k)、Google 称作“Private State Tokens”(https://privacysandbox.google.com/protections/private-state-tokens)、Brave 浏览器及其他项目采用。Privacy Pass 无处不在,连自称“不 care 隐私”的微软 Edge 也在用。
作为首个大规模落地的凭证方案,Privacy Pass 简单到极致:只提供单比特信息的“一次性手环”凭证——“我有一张凭证”。所用技术基本能在 1980 年代的论文里找到,再加一点性能优化。真正的创新是“居然真的部署了”。
Privacy Pass 已形成 IETF 系列 RFC:9576(https://datatracker.ietf.org/doc/rfc9576/)、9577(https://datatracker.ietf.org/doc/rfc9577/)、9578(https://datatracker.ietf.org/doc/rfc9578/)。标准里有很多部署选项,但核心协议就是 Chaum 最初“盲签名”凭证的完美实现,我们在上一篇也介绍过。快速复习流程:
1. User 想拿一次性凭证时,先选 token 类型(**tokentype**)和可选元数据 **MD**。
2. User 生成一个长的随机*序列号***SN**,希望全球唯一。
3. User 与 Issuer 运行盲签名协议(https://blog.cryptographyengineering.com/a-note-on-blind-signature-schemes/),对消息 (**tokentype**, **SN**, **MD**) 签名。User 得到签名 **sig**,Issuer 对消息与签名一无所知。
四元组 (**tokentype, MD, SN, sig**) 就是凭证。向 Resource“出示”时:
1. User 发送 (**tokentype, MD, SN, sig**)。
2. Resource 检查 **tokentype** 是否合法,并决定是否接受该 **MD**。
3. Resource 用 Issuer 公钥验签 **sig**,并查重 **SN**;全部通过则把 **SN** 记入数据库。
用图表示就是这样:
[](https://blog.cryptographyengineering.com/wp-content/uploads/2026/03/image-9.png)
你可能会问:*这个元数据 **MD** 到底干嘛用?*
**MD** 可以把凭证绑定到特定应用,例如某个网站。如果我打算在 2026 年 3 月 31 日访问纽约时报,我可以把 **MD** 设为 "`nyt.com || 2026-03-31`"。出示时,网站可验证该字段并决定是否放行。
关键:Issuer 看不到 **MD**,完全由 User 选定且事后无法更改。这样网站就能要求凭证仅限本站、或仅限某时段使用。
**MD** 的主要用途是实现“会话级凭证”——User 不是提前拿凭证,而是访问网站时才实时申请:
1. User 访问 Resource,Resource 下发一个会话“挑战”(随机串)。
2. User 立即向 Issuer 申请凭证,把 **MD** 设为该挑战。
3. User 出示凭证,Resource 验证挑战是否匹配。
用图表示:
[](https://blog.cryptographyengineering.com/wp-content/uploads/2026/03/image-10.png)
好处:每张凭证只能用于已发起的这次会话,不能囤着下周再用,方便 Cloudflare 这类站点实时控流。
缺点也有:
- Issuer 必须 7×24 在线,一旦宕机,用户拿不到新凭证就全站瘫痪。(预签发模式下用户可提前囤凭证。)
- 实时签发可能遭受*时序关联攻击*:Resource 与 Issuer 比对消息时间戳,或可把会话与签发请求对应到同一用户。
对于 Issuer 与 Resource 同一家公司的情况(例如 **Cloudflare 的部署**(https://blog.cloudflare.com/privacy-pass-standard/)),后者尤其敏感。好在 Cloudflare 每秒处理几十万笔请求,海量流量让关联攻击极难落地。(我用 Claude Code 做了个粗糙分析,结果见这里(https://blog.cryptographyengineering.com/some-notes-on-traffic-timing-correlations-for-cloudflares-implementation-of-privacy-pass/),结论不一。)
---
### 用什么签名方案?“token type” 又是啥?
讲完协议框架,还剩一个基本问题:盲签名怎么实现?
Privacy Pass 定义了两种标准“签发协议”(https://www.rfc-editor.org/rfc/rfc9578),密码学略有不同。
第一种是**公开可验证 token**,就是上一篇提到的 Chaumian 凭证:Issuer 用**盲 RSA 签名**(https://blog.cryptographyengineering.com/a-note-on-blind-signature-schemes/),几乎照搬 Chaum 1980 年代原始协议(https://www.hit.bme.hu/~buttyan/courses/BMEVIHI5316/Chaum.BlindSigForPayment.1982.PDF)。好处是 Resource 用 Issuer 公钥就能验签,双方无需共享密钥。
RSA 盲签名的缺点是体积大、运算贵:公钥至少 2048 位才能达到 112 比特对称安全级,签名也大,签名计算成本高。
自然想到换椭圆曲线(EC)原语,例如 Schnorr 签名(https://en.wikipedia.org/wiki/Schnorr_signature) 或(呃)ECDSA。可现实是:
1. 早年“盲 Schnorr” 在并发签发场景下极不安全,攻击者同时跑多轮协议就能在普通硬件上伪造签名(https://eprint.iacr.org/2020/945)。
2. 要安全就得禁止并行签发。
3. 最新论文试图修复,但协议速度反而比盲 RSA 慢(https://eprint.iacr.org/2022/1676)。
因此,Privacy Pass **完全不支持**椭圆曲线盲签名。
如果对性能极度敏感,Privacy Pass 提供第二种**私有可验证 token**:基于**不经意 MAC**(oblivious MAC),内部是**不经意伪随机函数**(oblivious PRF)。优点是用 EC 原语,生成与验证极快;缺点是 Resource 必须持有 Issuer 私钥才能验签。
---
### 结语
Privacy Pass 是你能想到的最“无聊”的匿名凭证协议:简单的一次性“手环”凭证,优化到极致速度。核心技术 1980 年代就定型,如今标准化后飞快、好用。真正有趣的是部署规模:Apple、Google、Cloudflare……几十亿用户每天都在用,却浑然不觉。
同时,它也很“无聊”:除了“拿 token→用 token”外几乎没有别的高级功能。若要靠它做年龄验证,就得每次上网都先跟 Issuer 打一次招呼。
下一篇,我们将讨论一个更强的新提案——Google 的**零知识凭证**(https://blog.google/innovation-and-ai/technology/safety-security/opening-up-zero-knowledge-proof-technology-to-promote-privacy-in-age-assurance/),号称能解决这些痛点。
相似文章
推出高级账户安全功能
OpenAI 推出了'高级账户安全'功能,这是面向 ChatGPT 和 Codex 的一项可选设置,可强制使用防钓鱼登录方式、限制账户恢复选项、缩短会话时长,并自动将对话排除在模型训练之外。
推出Trusted Access for Cyber
OpenAI推出Trusted Access for Cyber,这是一个基于身份和信任的框架,试点开放GPT-5.3-Codex的访问权限,用于防御性网络安全工作,同时承诺提供1000万美元的API积分,以加速网络防御能力并降低滥用风险。
从 Supabase 到 Clerk 再到 Better Auth
Val Town 分享了其从 Supabase 迁移到 Clerk 最终迁移至 Better Auth 的身份验证基础设施经历。文章重点指出了 Clerk 在速率限制和架构方面的技术挑战,并反对将复杂应用的用户管理交给第三方服务。
@ycombinator: Clawvisor (@clawvisor) 让您为AI代理授权访问Gmail和Slack等应用,无需交出您的凭证…
Clawvisor 是一个面向AI代理的新型授权层,能够安全访问Gmail和Slack等应用,无需暴露凭证或允许恶意操作,解决了代理部署中的关键安全问题。
如何使用 OpenAI 的 Privacy Filter 构建可扩展的 Web 应用
本文演示如何利用 OpenAI 的 Privacy Filter 模型和 Gradio Server 构建用于 PII(个人可识别信息)检测的可扩展 Web 应用,并展示了文档探索、图像匿名化等三个具体应用示例。