零知识架构:服务端看不到密码

什么是零知识架构

零知识架构听起来像玄学,它的意思其实很朴素:服务端对你的密码一无所知。不是「承诺不看」,也不是「签了协议保证不看」,是「在数学上不可能看到」。

具体到 Bitwarden 协议,它通过两段式加密实现这一点。你的密码在客户端被扩展成两个密钥:主密钥用来加密你的密码库,认证哈希用来向服务端证明「我是我」。服务端收到的只是认证哈希和加密后的密码库,两者都是不可逆的单向运算结果。

参与方 拿到的东西 能否还原密码
你的客户端 主密码、全部加密数据 能,因为持有主密钥
自建服务端 认证哈希、加密后的密码库 不能,缺主密钥
监听流量的第三方 只有 HTTPS 加密流量 不能

结果就是:服务器硬盘被偷、数据库被拖库、管理员想看,得到的都只是一堆没有钥匙的密文。钥匙只在你脑子里,或者说只在你输入主密码的那个瞬间。这一点对自建者格外重要,因为它意味着你的服务器即使守得不够严,密码本身依然是安全的。

加密发生在哪一端

答案是在客户端,而且是逐条加密。你在浏览器插件里保存一条密码,插件先用主密钥把它加密成密文,才通过网络发给服务端。服务端收到什么就存什么,全程不解密、不看、不加工。

这带来一个对自建者特别重要的推论:你的服务器性能不影响加密强度。加密解密都跑在客户端的设备上,Vaultwarden 只负责搬运和存储密文。这正是它在树莓派级别的小机器上也能运转的原因。家里那台吃灰多年的旧主机,跑这个服务毫无压力。

两段式加密流程

再往细节说一点。每条密码在发送前都被单独加密,文件夹、收藏标记、备注这些元数据同样加密。服务端看到的密码库里,连哪条密码属于哪个文件夹都是密文。这种设计让你的数据模式也不至于泄露——攻击者连你有多少个银行账号都数不出来。

有一点值得强调:加密的强度不取决于服务器。有些新手会担心「我家那台旧机器加密性能太弱」,其实完全多虑了。加密解密发生在你的手机、你的浏览器、你的桌面上,服务端只做最轻的搬运工作。反过来也成立:换一台更强的服务器不会让你的密码更安全,安全上限由客户端的加密算法和你的主密码决定。

环节 执行者 对安全的影响
密钥派生 客户端 决定暴力破解难度
数据加密 客户端 决定密文安全上限
密文传输 客户端与服务端 HTTPS 保护传输过程
密文存储 服务端 只影响可用性

主密码为什么是单点

这是零知识架构的硬币背面。既然服务端在数学上无法看到你的密码,那么当你忘记主密码时,服务端也无论如何无法帮你恢复。没有任何后门、客服通道或管理员手段能绕过这一点,这是同一个数学事实的两面。

官方说法是「数据不可恢复」。这不是吓唬人的措辞,而是零知识架构的直接推论。所以围绕主密码的两条原则必须刻在脑子里:

第一,主密码本身要足够强。它是一次性押上全部数据的赌博,太简单等于把钥匙挂在门外。理想的主密码是一串你能记住、别人猜不到的长句子,而不是一个单词加几个数字。

第二,必须有离线备份。把密码库的加密导出文件放在安全的地方(加密 U 盘、离线硬盘、另一个信任的位置),这是主密码丢失时唯一的补救途径。注意导出文件本身也是加密的,没有主密码依然打不开,所以它不怕丢,只怕你没做。备份的具体做法在后面的备份章节展开。

关于主密码还有一些常见的误解值得澄清。有人问「能不能把主密码存在服务器的配置里应急」,答案是不能——任何服务工作正常时都不需要你的主密码,它自己就能跑,凡是需要主密码才能打开的东西都不该存在服务器上。也有人问「能不能让管理员帮我重置」,同样不能,因为重置就意味着服务端有能力读取,零知识就被破坏了。

主密码的另一个隐形要求是稳定:它不像普通密码,忘了可以改。你可以改主密码,但前提是你还记得旧的主密码。所以主密码一旦确定,就不要频繁更换,换一次就要把全部离线备份重新导出一遍,否则备份就过期了。

主密码是唯一钥匙

零知识 vs 传统云同步

