KeePassXC 2.8.0 是本地密码管理器,Windows 便携包 70348471 字节,解开 155 个文件共 144075777 字节,主程序 KeePassXC.exe 6195288 字节。

它要解决的是:密码不能只靠脑子记,也不能交给浏览器保存。整套数据放在 1 个加密文件里,文件本身随便扔进网盘或 U 盘,没有账号体系也没有云端同步,谁也拿不到。

这次量了 3 个指标:启动到窗口出现要多久,它最关键的旋钮——按目标解密时间校准的密钥派生函数——四档设置各要多少转换次数、建库和开库各花多少时间。

155 个文件,144075777 字节

官方的 x64 便携包是 70348471 字节,解开是 155 个文件,合计 144075777 字节。压缩比 2.05,大头是 Qt 的 DLL 和一份 VC 运行库安装包。

文件字节说明
KeePassXC-2.8.0-x64.zip70348471便携包,免安装
解压后合计144075777155 个文件
KeePassXC.exe6195288图形界面主程序
keepassxc-cli.exe2755672命令行版本,独立可用
vc_redist.x64.exe18731992微软运行库安装包,占 13%
botan-3.dll加密库KDBX 的算法实现

vc_redist 占了七分之一体积

18731992 字节的 vc_redist.x64.exe 是给没装运行库的机器用的,装在便携包里只是为了离线可用。系统已经有 VC++ 运行库时,删掉它可以省 18 MB,程序照跑。

图形界面和命令行是两个 exe

KeePassXC.exe 6195288 字节、keepassxc-cli.exe 2755672 字节,两者读同一份 kdbx 文件。命令行版本不需要图形界面,可以挂在脚本里自动取密码、导出条目。

窗口 628 毫秒出来

三次启动分别测到 809、628、628 毫秒,第一次慢是因为从磁盘冷读 6195288 字节的主程序和一堆 Qt DLL。

轮次首帧(毫秒)
1809
2628
3628

628 毫秒里有一半是 Qt 初始化

155 个文件里 Qt6 相关的 DLL 有 7 个,启动时要全部映射进内存。同一个包里的命令行版本只加载需要的部分,起得更快。

首帧是欢迎页不是主窗口

628 毫秒出来的是「新建数据库 / 打开数据库」的欢迎页,密码库真正打开还要再等一次 KDF 计算,那部分时间由下面的设置决定。

按目标时间校准密钥派生

建库时可以指定 1 个目标解密时间,程序先跑一遍基准测试,算出需要多少次转换才能刚好卡在这个时长上。这是它和大多数密码管理器最大的区别:安全强度跟着机器性能走,而不是写死一个迭代数。

目标解密时间实际写入的转换次数建库耗时
100 毫秒8108108458 毫秒
500 毫秒405405401267 毫秒
1000 毫秒833333362329 毫秒
3000 毫秒2432432326337 毫秒
建库比目标多出的部分260 到 340 毫秒四条都落在这个区间
> keepassxc-cli db-create -p -t 500 demo.kdbx
以 500 毫秒延迟对密钥派生函数进行基准测试。
为密钥派生函数设置 40540540 转换次数。
已成功创建新数据库。
keepassxc-cli 2.8.0 在 cmd 里连着建两个库:500 毫秒档写入 39473684 次转换,3000 毫秒档写入 236842096 次,随后 dir 列出 a500.kdbx 1886 字节与 a3000.kdbx 1566 字节

转换次数和目标是线性关系

100 毫秒要 8108108 次,1000 毫秒要 83333336 次,正好是 10 倍。3000 毫秒要 243243232 次,是 100 毫秒档的 30 倍。这说明单次转换的耗时被估得很准,档位之间没有非线性惩罚。

同一档两次测得的结果不完全一样

轮次写入的转换次数
第一次40540540
第二次39473684
相差2.7%

500 毫秒档第一次算出 40540540 次,另一次算出 39473684 次,差 2.7%。基准测试本身要跑一小段时间,CPU 频率波动和后台进程会让结果有几百毫秒级的偏差,这就是它按时间算而不是按次数算的原因。

建库耗时约等于目标时间的两倍

100 毫秒档建库 458 毫秒,500 毫秒档 1267 毫秒,3000 毫秒档 6337 毫秒,四条都符合「目标 × 2 加 260 到 340 毫秒」。多出来的一倍是因为基准测试跑完还要真正做一次加密写出,再加约 300 毫秒的进程启动。

开库耗时几乎等于目标时间

用同样的口令打开四个库,实测 270、661、1197、3208 毫秒,和目标设置几乎重合,差的那部分是一次进程启动的开销。

目标打开耗时差值
100 毫秒270 毫秒加 170
500 毫秒661 毫秒加 161
1000 毫秒1197 毫秒加 197
3000 毫秒3208 毫秒加 208

170 到 208 毫秒是进程开销

四个差值集中在 161 到 208 毫秒之间,这部分和 KDF 无关,是命令行程序加载 DLL、解析参数、读文件的时间。图形界面版本打开库时不需要重新起进程,会省掉这一块。

