最近,我收到了 Github 的横幅通知,其要求我尽快启用双因素认证(2FA),否则将禁止我访问 Github。然后我才知道,打 2023 年起,Github 就已经开始逐步强制所有开发者都启用双因素认证来提高账号安全性。

image.png

这是 Github 2FA 推送机制。发起提示 45 天内不设置双因子验证的用户将被禁止访问 Github,可见其推进安全系统升级的决心:

image.png

近年来,以 Github 为代表的科技公司认为传统的密码已经难以满足如今的安全需求,其主张以双因素认证来替代传统的密码机制。这引起了我对账号安全性以及信息安全的兴趣。本文致力于回答以下问题:

  1. 密码机制面临哪些问题?
  2. 什么是双因素认证?
  3. 普通人如何管理好包含密码在内的机要信息?

密码机制的问题

密码是最直观的保证账号安全的方法。但是随着时代的发展,密码在安全性下降的同时还给用户造成了大量麻烦。

在互联网发展早期,互联网提供的服务还不多,用户的互联网账户很少,只需要为每个账户设置一个密码并且记下来就可以很好地保障安全。可是随着互联网渗透进生活的方方面面,现在我们每个人都手握起码几十个账号。如果每个账号都设置不同的密码,那要记住这么多密码几乎不可能。以我为例,不算移动端 app,我光是浏览器就保存了多达 186 个密码:

image.png

在这种情况下,大家开始想各种办法来减小密码给自己带来的负担。其中最常见的做法无疑是所有网站统一使用一个密码

统一密码的好处是容易以及,坏处则是安全性大打折扣。这种情况下,只要有一个网站泄露了密码,其他所有网站的账号就会同时失去保护。要命的是,密码泄露事件非常常见。有一个叫做 Have I been PWNed? 的网站可以查询自己的邮箱信息是否被泄露。我在这个网站上查询了自己的邮箱,发现我的邮箱和相关密码早在 2016 年针对优酷的一次袭击中就已经泄露出去了。如果我这些年一直沿用相同的密码的话,后果是不堪设想的。

image.png

为了少记密码并且减轻安全风险,和很多人一样,我采取了一个自以为很有效的方法。我将密码分为三个部分:

  1. 密码主体:一串足够复杂但是保证能被记住的字符串;
  2. 级别:表示这个账号的重要性级别;
  3. 网站名称:该网站的拼音名称。

[密码主体]![级别]+[网站名称] 这样的密码看似完美解决了问题,但是实际上又会产生别的新问题:

  1. 网站对密码的要求不同:有的网站要求密码在 8 位以上,有的则不允许超过 8 位;有的要求必须有 _ 和空格,有的则不允许使用特殊字符;总之,这样一套规则无法兼容所有网站,许多账号的密码都是要单独记忆的特例;
  2. 记错级别:有时候账号的重要性不好判定,很容易填错级别导致必须多次填写,在着急的时候造成轻微血压升高;
  3. 模棱两可的网站名称:少数派的名称应该用 ShaoShuPai 还是 SSPAI 呢?这是个问题;很久之后你还会记得你用了哪个吗?

随着我因为输错密码而暴跳如雷的次数越来越多,各家网站「找回密码」这一服务的压力越来越大,在大家的呼声下,革新方案呼之欲出。而这次大家选择了双因素认证

什么是双因素认证

双因素认证(Two Factors Verification,2FA)是建立在原先的密码系统之上的一种方案。2FA 要求两样东西:

  1. 只有你知道的:比如密码;
  2. 只有你拥有的:比如手机号、邮箱、密钥文件、解密U盘等;

双因素中前者是已有的,后者则是新添加的要求,只有完成两步验证才能最终验证通过。有了第二步验证的加持,认证安全性大大提高。网站不需要再在密码上提太多苛刻的要求也可以满足安全性需要。

双因素认证在今天已经十分常见,仍然以 Github 为例,Github 支持如下双因素验证方式:

image.png

其中 SMS/Text Message 选项就是我们熟悉的密码+验证码双因素验证方式。除此之外,最值得提的双因素验证方式是 TOTP,即上图显示设置好的 Authenticator app 验证方式。

基于时间的一次性密码 TOTP

