我的个人密码管理方案 - KeePass

ChlorineC Lv4

大约高中的时候我就接触了一些密码管理软件,如1Password这些,但最终由于上手还是有些难度(那个时候也没有心思折腾)而回归了传统的 passwords.txt 方案。

早些年(大概在大一暑假)的时候,我在偶然的一次多端密码同步需求下开始重新了解密码管理方案,最终选择了 Keepass 这一开源方案,当初潦草配置了一下 Keepass 满足了我的基本需求(密码存储+多端同步+自动填充),但仍有很多小bug或者其他让我用得不是很舒心的地方困扰我。

于是,在另一个契机下(指公司电脑里需要登录一个东西但是我用keepass生成的16位强密码记不住又不能粘贴密码这样一个非常麻烦的事情),我开始在另一台电脑重新配置我的 Keepass,并借此机会改善我的Keepass解决方案。

为什么选择 Keepass

最初的情况是这样的,我开开心心的用我的OneDrive同步我心爱的Password.txt,并每日使用Ctrl+F寻找密码;但是,这并不是事情的全部,由于我并不是每次都能记住要在Password里记上一笔(特别是在网页里),但大部分Chromium浏览器又自带一个密码管理器,因此大部分网页密码就存在了浏览器里。

彼时我已经从Chrome投奔了Edge阵营(现在又想投奔回来因为我的Edge太卡了),在Edge里也已经有了几百条密码记录,得益于微软账户的同步,我在手机和其他设备上也可以访问这些密码(浏览器中)。

这时,有一天我突发奇想,想要大统一密码方案,比如我的QQ在网页上、在应用里、在各种地方,都应该可以使用同一个密码和同一个服务进行填充(是的,我最初的需求就是因为我不记得我电脑上重置QQ密码是存在哪个网页上了,然后就经常找不到密码)。

正好,我发现了Edge也提供了类似的填充服务(在手机中设置),但我发现它并不好用,比如经常找不到或者无法调出,也无法方便地管理密码。也对,毕竟它本职就是一个浏览器,这只是一个附加功能罢了。

遂放弃Edge,开始寻找其他解决方案。

Why not others?

首先我肯定先看了1Password,LastPass等方案,但它和别的方案(如BitWarden)一样有一个我不能接收的地方:贵。

首先对于我这种轻度需求的人来说,它没有免费订阅,而且订阅费都是刀乐,实在有点难顶。

所以,选择Keepass的原因其实是没钱,它是开源的,缺了什么功能也可以自定义,何乐而不为呢?遂一拍即合,开整!

最初的 Keepass 方案

最初的Keepass方案的参考资料已经不可考了,我记得甚至有小红书的资料,这里我就简述一下方案思路和现状。

需求分析

由于我个人本来就是一个明文TXT存密码的人,生在这个地方也明白自己的隐私其实没什么好保护的,甚至都没什么人关心,只要保护好财产相关的隐私就可以了。因此,我对于互联网密码的安全性其实没有特别高的要求。

综上,我提出了以下几点需求,优先级依次递减:

  • 便捷且统一的密码管理和自动填充(网页和应用)
  • 全平台多端同步(PC/Windows+Android+iOS)
  • 自动生成和保存密码(可以在我注册时自动提示保存)
  • All-In-One体验(如集成TOTP认证)
  • 安全性保证(至少不是明文)

Windows 端与基础配置

最初的方案使用了官方的Keepass客户端,但是官方客户端UI比较简陋,功能也不完全,需要安装很多对应的插件才能满足需求。

image-20230522233014611

数据底层与同步方案

采用了单密码认证数据库+OneDrive同步的方案,这方面不在赘述。

界面和逻辑优化插件

  • KPEnhancedEntryView:优化了条目列表的显示
  • YetAnotherFaviconDownloader:自动下载网页图标
  • SourceForgeUpdateChecker:自动检查插件更新
  • 简体中文语言包:略

自动填充配置

KeePass使用树状目录组织密码,树的层级间会继承父级的规则,如自动填充、模板等,因此只需要在根目录配置好自动填充规则,所有条目都会共享这个规则,当然你也可以对特定条目/层级作自定义规则。

  1. 在根目录处打开该层配置选项。

image-20230522233607360

  1. 在自动输入栏里输入配置:{USERNAME}{TAB}{PASSWORD}{DELAY 100}{ENTER}(这里是一个模拟键盘输入的过程,意思是先输入USERNAME,按下TAB然后输入PASSWORD,最后等待100ms后按下回车),你也可以按照自己的喜好进行配置

image-20230522233701826

自动填充服务优化

这是最重要的一步,毕竟自带的自动填充真的甚至不能说差强人意,连浏览器场景都不好应对。

首先是应用程序场景,我选择 AutoTypeSearch 插件来实现快捷键搜索Entry+选择后运行自动填充过程。

在浏览器场景下有以下几种方案可选:

  • KeepassHttp:老牌方案,通过RPC传输SHA-256加密后的密码到浏览器,调用浏览器的自动填充(而不是模拟输入),但问题是也太老牌了(上次更新是6年前)
  • WebAutoType:在网页中运行自动输入过程,但个人体验下来不是很好(因为网页很多表单不规范导致模拟输入不好实施)
  • Kee Vault:我当时不知道从哪里得到的方案,个人感觉很方便,因此以下主要介绍该方案
Vault 方案

Kee Vault的在线服务是商业服务(虽然起步是免费的),而连接本地Keepass是免费服务

Vault 的使用非常简单,只需要三步:

  1. 在浏览器安装Vault插件
  2. 给Keepass安装KeePassRPC插件
  3. 在浏览器端连接二者的RPC过程

