我日常的密码管理是通过一个 Lua 脚本为不同网站生成不同密码。Lua 脚本的好处是电脑和 iPhone 上 (通过 iLuaBox) 都可以使用,不过切换到终端、调用脚本、拷贝粘贴密码的过程不太方便,所以最近实现了一个 Chrome 插件来实现这个功能。
这次实现的算法跟 One Shall Pass 的一致,可以指定密码长度、包含多少特殊字符等选项。插件用 Chrome 来同步密码选项。这个算法依赖 PBKDF2 生成 key 的开销来增加暴力破解 passphrase 的代价,所以可以公开算法,也因此可以用 JavaScript 实现然后放在网上以便随时在浏览器中使用。
除 Chrome 插件外实现了两个独立的页面,其中一个专为 iOS 优化,添加到主屏幕后可离线使用。有兴趣的同学可以移步 github 获取更多技术细节,体验地址如下:
密码管理很多人可能会推荐 1Password,为每个网站生成完全独立的密码看起来也更安全。不过这种方式必须要存加密后的密文。1Password 是用 master password 通过 PBKDF2 生成 key 来加密密码存储到文件系统。(参考 1Password 官方博客文章,值得一读,对 master password 的重要性给了非常好的说明。)下面是两种方式的比较:
- 基于 passphrase 生成网站密码这种方式
- 加密密文 (即生成的密码)只在你注册的网站数据库中
- 多数应该加密存储,如果使用的算法好的话破解网站密码也需一定开销
- 但安全性上应该做最坏打算,这只是减小了密文被人得到的机会而已
- 一旦丢失 passphrase 则相当于丢失所有密码
- 所以更安全的做法是对网站进行分类,使用几个不同的 passphrase
- 加密密文 (即生成的密码)只在你注册的网站数据库中
- 完全独立密码
- 除了注册网站以外,自己也必须保存一份密码的加密密文
- 需要备份加密密文以防止丢失密码
- 需要同步加密密文以方便在不同设备上使用
- 没有加密密文时无法获取密码
- 如果丢失 master password,在没有丢失密码密文的情况下还是安全的
两种方式各有优缺点,但选择一个强 passphrase/master password 都是保证安全的更为有效的办法。
其实我是密码学门外汉(所以才选择用 One Shall Pass 的密码生成算法),自己写一个密码生成工具最大的原因是我觉得 1Password 定价过高,自己写一个也比较有意思。写过几个插件以后觉得浏览器真是个不错的平台,用 HTML 实现这种简单的工具比实现 native 更方便,而且还跨平台。CoffeeScript 真是个好语言,融合 Ruby/Python 等语言的优点,写起来舒服,同时还可以让我这个 JavaScript 半吊子能避免 JavaScript 的各种坑。