基于时间的一次性密码(Time-based One-Time Passwords,TOTP)是一种很常见的双因子验证方式,其验证需要用一个验证程序(Authenticator app),流程是这样的:

  1. 准备工作:网站以及本地程序
    1. 生成一个密钥,网站和本地程序分别备份;
    2. 生成一个时间戳,记载启用 2FA 的时间,网站和本地程序分别备份;
  2. 验证:
    1. 第一次验证:用户输入密码,和网站存储的密码相比对;
    2. 第二次验证:用户的本地程序和网站均利用同样的算法,基于备份的密钥和当前时间计算一次性口令,该口令一般只在 30 秒内有效;用户输入本地程序计算得到的验证码,和网站计算得到的验证码相比较;
  3. 两次验证均通过则认证成功。
image.png

TOTP 是一种常用且有效的双因素验证方式。本文会在后面讨论如何用密码管理 app 有效管理生成以及管理 TOTP,在此之前我需要先向大家介绍一下我的机要信息管理方案。

普通人如何管理机要信息

前文提到,现在普通人需要管理的互联网账号越来越多,密码数量的增长造成了安全性和易用性的两方面麻烦。一个密码很可能有生以来从未遭受过一次恶意破解,但是却曾数次阻挠用户正常登录账号。不论是为了方便还是出于安全目的,我们都需要对密码有一个管理手段。

除了密码之外,这一概念还可以拓展到其他机要信息,比如密钥文件、关键信息等。机要信息的存储以及管理主要需要顾及这几个方面:

  1. 安全:不追求绝对安全,但至少他人无法轻易盗取;
  2. 持久:这些信息必须数年、数十年后依然可用,不能被特定平台或者设备绑定;这一点类似为什么笔记用户要保卫自己的「数字主权」?中的观点;
  3. 易用:使用必须方便快捷;事实证明人在输入密码的时候是极度暴躁的,方便快捷的调用密码有助于保护设备安全

接下来我会先从密码本开始,带你一步步走完我的机要信息管理系统演变历程,最后着重介绍成熟的版本,希望能对你有所帮助。

缘起

我和很多人一样,需要高频输入密码,又自备一定功能的浏览器自然而然成为了第一个密码管理器。浏览器的优点毋庸置疑:

  1. 极易上手:自动记录密码、自动填充密码,和网页浏览融合极好,简直不要太方便;
  2. 跨平台同步:Edge、Chrome 都有自带的免费跨平台密码同步,我能拖到现在才写密码管理器的文章都是依赖 Edge 的庇佑(由于到截稿也没赚够买 Macbook 的钱,Safari 的情况请知道的用户在评论区说吧)。

然而其缺点也是极其明显的:

  1. 同一网站,多次记录:会把不是密码的内容(比如验证码、已经销毁的旧密码等)也当做密码记下来,造成一个网站有多个密码;
  2. APP 怎么办:浏览器不能为其他 app 填写密码,之前我总是需要打开浏览器->找到电子钱包->搜索密码->复制密码才能找到需要在 app 输入的密码;
  3. 不方便手动调出密码:如果浏览器没能检测到该网页需要填写密码,那么去手动掉出密码管理器是不太方便的;
  4. 同步,但不完全:多个浏览器之间不能共享密码,国内的 Chrome 用户要使用同步也很麻烦;
  5. 只支持单一密码形式:不支持 SSH 常用的密钥文件、2FA 等认证形式。

由于我实在是很需要在 APP 里面输入各种密码,因此在浏览器难堪大用的情况下,我开始枉顾安全性,又把密码本这一传统智慧请了回来。然而明文存储手机便笺中、没有加密、没有同步的做法很快就带来了报应:我的手机屏幕坏了;但是由于害怕密码本泄露,我始终对送修心存忌惮,最终让我陷入了不断拉扯。就这样,我开始踏上了寻找更好的机要信息管理手段——一个真正的密码管理器的道路。

密码管理器

密码管理器是专门用来存储并且管理密码的软件。其基础功能包括安全地保存重要信息、自动生成密码等。

绝大多数密码管理器都通过维护一个密码库、并且为密码库设置单独密码来保护其它密码。只需要再辅之以自动填充等功能,这样用户就只需要记住一个密码库密码即可访问所有需要密码的 APP 和网站了。

image.png

市面上的密码管理产品非常多,比如功能和评价都极好的 1Password,LastPass。但我这里主要介绍两款开源密码管理器:Bitwarden 和 Keepass。

