CSDN 密码泄露事件以后,人人自危,各种密码管理方法涌现,比如分级法、词根法、MD5 法等。作为一个完美主义者,我也重新审视了自己原来的密码管理方法(分级+词根),弄了一套“完美”的密码管理方法出来。本文即对此做一下介绍。
一、明文密码事件
先简单地回顾一下 CSDN 密码泄露事件吧。这是发生在 2011 年 12 月 22 日左右的事。CSDN 作为一个国内著名技术网站,却被爆库(网站数据库被曝光),此事非同小可。更令人愤怒的是,CSDN 居然储存了明文密码。啥是明文密码呢?在网络里,为了安全,密码应该是用 Hash 进行不可逆加密,然后存储起来的。著名的 Hash 算法有 MD5、SHA1、SHA256 等等,这些算法虽然都不是完美的,但是经过这么多时间的考验,还是比较实用的。通过这些算法,能把每个密码生成一个“指纹”,在服务器的数据库里也只要存储“指纹”就可以了,如果“指纹”相符,就说明密码(极有可能)是相符的。而 CSDN 却存储了用户的明文密码,这是非常可怕的。 继 CSDN 之后,又有大量国内网站的明文密码库被放到网上供人公开下载,我把它们都下载下来验证了一下,有的是真的(能搜索到正确的我同学的账号密码),有的则是假的,是已泄露的网站的数据的合成(比如所谓的“新浪微博数据库”,只是那个所谓的“人人网数据库”进行了一些小修改而已。
明文密码事件算是中国互联网的一次连锁地震吧。CSDN 泄露的时候,也许只是程序猿员和腋内业内人士在着急,而当中国大陆最大的仿 Facebook 网站“人人网”(原“校内网”)的密码库也被曝光时(尽管有部分虚假数据)、当 当当、凡客、卓越等 B2C 的用户资料展现在网友面前的时候,着急的就不再是程序员们了,而是几乎所有网民。就算一些网站的账号并不重要,但是要命的是,很多人在不同的网站用的都是同样的用户名和密码……外交部发炎言人姜瑜曾经说过“中国的互联网是公开透明的” (via),这次密码泄露事件真的让人感受到中国互联网的公开与透明了。
二、启示与思路
那么这次事件有什么值得思考的呢?
- 中国的互联网正如姜瑜说的那样是“公开透明”的,很多网站为了“某些目的”,都曾经和/或现在明文保存着密码;
- 如果你在所有的网站都用同样的密码,那么只要有一个网站“被透明”了,那么你在其他网站的账户也会遭殃;
- 这种“遭殃”主要来自网络。其他网民会下载密码库,获取你的用户名密码,用来尝试登录你的别的网站;
- 更可怕的是一些没有道德底线的黑客,他们会用专门的软件每秒钟几百次,7*24 小时不停机地试密码。
于是,我们可以得出以下结论:
- 不同的网站要用不同的密码!
所以很多人就推荐“分级法”或者“词根法”,或是两者的结合(我原来就是这么管理密码的)。
分级法与词根法——过时的流行密码管理法
分级法是指将网站分为不同的级别,我分了三级,第一级是“不重要”的国内网站,包括但不仅限于各种为了下载个附件而注册的论坛;第二级是不甚重要的国外网站以及稍微重要些的国内网站比如亚马逊、京东的账号;第三级则是最重要的,如 Twitter、Google 账号等。其中第三级密码又用了“词根法”,即有一个固定的词根(由复杂大小写、数字、符号组成),再根据不同的服务加以不同的变化。
旧式方法的致命缺陷
然而,分级法的最主要缺陷是,你至少有两个网站的密码是完全相同的,那么如果有一个泄露了,另一个也可能泄露,鉴于国内互联网如此公开透明,这是很有可能的。也许这两个网站对你都不重要,但是既然可以避免它泄露,为什么不呢?
词根法也好不到哪里去,要用词根法的话,后缀必须要和那个密码所对应的服务有所联系,这样才能记住。而一旦你的两个或多个密码被泄露了,这种规律便很容易看出来了。
认清“敌人”在哪里!
我们必须要弄清楚,在你的网络密码泄露之后,会来登录你的账号,窃取你的信息的是谁?是你的周围的人吗?极少数人也许会,但是更多的威胁来自网络。这些账号密码是宝贵的网络资源,可以用来发黑心财。所以,我们的“敌人”在网络上,所以我们要把密码保管得离他们越远越好!那么哪里是最远呢?就目前的科技水平来看,与网络物理绝缘是离他们最远的,也就是不放在网络上,而更信任放在自己身边,比如大脑中,比如自己的电脑里。(什么?电脑被窃?只要我们不要像陈同学那样没有电脑常识就好了!)或者,有一个物理屏障。一些网游的密保卡、银行的“U盾”等都可以算是“物理屏障”。就一般情况而言,有了这些物理绝缘或者物理屏障,密码对于网络威胁来说是安全的。
使用机器代替人脑生成和记忆密码
也许你的密码不是常见密码(生日或纪念日、电话号码、字典里有的单词),也许你的密码不是弱密码(纯字母数字、过短),也许你费尽心机,在键盘上按出各种图案,运用各种变化,想出了一个勉强能记住的强壮密码……但是一旦明文了,啥也没有用。且你不可能为了每个服务都想一个足够复杂的密码。于是我们需要使用随机密码。随机密码是指使用软件,按照一定的模式 (pattern) 生成的符合一定强度要求的密码。它们通常是同时含有大小写字母、数字、特殊符号,且足够长的强壮密码。但是在实际应用中,我们不一定需要那么强的(输入太麻烦),所以可能根据实际情况自行削减强度。
俗话说“好记性不如烂笔头”,每个网站用完全的随机密码,然后全部工工整整地记在纸上随身携带当然是个可行的办法,只可惜这样的方法的效率实在有点低,且纸质品本身容易损坏,即使定期备份,麻烦不说,还容易抄错,实在不适合现代快节奏社会使用。
于是一系列密码管理软件就出现了。这类软件使你只需记住一把“钥匙”,而它其他服务的各种密码都保存在它的数据库里,只要保管好这把“钥匙”,你的密码数据库就是安全的。没错,这有点像是“把鸡蛋都装在一个篮子里”,但是如果这个篮子足够结实足够安全,那么你的鸡蛋也是安全的,至少比把鸡蛋分装在几个破篮子里安全。各种密码管理软件中,我最推荐的还是 KeePass 系列。优势如下:
- 它是开源的自由软件,代码久经考验;
- 它有 Windows(包括 Windows PE)、GNU/Linux、Mac OS X、U3、Android、iOS、Windows Phone、BlackBerry、PalmOS、Java ME 等多平台的版本(各平台版本的下载地址),且都是免费的;
- 支持导出到其他密码管理体系中(下面会用到)。
更新:在用了多年 KeePass 生态之后,我觉得它不如 1Password,详见《迁移至 1Password 密码管理器》。
三、实现与实践
以下内容主要以 GNU/Linux + Android 为例进行说明。其他平台与此相似。
配置电脑上的 KeePass
KeePass 系列有官方的 Windows 版本,所以 Windows 用户可以直接去它的官方下载页面下载安装。
这软件其实官方只开发了 Windows 版本……别怕,它是开源软件,所以各种第三方开发版非常多,且它们中的优秀者都列在官方的下载页面了。至于 GNU/Linux,有两个比较流行的版本,一个就叫 KeePass2,是 Windows 版通过 Mono 在 GNU/Linux 下运行的。此版本几乎可以实现 Windows 版的一切功能,但是由于是 Mono 出来的,所以 UI 是非常丑陋的,bug 是比较多的,我用了一段时间,放弃了。另一个版本叫 KeePassX,此版本是根据 KeePass 的代码重新写的,是原生的的 GNU/Linux 程序,UI 和 KeePass 的 Windows 版几乎一样,但是,虽然只支持 KeePass 1.x 的数据库,但是足够用了,而且非常好用,我一直用到现在,推荐使用。此软件在各大发行版的官方源里都应该带了,可以直接用各自的包管理器安装。以 Ubuntu/Kubuntu/Xubuntu 为例,在终端中输入 sudo apt-get install keepassx
即可安装。
如截图所示,这 UI 的确跟官方 Windows 版差不多……如果是第一次使用,首先需要新建一个数据库:
这里的两个选项是什么意思呢?Password
是指定一串普通的密码,而 Key File
则是指用一个文件当作“钥匙”。这个文件可以是你的私人照片等只有你自己拥有的东西,也可以是你知道怎么获取的东西(比如你最喜欢的网站的 Logo 文件(保佑它别改吧),或是一段含有自己喜欢的句子的 txt 文档,甚至可以是自己画的一幅 bmp 图像),如果你想不到有什么东西可以当“钥匙文件”,你也可以让 KeePassX 帮你生成一个,以后保管好这个文件就好了。如果文件丢了,那就真的没办法了。所以我是用“我知道怎么生成,并且丢了可以再次生成的文件”作为“钥匙文件”的。注意,这两个选项可以同时勾选,但是“空密码”不等于“不勾选密码”。如果你同时用了普通密码和文件密码,那么你的数据库可以说是相当安全了。
建好数据库之后,按快捷键 Ctrl+Y 即可添加新条目:
图中一目了然了……按 Gen
按钮可以打开随机密码生成器,Quality
一条用“信息熵” (wiki) 的概念表现你的密码有多强。图中已经爆表了……嗯,此图是虚构的……
在密码泄露事件之后,我便采取新式的密码管理策略,也就是将所有的密码全部交给机器来记忆。当时我用的还是 Mono 版的 KeePass2,根据 Chromium 里已经保存的密码列表,登录那些网站,一个一个地去修改密码,全部改成随机密码,并保存在本地的数据库里。
配置掌上设备上的 KeePass
如果电脑不在自己身边,要登录个网站岂不悲剧?所以要在掌上设备上也有一份密码库。无论你拥有的是智能手机还是非智能手机,甚至不是手机(iPod touch、平板电脑等),都可以找到合适自己的 KeePass 版本。比如 Android 用户可以点击这里安装 KeePassDroid。
这是 KeePassDroid 在我手机上运行的截图,熟悉了 KeePass 桌面版的用户对它的操作不会陌生。把电脑上用 KeePassX 生成的密码库(也许还有“钥匙文件”)传输到手机上,就可以用 KeePassDroid 打开了。注意:如果你是 Windows 用户,那么电脑上 KeePass 2.x 生成的数据库 (kdbx) 在 KeePassDroid 里是只可读不可写的!而 KeePass 1.x 的数据库 (kdb) 则是可读可写的,所以如果需要在手机上编辑数据库,请把它导出成 kdb 格式……而 GNU/Linux 的 KeePassX 则没这个问题,因为它只支持 KeePass 1.x 的数据库 (kdb)……
配置 Dropbox 以同步
把电脑上的数据库通过数据线或者 WiFi 手工复制到手机里也太低科技了……有 Dropbox 这样的神器为啥不用呢?点此注册 Dropbox。Dropbox 这软件没啥好介绍的,相信不少人都熟悉了,把电脑上 KeePass 的数据库移到 Dropbox 的目录里,就可以自动同步到云端了,在手机上也可以随时下载使用最新版的数据库。慢着!又回到网络上了?别担心,就算这个数据库文件被窃取了(Dropbox 的传输并不加密,而是在服务器上加密的),别人没有你的密码,也没有你的“文件钥匙”,以目前的科技水平,是不可能打开你的数据库的。(如果真的要暴力破解的话,可以把截获的数据库保存着,等若干年后计算机的处理能力足够强大了再去暴力破解……(溯回破解)所以定期改密码还是有必要的)
配置 LastPass 作为最后一根救命稻草
来自十年后的更新:LastPass 在过去十年里出了多次安全事故。在最近一次大泄露之后,我翻出了这篇十年前的文章,在此警示读者:不要选择 LastPass!推荐使用 1Password。
如果电脑、手机、iPod touch、平板电脑都不在身边,那该怎么办?只要有网络,还是有办法的。那就是 LastPass 了。注意:此方案从理论上来说会增加你的密码库被网络攻击获取的可能性!因为 LastPass 的网站有可能被攻破……如果你确信你的手机、电脑、iPod touch、平板电脑始终有一份在自己身边的话,请略过此步骤。
前面说了,LastPass 也是一套密码管理方案,且支持网络同步,但是它的各种客户端大多是要按月收费的,所以不推荐,这里只是使用它的免费功能之一,也就是网络同步。怎么又是网络呢?但是这次也是有物理屏障的,所以可以考虑。但是,这与 Dropbox 的同步不同,Dropbox 是同步了一个数据库上去,即使数据库被截获了(在传输中被窃取,或者 Dropbox 的服务器被攻破),由于别人没有密码和“钥匙文件”,所以数据库对他来说是没有意义的,而 LastPass 同步上去的是密码的本体,一条一条单独可读的,所以一旦别人取得了你的 LastPass 账户的访问权,就可以访问到你的所有明文密码!所以这个账户一定要有“物理屏障”。但是,LastPass 的服务器也可能被攻破(这事以前差点发生过),所以把 LastPass 作为备份从理论上的确会增加你的密码库被网络攻击获取的可能性。请自行考虑是否要采取此方法备份。
如果的确需要用 LastPass 备份,请继续往下阅读。
我们只需要用到 LastPass 的免费功能,不需要下载它的任何客户端(大部分是收费的)。所以先去 lastpass.com 注册一个账号吧。
下面需要做的是把 KeePass 的数据库导出,在菜单中可以选择导出在 xml 格式,然后登录 LastPass 的账户,点击 Import
,然后把 xml 文件里的所有字符全选、复制、粘贴到 LastPass 页面的框里,点击 Import
按钮导入即可。
这样操作之后,即使自己的电脑和手机不在自己身边,依然可以在任何一台可上网的设备上(电脑、手机、iPod touch、平板电脑、MID……)访问 lastpass.com,然后登录账号,查看自己的密码,登录自己需要的服务了。当然,如果就这样收手,是非常不安全的,在陌生的设备、未知的浏览器上登录如此重要的账户,如果密码被键盘记录了怎么办?于是我们需要物理屏障。
保护好你的救命稻草
LastPass 作为著名的密码保护服务提供商,自然也想到了这一点,于是它也准备了多种“物理屏障”,比如购买 Yubikey。这是一种跟国内网银的 “U 盾”类似的东西,只不过它是通用的,而不像国内网银那样每个银行都不一样。这个 Yubikey 是 Yubico 公司生产的,跟 LastPass 并无关系。在写这篇文章的时候,我也去研究了一下 Yubikey 这个东西,发现它的确是个神器,并且在国内有个代理在卖它,那就是 @yegle 童鞋。详情可以去 他的网店 围观。
减少麻烦
进行到这一步,整套密码管理体系已经基本建立了,但是每次输入未免太麻烦,因此要用好浏览器的密码保存功能。这方面首推 Google Chrome 或者 Chromium 浏览器,直接与 Google 账户绑定,所以要获取已保存的密码必须要有 Google 账户,而 Google 账户是有 Google Authenticator 这个“物理屏障”保护着的。并且,浏览器中同步的内容可以再由一个独立密码保护着,这个密码可以用 KeePass 生成的随机密码……
四、尾声
此文拖延了好久……至少是从密码 2011 年底密码泄露事件时就想写了,但是现在写完的时候,已经是 2012 年了,而且今天正好是农历辛卯年的除夕……所以:
祝大家新春快樂,龍年幸福!
也祝自己的博客不要这样低频率地更新了……此文距离上一篇文章已经有半年多了……实在是太久了。这半年的时间发生了不少事情,计划在下一篇博文中记叙。
转载此文请注明出处:https://wzyboy.im/post/693.html 谢谢合作。