零知识加密架构(Zero-Knowledge Encryption)
服务端在不掌握用户主密码、密钥与明文的前提下存储同步数据的加密架构,以 Bitwarden 主密码→主密钥→保险库密钥的流程为例。
#type / concept
#status / growing
#tech / security / crypto
#resource / bitwarden
零知识加密架构(Zero-Knowledge Encryption)
[!info] related notes 密钥派生函数(KDF) 对称密码学 密码管理器 Bitwarden [[vaultwarden|Vaultwarden]]
一句话定义
零知识加密架构指:服务端只保存密文,在整个生命周期中都不掌握用户的主密码、加密密钥或明文,因此即便服务端被攻破或作恶,也无法读出用户数据。加解密只发生在用户的客户端。
问题背景
密码管理器必须在多设备间同步高度敏感的数据,就不得不经过服务器。如果服务器能解密这些数据,那么它就是一个巨大的单点风险:一次数据库泄露、一名恶意管理员、一次法律强制交出密钥,都会让所有用户的保险库暴露。零知识架构的目标是把「信任服务器」降到最低——服务器只当一个「加密快递柜」。
核心机制(以 Bitwarden 为例)
主密码 (Master Password)
│ KDF(PBKDF2 / Argon2id,加盐、慢速)
▼
主密钥 (Master Key)
├─► 再经一次 KDF ──► 主密码哈希 ──► 发给服务端做认证
│ (服务端再哈希一次后存储,永不见主密码本身)
│
└─► 拉伸/解密 ──► 保险库对称密钥 (Symmetric/Vault Key, AES-256)
│
▼
逐条加密每个保险库条目(密文才上传服务端)
要点:
- 认证与加密分离:发给服务端用于登录的是「主密码哈希」,与真正解密用的密钥是两条不同的派生路径。服务端拿到认证哈希也解不了密。
- 保险库密钥被主密钥包裹:真正加密数据的是随机生成的对称密钥(AES-256),它以密文形式存储、由主密钥解锁。这样改主密码只需重新包裹保险库密钥,无需重加密全部数据。
- 服务端零知识:主密码、主密钥、保险库密钥、条目明文——服务端一个都不掌握,只存密文与认证哈希的哈希。
边界与常见误解
- 主密码不可恢复:服务端没有你的密钥,也就无从「找回密码」。忘记主密码通常等于永久失去保险库,只能靠事先设置的恢复手段。
- 区别于传输加密与静态加密:TLS 只保护「传输中」,服务端存储层加密(server-side at-rest)中服务端仍握有密钥。只有端到端的零知识才让服务端「看不见」。
- 元数据未必加密:条目正文加密,但账号邮箱、图标域名、条目数量等元数据可能可见,仍有信息泄露面。
- 信任转移到客户端:安全前提变成「客户端实现可信且未被篡改」。恶意或被植入的客户端可以在加密前窃取明文。
- 强度上限仍是主密码:整套体系的根在主密码熵和 KDF 参数,弱主密码会让零知识形同虚设。