而它的优点有:

  • 免配置,很方便
  • 直接调用自动填充而没有模拟输入
  • 可以在注册新账号(出现密码的场景)时提示你保存密码

使用体验优化

  • 快速解锁:KeePassWinHello - 调用Windows Hello解锁数据库,但目前体验下来不太稳定(经常没法唤醒,得输入密码)
  • 条目模板:KPEntryTemplates - 这个我没有深究,不过挺重要的,让你新建条目的时候更轻松一点。

没有模板的界面是这样的:

img

有模板的界面(配置好后)是这样的:

img

移动端配置

个人有一台Android设备和一台iPad OS设备,但主战场其实在Windows端,手机端基本只起到读取的作用,因此就简单配置了一下:

  • OneDrive用于同步

  • Android:KeePass4Android

    • 优点:老牌方案,保持更新,稳定;支持快速解锁和本地缓存
    • 缺点:部分界面优点过于老旧(如密码键盘)
  • iPadOS:奇密(FantasyPass)

    • 这个方案我找了很久,其他方案要么太贵要么没法用(少功能如自动填充和同步)
    • 优点:便宜(买断制),支持快速解锁、本地缓存和自动填充;对平板显示支持良好

改进后的 Keepass 方案

这次在新电脑上重新配置Keepass,改进主要从以下几个方面入手:

  • 改进客户端体验:包括界面、解锁和输入等
  • 改善密码管理:在一段时间使用Keepass+Vault后,加之之前浏览器导入的密码,数据库中存储了大量冗余或无效的密码,需要对其进行清理和合并
  • 统一管理TOTP登录码:具体参考后文

Windows 客户端改进

在新的客户端上我选择使用 KeepassXC,其是一个Keepass的开源客户端,支持Windows、Mac和Linux主流发行版(也可以自己编译)。

它最大的优点就是界面好看,且开箱即用。它虽然没有KeePass那么丰富的插件,但好处就是插件有的功能它自己都已经覆盖了,包括:

  • Windows Hello 解锁
  • 浏览器集成(Chromium+Firefox)
  • 网页图标下载
  • TOTP生成

使用它甚至都不需要教程,直接上手即可。

image-20230523123956528

在个人习惯方面,我对其作了如下设置,尤其是最小化那一块非常重要(经常手滑关掉导致浏览器连不上)

image-20230523124229507

image-20230523124312862

image-20230523124333159

移动端改进

除了客户端换用了更现代的 KeepassDX 外没有什么改变。

其他改进

多URL方案

BitWarden有内建的单条目对应多URL方案,但KeePass并不支持。我简单搜索了一下有以下几种解决方案:

  • 克隆多条记录,并使用引用同步账号密码,设置不同URL(也是我的方案)
  • 设置属性(需要插件或客户端支持),如KP2A_URL(KeePassHttp)、App(Keepass4Android)等

番外篇:2FA与TOTP

2FA

2FA(双因素认证,2-Factor Authentication)是一种安全认证方案。

一般有三种因素可以作为认证一个人身份的凭据,如果用到了其中两种就是2FA:

  • 秘密信息:只有该用户知道、其他人不知道的某种信息,比如密码
  • 个人物品:该用户的私人物品,比如身份证、钥匙、手机
  • 生理特征:该用户的私人物品,比如身份证、钥匙。

生活中常见的2FA有银行卡(银行卡+密码),网上支付(U盾+密码)等。但在手机普及的现代社会,手机就成为了2FA中除密码外个人物品中重要的一个认证物件。常见的实验方案有短信认证、发送认证通知

但短信可以被伪基站等劫持,因此有一定的安全风险,这里就需要引入更安全的TOTP算法。

TOTP算法

TOTP 的全称是”基于时间的一次性密码”(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238

TOTP的认证过程其实相当简单:

  1. 用户开启双因素认证后,服务器生成一个密钥(这个密钥就类似于一个token
  2. 服务器提示用户扫描二维码(或者使用其他方式),把密钥保存到用户的手机。也就是说,服务器和用户的手机,现在都有了同一把密钥
  3. 用户登录时,手机客户端使用这个密钥和当前时间戳,生成一个哈希,有效期默认为30秒。用户在有效期内,把这个哈希提交给服务器
  4. 由于双端都持有同一个密钥,因此可以根据时间戳生成同一个Hash,跟用户提交的哈希比对。只要两者不一致,就拒绝登录。

注意,密钥必须跟手机绑定。一旦用户更换手机,就必须生成全新的密钥

那么它的代码实现是不是也一样简单呢?答案是,是的。

1
2
TC = floor((unixtime(now) − unixtime(T0)) / TS) # TS: 有效时长,默认30s T0: 起始时间戳,默认为0
TOTP = HASH(SecretKey, TC) # HASH 为约定的哈希函数,默认是 SHA-1

在KeePass中管理TOTP

了解了上述原理后相信大家也就知道了,不必绑定某一家的Authenticator,直接使用KeePass或某些软件就能管理基于TOTP的2FA;而能集成到KeePass中统一管理自然是最好的。

在 KeePassXC 中可以 直接右键条目(或者菜单中的编辑条目)-> 添加TOTP -> 将SecretKey(二维码的值)复制进来 就将TOTP导入到了对应条目中。

img

在设置成功后就可以在条目旁边看到一个时钟小图标,在下方条目预览中也可以直接看到TOTP的值。

QQ图片20230523113112

在官方KeePass客户端中可能需要借助第三方插件如KeeTOTP来实现。

参考资料

  • 标题: 我的个人密码管理方案 - KeePass
  • 作者: ChlorineC
  • 创建于 : 2023-05-23 08:47:52
  • 更新于 : 2024-06-04 03:50:36
  • 链接: https://chlorinec.top/2023/05/23/Technology/KeePass/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论