对比一下传统的云端保存方案就更清楚差异在哪。很多浏览器和云服务的密码保存功能,本质是把密码交给服务器再加密保管,服务的运营方在技术上是有能力读取的。你的信任建立在公司的承诺、合同条款和它们的安全水平上。零知识架构则是先加密再上传,运营方在技术上就不可能读取。

对比项 传统云保存 零知识架构
加密位置 服务端 客户端
服务方能否读取 理论上可以 不能
忘记密码 可通过验证身份重置 数据不可恢复
信任成本 信任公司承诺与技术 只信任数学

注意最后一行。传统模式里你需要信任公司不作恶、不被入侵、不换条款;零知识模式里你甚至不需要信任自己——即使服务器被入侵、硬盘被搬走,密码依然安全。信任从「相信一个人会守约」变成「相信数学不可逆」,这件事的可靠性完全不在一个量级。

自然,你也失去了「找回密码」这个便利。零知识架构的所有缺点可以浓缩成一句话:它对用户和攻击者一视同仁。接受这一点,才算真正理解了自建密码管理器的交易条件。

有人会问一个问题:既然服务端看不到密码,那它凭什么还能工作?答案是它不需要看到。登录时客户端发送认证哈希证明身份,服务端比对哈希就知道是你,比对过程不需要任何一方接触明文密码。同步时客户端发送密文,服务端原样存取,同样不需要解密。整个过程像是在银行租了一个保险箱,银行验证你的身份,但不知道箱子里装了什么。这个类比几乎完美地解释了 Vaultwarden 的定位。

再回答一个高频疑问:既然加密这么厉害,HTTPS 是不是就不需要了?答案是依然需要,而且它是部署的硬要求。加密保护的是「数据在服务器上和传输中不被读懂」,HTTPS 保护的是「你的客户端确实在和你自己的服务器通信」,防止中间人冒充服务器截获流量。两者保护的是不同环节,缺一不可。这些在部署章节会从操作层面再讲一遍。

还有一个验证零知识架构是否名不副实的简单办法:等部署完成之后,亲自去查看服务器的数据文件。你会看到数据库里存的全是密文条目,没有任何一条密码以可读形式出现,连你自己也读不出来。这个亲手验证的过程比读十篇科普文都让人安心,也是自建独有的透明感——你既是运营方也是审计方,想知道一切都可以亲眼看。

顺带一提,正因为同步的都是密文,移动数据这件事变得毫无心理负担。换服务器、换机房、把数据目录复制到另一块硬盘,都不涉及敏感操作,因为搬动的是密文而不是密码。这一点在后面的备份与升级章节会反复体现,那些操作之所以可以放心大胆地做,根基都在这里。

为了让这一节更具体,我们可以把零知识架构下各方的视野列成一张表。你会发现最有意思的一行是服务端:它明明搬运着全部密码,却连一条都读不出来。

角色 能看到明文吗 能修改密码吗
拥有主密码的用户 能 能
自建服务端 不能 不能,只能搬密文
拿到数据库的黑客 不能 不能,只能尝试离线破解
拿到主密码的黑客 能 能

最后两行之间的鸿沟,就是零知识架构全部价值的所在。主密码是唯一的分水岭,保护好它,其余环节哪怕都不完美,密码依然是安全的。

对自建者的实际意义

零知识架构改变了自建这件事的风险结构,值得想清楚两点:

数据泄露的后果大幅降低。就算某天你的服务器被攻破、数据库文件被下载,只要主密码足够强,攻击者面对的还是一堆无法解开的密文。这是自建者最重要的安全底气,也是自建敢把服务暴露在公网上的前提。

可用性的责任完全在你。零知识不保护可用性,服务挂了就是挂了,没有任何官方团队能帮你恢复数据。所以本书后半部分会用两章谈备份、升级和宕机自救,这些才是自建运维的重头戏。安全和可用是两个独立的问题,零知识只解决了前者。

还有一个角度值得记住:零知识架构让你和家人成为利益共同体。全家人共用同一个自建服务,每个人的弱密码习惯都只影响自己那一份,因为主密码各自独立、数据各自加密。一个家人的账号被钓鱼,不会成为洞穿全家的缺口。这比「全家共享一个大密码本」的传统做法要安全得多。

如果你已经按《NAS DIY 指南》搭好主机,或正参考《OpenWrt 基础》规划内网,那么补上备份习惯之后,这套自建方案的安全性其实不输大多数商业服务。用一句话总结:零知识架构负责让密码偷不走,备份负责让密码丢不了,两件事各管一头,缺一不可。

延伸阅读