KDBX:比它的客户端活得更久的密码文件格式

一个 .kdbx 文件由什么构成:明文文件头、覆盖文件头的 HMAC,以及其余全部加密的部分。
一个 .kdbx 文件由什么构成:明文文件头、覆盖文件头的 HMAC,以及其余全部加密的部分。 来源: 依据 KDBX 4.1 规范为本文绘制

大多数人挑密码管理器的方式和挑别的 App 一样:比功能,然后选一个产品。有一个角落里这个直觉是错的,而那正是密码库只握在你自己手里的那个角落。在那里你要先选一种文件格式,选完之后,客户端就变成可以随便换的了。

KDBX 是什么

KDBX 是 KeePass 写出来的加密数据库文件,也是另外十几个互不相干的程序都能读写的那种文件。一个文件装下你的条目、分组、附件、历史和元数据;整个文件用主密码、密钥文件、或者两者共同派生出的密钥加密。扩展名是 .kdbx,而这个格式是公开定义的,不是别人逆向出来的。

最后这一点,才让本文剩下的部分成立。正因为规范公开,KeePassXCKeePassDXKeeWebStrongbox 这些才不是仿制品或导入工具——它们是同一种文件的各自独立的实现。

为什么格式比客户端活得久

托管型密码服务本质上是你和一家公司的关系:它可以涨价、改条款、被收购、关停,而你的数据能跑多快,取决于它那个导出按钮。KDBX 文件没有这些属性,因为既没有服务器也没有账号。文件就在你的磁盘上,任何符合规范的程序都能打开它。

这不是空谈。KeeWeb 自 2021 年起就没再发过稳定版,MacPass 最后一个正式版停在 2022 年,而这两件事没有让它们的用户损失任何东西——第二天早上换个 App 打开同一个文件就是了。这就是这一类方案的全部论据,也正是那篇把各类密码管理器排开来比的文章所依据的那条轴。

文件里究竟装了什么

KDBX 4.1 规范值得翻一遍,哪怕你永远不会去实现它,因为它讲清楚了你的主密码到底在保护什么。一个 .kdbx 是一小段明文文件头,后面跟着加密的主体,再由一个带密钥的哈希把两者绑在一起。

  • 一种密码算法加密主体。 KDBX 4.1 定义了两种:CBC 模式、PKCS#7 填充的 AES-256,以及 RFC 8439 所规定的 ChaCha20。
  • 一个密钥派生函数把你的密码变成那把密钥。 规范定义了三种——AES-KDF、Argon2d 和 Argon2id——而 Argon2 这一族存在的意义,就是让暴力破解不只费时间还费内存,这正是它钝化 GPU 攻击的原理。
  • 一段 HMAC-SHA-256 保护文件头。 文件头必须在你拿到密钥之前就可读,所以它没法加密;带密钥的哈希才是让人无法悄悄改动它的东西,这也是 KDBX 4 相对 KDBX 3 最主要的结构性改进。

你会遇到的那几个版本号

你在现实中会见到三个版本号,而通常你只需要从中读出一件事:哪些客户端打得开你的文件。越新,密码学上越好,和老古董的兼容性越差。

  • KDBX 3.1 —— 旧的默认值。基本上什么都还读得动,用的仍是 AES-KDF;只有当你必须用 2017 年之前的东西打开它时才选它。
  • KDBX 4.0 —— 随 2017 年 1 月的 KeePass 2.35 到来,带来了 Argon2、ChaCha20 和带认证的文件头。现在多数密码库都在这个版本上。
  • KDBX 4.1 —— 需要 KeePass 2.48 或更高版本,也是当前规范所描述的版本。在 KDF 列表里加入了 Argon2id,另有若干细节改进。

实用建议很短。新建密码库就用 KDBX 4,KDF 保持 Argon2,只有当某个特定的老客户端逼着你时才退回 3.1。

真正重要的那几个设置

文件里有三个选择是真正起作用的,而每个 KDBX 客户端都会在数据库设置的某处把它们露出来。默认值是合理的,所以这更像一份清单而不是一个项目。

  • KDF 及其参数。 用 Argon2,内存开销设到你最慢的那台设备还扛得住为止——通常卡住你的是那台要解锁同一个库的手机,而不是笔记本。
  • 要不要用密钥文件。 密钥文件把密码库变成「你知道的」加上「你拥有的」,同时也把「那个 U 盘丢了」变成彻底的损失;除非你真的验证过备份方案,否则别用。
  • 文件放在哪里。 这个格式保护的是内容,不是副本数量,所以同步是另一个独立的决定——不想让任何云碰它就用 Syncthing,不介意的话随便哪个网盘都行,因为它们拿到的都只是密文。

评价

对于「我想要一个任何公司都拿不走的密码库」这个诉求,KDBX 是唯一称得上主流的答案,而它凭的是自己是一份规范而不是一个产品。代价是实在的,而且与密码学无关:同步归你,备份归你,忘记主密码时也没有任何找回流程。如果这笔交易听起来像负担而不像解脱,那么托管型服务确实才是更好的答案。

这些情况值得用: 你希望十年后这个密码库还打得开,哪怕用的是今天还不存在的软件。这些情况可以跳过: 你想要账号找回、无痛的多设备同步,以及出问题时有人可以发邮件。

从哪儿开始。 桌面用 KeePassXC、手机用 KeePassDXStrongbox,这是默认组合。KeeWeb 则是当你需要在一台什么都装不了的机器上打开同一个库时再加进来的那个。而如果你觉得这笔交易根本不对,那篇完整的密码管理器比较覆盖了另外四类替你保管文件的方案。


格式规范:https://keepass.info/help/kb/kdbx.html KDBX 4 背景:https://keepass.info/help/kb/kdbx_4.html

暂无评论