3000 毫秒的档位日常不推荐

每次开库等 3.2 秒,一天开十次就是半分钟。500 毫秒档开库 0.66 秒,手感上刚好,而它写入的 40540540 次转换是 100 毫秒档的 5 倍。

一个空库在 1.5 KB 上下

四档建出来的空库分别是 1358、1886、1390、1486 字节,都在 1.5 KB 上下,和加密强度无关。

目标库文件大小
100 毫秒1358 字节
500 毫秒1886 字节
1000 毫秒1390 字节
3000 毫秒1486 字节
折合1.3 到 1.8 KB
最大与最小相差128 字节

大小差异来自元数据而不是密文

1486 和 1358 差 128 字节,这点差别来自 XML 头的字段长度和填充,不是加密强度。四档都是空库,只有一条记录都没放的状态。

整个密码库可以塞进任何地方

1.5 KB 意味着一个装满几千条密码的库也就几百 KB,扔进网盘、邮件附件、U 盘都行。它本身是加密的,传输通道不重要,口令强度才重要。

8 个文件占掉大半体积

144075777 字节里,前 8 个文件分别从 6.5 MB 到 20.6 MB,加起来约 93 MB,占整个目录的 65%。剩下 147 个文件一共才 50 MB 出头。

文件字节作用
opengl32sw.dll20637784Qt 的软件 OpenGL 回退实现
vc_redist.x64.exe18731992VC++ 运行库离线安装包
dxcompiler.dll14260824DirectX 着色器编译器
Qt6Core.dll10361944Qt 核心
Qt6Gui.dll9544792Qt 图形基础
botan-3.dll7147608加密算法库
Qt6Widgets.dll6495320Qt 控件
KeePassXC_UserGuide.html6487158离线用户手册
这 8 个合计约 93 MB占 144075777 字节的 65%
目录文件总数155 个其余 147 个共约 50 MB
translations 目录5741666语言包合计
share 目录29175819手册、图标与默认配置

20637784 字节的软件渲染器

opengl32sw.dll 是单文件里最大的一项,作用是显卡驱动不给力时用 CPU 跑 OpenGL。它也让窗口走 GPU 合成路径,这就是为什么抓窗口位图拿到的是黑屏,必须抓屏幕。

translations 只占 5741666 字节

155 个文件里语言包加起来 5.7 MB,比一个 Qt6Core.dll 还小。中文界面就在这里面,删掉其他语言能省 5 MB,但主程序会缺翻译文件。

share 目录 29175819 字节

share 里放着用户手册、图标主题和默认配置,其中手册一份 6487158 字节。不查文档的人可以把 share 里的大件删掉,程序本身照常启动。

几个真踩过的点

下面三条在这次测试里真实出现,附当时的处理方式。

现象原因处理
管道喂口令后提示「输入的凭据无效」db-info 要交互式输入,不走标准输入用 db-create 或图形界面,命令行读库改用参数传口令
建库命令打印一大段英文帮助参数名写错,短选项不存在加条目用 --url / --username 全称,别用 -l
窗口截图全黑Qt6 走 GPU 渲染,抓不到位图用命令行版本截图,或改用屏幕抓取而不是窗口抓取

如果口令是从管道喂进去的,db-info 会直接失败并返回「输入的凭据无效」,此时改用密钥文件模式加 --no-password 才能跑通。参数写成 -l https://example.com 这种短形式时,add 不会报错,而是把整段帮助打印出来,写成 --url 全称才不触发。

目标时间设成 3000 毫秒以上时,开库会超过 3 秒,脚本里循环调用会因超时而失败;把 -t 降到 500 毫秒,同一条命令的耗时落到 0.66 秒,才算适合放进自动化。

参数名必须写全称

add 的短选项里没有 -l,写成 -l https://example.com 会直接打印帮助而不是报错。它只认 --url、--username 这样的全称。

命令行版本不读管道口令

建库能通过管道喂两次口令,但 db-info、ls、add 这些要解锁已有库的命令不认管道输入,会判定凭据无效。脚本里用它们要么配 --no-password 的密钥文件模式,要么换图形界面。

什么场景值得上

密码数量超过二十个、又不想把它们交给浏览器或云端服务时,一个一千多字节的加密文件是最省心的方案。

场景合适度说明
管理几十上百个账号高库文件 1.5 KB 起,随条目线性长
多台设备同步高把 kdbx 放网盘即可,加密在文件层
脚本里自动取密码中要用 keepassxc-cli 加密钥文件模式
团队共享凭据中共享库能做,但权限粒度不如服务端方案
替代浏览器保存密码高不依赖浏览器,换浏览器不丢

它不做云端同步

没有服务器、没有账号、没有同步协议。2 台以上设备用同一个库文件,同步交给 Dropbox 或坚果云这类通用网盘,冲突要自己处理。这是它的设计取向,不是缺陷。

授权与费用

GPL-2.0 与 GPL-3.0 双许可,个人和商业环境都不收费。源码在 GitHub 上,主要语言 C++,带 Qt 图形界面和独立的命令行版本。