Bitwarden 和 Keepass 均为广受用户欢迎的开源密码管理器,其中 keepass 有许多基于开源 keepass 2 进行二次开发的版本。本文主要会从基本功能、使用体验以及进阶功能三个方面对比 keepass 和 bitwarden,希望能为你提供一些参考价值。

Bitwarden

Bitwarden 是一款功能完善且界面观感极好的开源密码管理器。大多数开源软件的界面设计不太考究,但是 Bitwarden 不论在 PC 端还是手机端都做出了简约漂亮而且易用的界面,从用户的角度来看,这是非常加分的。

image.png

用户可以用 Bitwarden 管理的信息类型如下:

image.png

每一种类型都拥有不同的字段。比如登录类型有用户名、密码、网站网址、以及备注这几个字段,可以用于存储我们生活中使用的大部分密码以及备忘信息;而支付卡则在此基础上还多了持卡人姓名、品牌等字段。此外,你也可以向其中添加自定义字段来适配你自己的需求,不过如果要在字段上附加文件则需要付费。相比起 1Password(月费 2.99 美元),Bitwarden 收费不高,仅仅为 10 美元(73.05 人民币)每年。

在生成密码方面,Bitwarden 支持自动生成强密码,可以选择密码长度、包含的字符类型以及密码短语。

image.png

生成的密码会被存储于你的私人密码库中,被同步到云上。此后不论是浏览器还是手机、电脑、平板客户端都可以轻松访问。

Bitwarden 支持包括 2FA 在内的多因素认证方式。以 TOTP 为例,只需要将验证器密钥填入准备好的字段内即可使用 TOTP 认证(这同样是付费功能):

image.png

除了基本的存储密码之外,普通用户最看重的是自动填充功能。我们希望当密码框出现的时候,密码管理器就能自动识别,并且省心地为我们填好密码。Bitwarden 的自动填充功能做得极好,不论是手机端还是电脑端(浏览器端需要安装浏览器插件),不论普通密码还是 TOTP 都能快速识别到并且自动填充。

image.png

手机端:
 

1744612356986_d.jpg

不仅是网站和 APP 密码,Bitwarden 手机端还能识别到微信支付密码输入并且进行自动填充。而作为可以自己部署的开源软件,Bitwarden 值得信任,不需要担心这样做会泄露重要的隐私信息。

不过值得注意的是,手机端的权限情况比 PC 要复杂得多,密码管理器可能需要特别的配置才能实现 APP 密码填充,而且配置方法随手机不同而不同。一般来说,Bitwarden 设置的自动填充选项会引导你进行正确的设置,相比起需要进行复杂配置或是需要 root 权限才能在手机端实现密码自动填充的密码管理器来说,Bitwarden 可以说是对用户非常友好。

Bitwarden 有许多进阶功能,我认为其中最为可圈可点的是这几个:

  1. 自建服务;
  2. 安全分享;
  3. 暗网监控。

作为一款开源密码管理器,Bitwarden 支持 Docker自建。如果你认为 Bitwarden 提供的几个域名在国内访问太慢,或者单纯只是不信任服务提供方,那可以自行购买域名搭建服务,将数据掌握在自己手里。

Bitwarden 也支持安全共享文本或者文件。只需要编辑一个 Send,然后 Bitwarden 就可以为此生成一个可共享的安全链接,对方就可以通过链接安全地收到文件。这个功能对于有安全需求的组织非常有用。

image.png

此外,暗网的社工库一直以来都在严重威胁普通用户的密码安全,造成隐私泄露以及恶意使用。Bitwarden 团队会主动监控暗网,及时发现泄露密码,并提醒你更改。

综合来看,Bitwarden 是一款基本功能十分完善、对用户十分友好而且收费不高的密码管理器。适合能接受一定付费的普通用户,尤其是不满 1Password 以及 LastPass 过高收费的用户。此外有相关技术背景的用户可以考虑自建 Bitwarden,保证数据时刻掌握在自己手中。

KeePass

Keepass 是一款很有名的开源密码管理器,其支持包括存储密码、密码分组、密码生成以及自动输入在内等许多丰富的功能特性。

image.png

和 Bitwarden 一样, Keepass 支持所有的基本功能。用户可以创建 entry,entry 包含有标题、用户名、密码、URL 等字段,并且用户可以自行添加新的字段。
 

image.png

Keepass 提供一个强大且高度可定制的密码生成器。相比起 Bitwarden,Keepass 的密码生成器可以实现更加精细的控制,不仅可以控制是否使用空格、拉丁文字符,甚至还可以自定义密码生成算法,足够满足高度专业性的需求。

