之前发现一些群友还没有用上密码管理器,且没有良好的密码管理方案,而我使用 KeePass 管理自己的密码已经有快两年之久。借此机会,分享一些自己的使用经验。

与 Bitwarden / Vaultwarden 对比

在迁移到 KeePass 之前,我也用过一段时间的自建 Bitwarden(使用 Vaultwarden 服务端实现)。

Bitwarden 功能全面,而且客户端支持也很齐全,桌面端、移动端、浏览器插件均有适配。而我放弃 Bitwarden 的原因正是它的客户端,每一个都有完整的功能,都是一个独立的 Session 。这意味着我在桌面端登陆后,想在浏览器中使用还需要在浏览器插件里登陆一次,多个浏览器就需要登陆多次,客户端之间相互独立,不共享 Session ,而不是像 KeePassXC ,只有桌面端有完整功能,浏览器插件负责与桌面端通讯。

我比较懒,并不想反复登陆,而且嫌弃它的桌面端基于 Electron 开发,且功能与浏览器插件相差不大,显得桌面端的存在非常鸡肋。而我之前没有选择 KeePass 的原因是没有解决网络同步的问题,而在我解决这个问题后,我也是第一时间就抛弃了 Bitwarden 。

上手 KeePassXC

需要注意的是,原版的 KeePass 是一款 Windows Only 的开源软件,不支持跨平台。所以桌面端更推荐使用另一款跨平台开源实现 KeePassXC

创建密码库的过程就不多介绍了,根据向导指示完成即可。主要讲两点。

  • 加密设置的强度不需要过高,普通用户设置为 1 秒就够了。

  • 数据库凭据除了设置一个强度足够的密码外,建议添加一个密钥文件。它可以是任意文件,不一定得是随机生成的文件,可以设置一个自己存取比较方便且保存较好不会丢失的文件。

个人不推荐添加质询响应。它使用硬件密钥的 OTP 功能,且每次写入数据库都需要访问硬件密钥。

对于移动端不是很友好,且其他客户端对这个功能的支持未必全面。

创建完数据库后就可以开始使用了。如果之前在使用其他密码管理器,也可以从其他管理器导出后在 KeePassXC 中导入。

同步 KeePassXC 数据库

KeePass 的密码库本质上是一个离线的文件型数据库,本身并不具备网络同步功能。

不过让客户端访问保存在网络上的数据库文件就可以实现比较灵车的网络同步功能,而且各客户端实现都对数据库同步提供了有限的功能支持,这样就能解决 KeePass 用户的同步需求。

那么,在哪里保存数据库和如何访问数据库就成了接下来的问题。

中文互联网上的教程使用坚果云的居多,大多使用原版 KeePass 直接访问 WebDAV URL ,少数使用坚果云的客户端同步。而这些方法都不适合跨平台使用。

有些朋友使用 Syncthing 来实现文件同步。我没有试过,不过应该可行。

后来我发现了 Rclone 这款成熟强大的开源云存储管理工具,它可以把云存储以文件系统的形式挂载到本地。Rclone 支持跨平台,Windows 和 MacOS 也可以用。

它支持大多数主流云存储和网盘(不包括国内的网盘),支持 WebDAV 的网盘、OneDrive 、Google Drive 、S3 对象存储都可以使用。

OneDrive 和 Google Drive 都有免费额度,有免费额度的 S3 存储也可以用,Blackbaze 的 B2 API 也可以用。这样,存储在哪就不是问题了。

对于白嫖 E5 订阅的用户,Rclone 调用 API 也可以计入保活,一举两得。

手动挂载 Rclone

安装完 Rclone 后,输入 rclone config 进入配置界面。

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q>

输入 n 新建 remote 并命名,然后就是选择要用的存储类型,接着按照提示一步步完成设置。

设置完成后,输入以下指令可以手动把网盘挂载为本地文件系统。

rclone mount remote_name:remote_path mount_path [options]

remote_name 为网盘的 remote 名称。

remote_path 为网盘的路径。如果需要访问远程的根目录,可以直接留空。

mount_path 为挂载到本地的路径。

和其他挂载行为一样,rclone mount 在 Linux 下需要提前创建好 mount_path 目录。

自动挂载 Rclone

自动挂载可以使用 systemd services ,而且 user services 就可以实现。

建议在 ExecStartPre 里添加 mkdir -p 的语句,在 ExecStop 的语句添加 umount,避免 Rclone 故障后服务重启失败。这里可以参考我的配置

Windows 端可以使用 NSSM 将 Rclone 安装为服务。对于 WebDAV 协议,Windows 也可以直接使用自带的网络驱动器功能挂载。

Rclone 挂载参数的调优,也可以参考我的配置。Windows 端可以添加 --network-mode 参数,不过没什么具体的效果。

Android 使用 KeePass

Android 平台上功能比较完整的 KeePass 实现主要有 KeePassDXKeePass2Android(简称 K2A)。

K2A 界面复古,自带访问网络存储的功能。

KeePassDX 的设计比较像 KeePassXC ,界面比较现代。但它不自带访问网络文件的功能,且作者明确表示不会提供相关功能的实现1,需要用户通过支持 SAF 的第三方应用(比如支持 SAF 的网盘 APP)提供网络文件访问功能。

Android 平台也有 Rclone 移植,但年久失修,功能也并不完善。对于通过标准 WebDAV 协议访问的网络存储,我推荐 DAVx5 来提供支持。

对于两款软件的选择,我的建议是都可以尝试一番。KeePassDX 的界面比较现代,但是访问网络文件比较麻烦还会出现 BUG ,自动填充也会 BUG 。K2A 界面比较复古,但是自带网络文件功能,功能稳定。如果自己没有找到合适的第三方同步 APP ,或 KeePassDX 在本机使用出现了 BUG ,不妨尝试一下 K2A 。

网络同步的版本控制

正如上文所言,KeePass 的密码库本质上是一个离线的文件型数据库,并不具备网络功能。当数据库版本发生冲突时,软件并不能很好地处理这个问题,或者说,会直接覆盖而并不尝试解决问题。

所以为了保护自己的数据安全,作为用户,建议养成良好的使用习惯避免悲剧的发生。

  1. 在修改数据库前,刷新数据库,保证自己操作的是最新版本的数据库。

  2. 完成修改后,及时保存数据库,并在其他已打开数据库的同步端刷新数据库。

参考资料

  1. https://github.com/Kunzisoft/KeePassDX/wiki/File-Manager-and-Sync