零知识证明
本文约需 2 分钟阅读
零知识证明 (Zero-Knowledge Proof, ZKP) 是一种在完全不透露某项信息本身的前提下,证明自己知晓该信息的密码技术。 1985 年由 Shafi Goldwasser 、 Silvio Micali 、 Charles Rackoff 三人确立了其理论基础。作为既能进行不发送密码的认证、又能在不公开交易内容的情况下验证其正当性,从而兼顾隐私与安全的创新技术,它位于加密技术的最前沿。
理解概念 - 阿里巴巴的洞穴
零知识证明的概念可以通过「阿里巴巴的洞穴」这个比喻直观地理解。环形洞穴的深处有一扇魔法门,只有知道暗语的人才能通过。证明者 (Peggy) 想向验证者 (Victor) 证明自己知道暗语,但又不想透露暗语本身。
在这个过程中,Victor 获得了「Peggy 知道暗语」的确信,却完全无法得知暗语本身。这正是零知识证明的本质。
zk-SNARK 与 zk-STARK
| 特性 | zk-SNARK | zk-STARK |
|---|---|---|
| 可信设置 | 需要 | 不需要 |
| 证明大小 | 较小 (数百字节) | 较大 (数十 KB) |
| 验证速度 | 快速 | 稍慢 |
| 抗量子性 | 无 (依赖椭圆曲线) | 有 (依赖哈希函数) |
zk-SNARK (Succinct Non-interactive Argument of Knowledge) 证明大小较小、验证快速,但初始设置需要信任。 zk-STARK (Scalable Transparent Argument of Knowledge) 无需设置且具备抗量子性,但证明大小会变大。根据用途加以区分使用十分重要。
在密码认证中的应用
在传统的密码认证中,用户将密码发送给服务器,由服务器端进行比对。这种方式存在密码在通信路径或服务器端泄露的风险。应用零知识证明后,可以在不发送密码本身的情况下,仅证明自己「知道正确的密码」。 SRP (Secure Remote Password) 协议正是基于这一思路,被 1Password 等密码管理器所采用。加密基础一文中,对相关密码技术的整体面貌进行了讲解。
零知识加密服务
标榜「零知识」的云服务,意味着其设计使得服务提供者自身也无法解密用户的数据。 Proton Mail 为邮件提供端到端加密,即便是 Proton 公司的服务器也无法读取邮件内容。 Tresorit 在文件存储方面采用了类似的设计。在这些服务中,使用由主密码派生出的密钥在客户端进行加密,服务器上仅保存密文。也请参考隐私与便利的平衡一文。
不公开也能证明的范围
不交出原值也能证明的,只是被预先改写成既定形式的主张。想要证明的内容必须被改组成答案确定的问题形式,而在决定改组方式的那一刻,可回答问题的范围也就被固定了。日后若想追加别的问题,就要把机制本身重新做一遍。因此在设计中最先被确定的并不是方式的选择,而是「让哪些问题成为可回答的」这份清单。其次,每一次都不公开原值这一性质,并不会自动继承到答案累积之后的整体上。当针对同一对象给出不同问题的答案时,这些答案的组合会不断收窄原值可能取值的范围。此处被收窄的并不是证明的确定性,而是本应未被公开的那个值的候选集合。因此在运行中需要决定的事项,除了回答哪些问题之外,还包括针对同一对象可以重复给出答案的次数,以及答案的历史留在谁的手中。而且,能够证明的是关于值的事实,至于该值属于谁则由另外的机制承担。即便可以确切地证明持有满足条件的值,该值是否正确地与出示方相关联,仍取决于核实值来源的那一部分。整体的确定性会按这两者中较弱的一方来决定,因此仅把证明机制做强,只要关联部分仍然松弛,整体就不会改变。
常见误解
存在「零知识 = 数据不存在」的误解,但数据确实是存在的。零知识的含义是「验证者在证明过程中不会获得新的知识」。此外,即便是零知识加密服务,也存在一旦忘记主密码就无法恢复数据这一取舍。在理解便利性与安全性之间平衡的基础上再决定是否采用,这一点很重要。抗量子密码与密码安全一文中,也对量子时代的密码技术进行了讲解。
这篇文章对您有帮助吗?