image.png

和 Bitwarden 相同,Keepass 也允许添加文件作为附件。但是 Keepass 包含这个功能在内的所有功能都完全免费,更加适合不想在密码管理上花钱的用户。

image.png

Keepass 本身是完全离线的,其会将所有的信息都存储在一个密码数据库文件(.kdbx)里面。这个密码数据库本身被高度加密,需要使用唯一的主密码才能打开。默认情况下,Keepass 使用 AES/Rijndael 算法来加密数据库文件,在没有主密码的情况下几乎不可能通过暴力破解打开数据库。如果对安全性还有更高的要求,可以调高迭代次数,继续增大破解难度。但是相应地,打开数据库的速度就会变慢。

image.png

虽然 Keepass 本身不具备云同步功能,但是其却为你使用第三方同步提供了支持。Keepass 同步只需要同步密码数据库文件即可。我比较推荐使用坚果云 webdav 的方法来进行同步,只需要在坚果云对该文件启用 webdav,然后选择打开 URL 选项即可打开云端 webdav 密码数据库,轻松实现 webdav 同步。

image.png

Windows 端的 Keepass 的并没有原生的自动填充功能,实现自动填充要依赖插件。在 2025 年我比较推荐的自动填充方案是 KeepassRPC+Kee,其中前者是 Keepass 插件,后者是浏览器插件。只需要打开 Keepass,解锁密码库,然后就可以在浏览器中使用 keepass 的自动填充功能了。

如果网页和密码库中的密码能匹配上,那么 Kee 会为你自动填充好账号和密码,你只需要点击登录即可。

image.png

Keepass 使用 TOTP 也需要插件的辅助,TOTP 插件我推荐两个:

  1. KeeTrayTOTP:TOTP 的推荐插件,可以自由设定刷新时间等参数,功能支持很完全;
  2. TwoFactorQRCodeReader:可以通过扫码获取 TOTP 密钥。

以 Github TOTP 为例。安装 TwoFactorQRCodeReader 后,右键一条已有的密码(如 Github 账户),选择扫描二维码。之后只要二维码出现在屏幕上,就可以被检测扫描从而获取到 TOTP 密钥(如果没有成功扫描到,可以截图选取二维码区域,TwoFactorQRCodeReader 会读取剪贴板的图片从中识别二维码)。

image.png

之后,TOTP 数据就会被添加到这条密码的「其他数据」中。右键这条密码,选择「其他数据」,就可以复制 TOTP 验证码。

image.png

如果你使用的是 KeeTrayTOTP,那你需要手动复制 TOTP 密钥到 Keepass 中。如果采用这样的方式,复制 TOTP 验证码也需要选择 Tray TOTP Plugin 选项。

Keepass 本身只支持 Windows 平台,要在手机上使用 Keepass,还需要其它 app。以安卓为例,手机端 Keepass app 有很多,我最推荐的仍然是 Keepass2Android。

1744767961025_d.jpg

Keepass2Android 支持一个手机端密码管理器所需的一切功能,包括存储密码、Webdav 同步、自动填充等。和 Bitwarden 手机端一样,Keepass2Android 自动填充一样需要一定的配置。如果你也使用小米系手机,在设置中启用自动填充并且将自动填充 app 设置为Keepass2Android 即可。

Keepass2Android 一样支持 TOTP。PC 端不论是 KeeTrayTOTP 还是 TwoFactorQRCodeReader 产生的 TOTP 都可以在Keepass2Android 中兼容。在 Keepass2Android 中,你可以看见 TOTP 验证码每 30s 刷新一次(由于 App 内禁止截图,所以这里就不演示了)。

此外,Keepass2Android 也支持指纹验证、安全键盘等。Keepass2Android 也是一个基于 Keepass 构建的开源软件,安全性可以保证,可以放心授予相关权限。

KeePassXC

Keepass 是我使用时间最长的密码管理器,其功能之丰富,插件生态之强大,可以允许有技术基础以及相关需求的人进行深度定制。然而 Keepass 基于 C# 以及 .NET 平台构建,不支持 Windows 之外的平台,苹果生态下的用户将无缘Keepass。此外,Keepass 的设计风格比较古典,习惯现代扁平风简约设计风格的用户可能会不习惯。

