通密之所以不应该被过分指责,是因为有其存在的道理,没有哪种方案的管理成本比它更低,它不需要购买昂贵的1password,不需要担心临时用的时候突然想不起来,而且,只要这个密码足够强壮并且使用环境足够安全,大多数情况下也不会有什么问题。通密的问题在于它的风险成本太高,一旦一处泄漏,所有使用这个密码的地方都不安全。
另一个极端是,使用很复杂的密码,每个账号都不同,甚至用密码生成工具生成完全没有规律的随机字符串。这种方案的安全性很高,高到连你自己都记不住。
所以我需要这样一套好的方案,它应该在安全性和易用性之间取得一个比较好的平衡,并且随著方法论和工具链的进化,这个平衡可以无限逼近黄金分割点。
首先,密码应该是复杂但容易记住的。密码的复杂度和记忆负担并不成正比,例如如果你实在记不住“ppnn13%,dkstFeb1st”,那么这样呢——“娉娉袅袅十三余,豆蔻梢头二月初”。密码只是一个字符串,如果不去死记最终的值,而是字符串背后的规律,记忆的压力就会小很多。
但考虑到每个账号都想一个这样的密码是不现实的,而且怎么解决记忆密码和账号的对应关系的问题?所以进一步,可以用这样的密码当前缀,每个密码的前缀都一样,然后针对每个账号创造一个后缀,这个后缀应该是每个账号都不同的,且和账号有某种只有你自己才知道的关联,这样你可以随时根据账号计算出它的后缀。例如,可以用账号拼音首字母(当然,实际的规则应该更复杂一点)。
这样你就有了足够复杂、每个账号都不同并且很容易记住的密码。进一步地,在私有设备上可以利用文本替换功能(例如:Alfred for Mac的Snippets功能)快速输入通用前缀,某些支持按键编程的机械键盘会有更好的体验。
不过好记性不如烂笔头,为防万一,还是需要一个Plan B。主流的密码管理工具主要有这么几种:
- 浏览器的账号记忆功能
- 操作系统的keychain
- 在线密码管理工具
- 离线密码管理工具
浏览器一般是把密码以明文存储在本地的,firefox虽然有个主密码,但只是个幌子,别人仍然可以拿到它记录密码的数据库文件。这种做法的逻辑在于,设备上存储的数据的安全性由操作系统和用户负责,换句话说,用户不应该允许他人用自己的权限登录设备。但实际上很难避免这种情况,而且还要考虑到系统被入侵的可能。所以,只应该让浏览器记住那些最不重要的账号。
相对来说,操作系统的keychain一般有自动锁定的功能,会更安全一些。但是仍无法完全避免上述问题。而且keychain只能记录账号和密码,无法存储更多的附加信息。所以这种工具也只应该存储一些不重要的账号。
最著名的在线密码管理工具应该是Lastpass。关于它的安全性有很多种说法,不过我觉得但凡是敏感数据都不要存储到线上,所以这种方式不予考虑。
我倾向于使用离线的密码管理工具。1password据说很好用,但是太贵了,而且开源免费的keepass已经完全够用了。我在Mac上用KeePassXC,在iOS中用MiniKeePass,私钥文件离线存储,然后数据库文件用Dropbox同步就可以了。
此外,对于重要的账号,如果支持两步验证,一定要开启,然后用OTP Auth管理即可。
最终的方案是:
- 方法论:统一的复杂但有规律的前缀+根据账号计算出来的后缀
- 工具链:KeePass + OTP Auth + Dropbox