更重要的是,Keepass 的大量功能由插件提供,这些功能往往缺乏打磨。比如 Kee 可以填充密码,但是由于 Keepass 的 TOTP 功能由其他插件提供,因此 Kee 不能自动填充 TOTP 验证码。这就导致了一种情况:单看每个指标都很不错,但综合体验却不行

为了解决这些问题,KeepassXC 诞生了。KeepassXC 使用 C++重写了 Keepass 的功能,不仅设计了更加现代化的界面,而且还将功能集成起来进行重新打磨。相比起 Keepass,KeepassXC 具有这些特性:

  1. 将原版功能和部分需要插件才能支持的重要功能重新集成起来,KeepassXC 的本体即支持密码存储、2FA、SSH agent 以及自动填充;为此,KeepassXC 团队专门开发了一个功能完善的浏览器插件,支持账号密码、单密码以及 TOTP 验证码自动填充;
  2. 保留了密码数据库的设计,仍然可以继续使用 webdav 同步数据库;
  3. 重新设计了界面,使之更加符合当代人审美;
  4. 添加了统计、密码健康检查、以及在线 HIBP 等功能;
  5. 对整体的体验进行了打磨。
image.png

KeepassXC 的浏览器插件支持完整的自动填充,不仅可以自动填充账号密码,也可以自动填充 TOTP 验证码,这使得 2FA 登录体验也变得无比丝滑。而 Kee 插件是不支持自动填充验证码的。

image.png
image.png

KeepassXC 可以设置快捷键调出全局自动输入,对于插件识别失败的密码框或者是 APP 密码,可以直接按下快捷键调出密码。

image.png

除了基本的密码存储以及填充,KeepassXC 也原生支持 SSH Agent 密钥填充(Keepass 必须通过 KeeAgent 插件)。Windows 自带 OpenSSH 服务,这个服务提供了 SSH-Agent 功能。KeepassXC 支持存储密钥,并且在数据库开启的时候将密钥添加到 SSH 环境中并且及时移除密钥,从而免去将密钥存储在本地导致泄露的风险。

要使用 SSH-Agent,要先启用 Windows 自带的 OpenSSH 服务:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent

然后选定一条密码(一般是服务器密码),将私钥文件添加到附件中:

image.png

然后在 SSH 代理界面选择刚才添加的私钥附件,并且粘贴公钥。勾选上两个选项,使得密钥和数据库同步可用:

image.png

点击确定之后,重启 KeepassXC,之后在登录远程服务器的时候就再也不需要输入密码了。这种 SSH 代理的方式不仅可以保护密钥安全,还很方便迁移密钥。

不过 KeepassXC 对 webdav 的支持不如 keepass。KeepassXC 不支持直接使用 webdav 链接,而是必须将 webdav 文件挂载到本地,再以文件的形式打开。不过好在 Windows 的文件管理器原生支持此功能。你需要打开文件管理器,右键「此电脑」,选择「映射网络驱动器」:

image.png

接着选择一个还没用过的盘符,文件夹处输入 webdav 链接,接着输入密码。验证通过之后就可以像是访问本地文件一样访问 webdav 文件了。

image.png

除此之外,KeePassXC 还有一些实用小功能。比如密码统计:

image.png

密码健康检查,可以提醒自己及时更换密码,规避安全风险:

image.png

HIBP 检查,即使用文章开头提到的 Have I been PWNed 检查密码泄露次数。我也是为了写这篇文章才知道,我居然使用被泄露可能有 10 万次的密码。

image.png

总得来说,KeepassXC 是一款发扬了Keepass 优点同时也对用户很友好的开源密码管理器。KeepassXC 虽然总体上不如 Bitwarden 易用,也不如 Keepass 有那么多高级功能,但是却很好地平衡二者之优点,而且完全免费,非常符合不希望付费但是希望拥有相对好的体验的用户。

结论

软件付费密码生成2FA自动填充密码跨平台同步易用性功能丰富程度数据掌握在SSH Agent适合用户
Bitwarden10 美元/年一般支持自带跨平台同步极好一般云端(但是自行部署)支持(付费)有付费意愿的普通人
KeePass免费需要插件一般(需要插件)Webdav一般极高用户需要插件技术极客&专业用户
KeePassXC免费支持Webdav(需要手动挂载)用户支持无付费意愿的普通人

我是@西郊次生林,一个关注效率工具研究生,欢迎关注我收看更多真实体验 & 测评。