CSDN的密码泄漏事件被爆出之后,在Twitter和Weibo上引起了广泛的反响,很多人质疑国内网站的安全管理工作,竟然敢直接用明文保存密码。有一点常识的Web应用开发人员都应该知道直接在数据库里明文形式的密码是相当不安全的。但是为什么还有那么多人仍然这样做呢?他们出于什么目的呢?引人深思呀。

一个网站到底应该怎么保存用户的密码才安全呢?又怎么应该设计登录流程呢? 酷壳上有两篇文章介绍的不错:你会做Web上的用户登录功能吗? 和 Web开发中需要了解的东西

青蛙除了大学的时候搞的那个神马选课系统,基本就没有做过Web应用,就从一个Web用户的角度唠叨几句算了。

首先,是我们到底需要多少个密码? 只有一个显然不行,如果使用这个密码的网站有一个不靠谱,把用户密码给泄漏了(被黑了也好,被无良网站卖了也好,当然在天朝还有另外一种可能:被政府收缴),所有的网站都必须重设密码。那每个网站都设置一个密码呢,现在是个网站都要登录,谁能记得住那么多密码呀。

为了防止密码忘掉,大体上有两种思路:

  • 密码管理器 这种方法比较简单,实际就是保存一个密码。本因为浏览器就内置了记住密码的功能,把用户从繁重的记忆密码的任务中解脱出来。但是浏览器的密码记忆方式功能单一,而且跟浏览器绑定,换一个浏览器就完蛋了。还有系统自带的密码管理工具,例如KDE的KWallet之类的都会有这种问题,跟某个环境绑定,移动性不高。青蛙目前也没有好的实践经验,可以想到的方法就是加密KWallet之后放在Dropbox上,这样多台电脑之间的密码同步可以解决,但是仍然没有解决跨平台的问题。可能这个问题需要借助移动设备来完成,例如Android上的密码管理应用。

  • 基础密码+网站特征的组合规则 密码管理器的实际上是有安全隐患的,因为密码都保存在电脑上,攻击者可以获取这些密码文件然后尝试暴力破解(密码管理器仍然需要主密码的)。 所以另外一种被广泛推崇的方法就是一个基础密码加上针对特定网站的特征字串组合。这样可以方便大脑直接记忆。 酷壳也有一篇文章介绍这种方法: 如何管理并设计你的口令,但是青蛙有一些其他的想法。 这篇文章里提供的针对每个网站做变化的方法看似简单实用,实际上有大问题: 很容易被人看出基础密码和变化规则,因为攻击者拿到密码的时候一般都会知道这是个什么网站,网址是神马,然后跟密码一对照, 原来只是加上了前后缀,照此规则,其他网站的密码就完全可以推测出来了。

所以这个变化规则应该有三个要求:容易计算(考虑下人类大脑的计算速度)、不太明显(不容易被看穿把戏)、但是还要足够复杂(增加被猜出来的难度)。

有了这三项要求,寻找一个规则就不太简单了。青蛙在这举个例子:

  • 首先根据顶级域名分类,获得数字A,例如com是1,net是2,cn是3,其他的就是4,分类随你
  • 数出站点字母个数,获得数字B,例如gfrog.net,域名主题有5个字母
  • 取站点的首位字母,获得第三位、第四位密码,例如gfrog.net,首尾字母是g和g
  • 这步可选,为了不让获得密码明文的攻击者一眼看出破绽,把第三步取到的字母做个变换,这个变换可以固定的,例如直接前移后移几个字母,或者直接转换成ASCII码,
  • 然后把上一步取到的两位密码插入到基础密码里的第A个位置和第B个位置上,获得的密码就是这个网站的密码了。

这个方法只是青蛙随便想到的一个例子,不要拿去直接用哦,这种依赖算法的加密规则说出算法就不好玩了。找一种容易使用,算出结果又不太明显的算法来组合你的密码吧。

另外在酷壳的如何管理并设计你的口令这篇文章里也提到了密码分级的问题,看来大家都意识到一套基础密码仍旧不安全,XD

密码分级,青蛙觉得至少要分成5套,重要性依次递减: * 与钱有关:涉及真金白银啊,一定要强密码 * 重要个人信息网站:gmail、SNS网站,MSN等等,这些网站往往都保存着重要的个人信息资料,所以保障帐号安全很重要。 * 国产邮件服务提供商、SNS等等,虽然个人信息同样重要,但是国内网站往往都会屈服于某种无形的压力,你懂得,所以单独列出。当然,在国内网站上提供个人信息同样要注意,完全没有安全性可言。 * 一般网站,一个普通密码足矣 * 怀疑没有完善密码保存流程的网站,对于这种网站最好的处理方法就是不用丫的,如果没法避免,最低安全级的密码处理就好,因为密码难免会暴露在别人眼前。

哦,说了半天基础密码,生成基础密码的方式也有很多的,青蛙推荐一下apg这个包,各大发行版都提供,它可以生成指定长度的一组密码,例如:

> $ apg
Please enter some random data (only first 8 are significant)
(eg. your old password):>
IflicCydrum3 (I-flic-Cy-drum-THREE)
ChagNeg4 (Chag-Neg-FOUR)
geHebreil2 (ge-Hebr-eil-TWO)
luj2TanRysp (luj-TWO-Tan-Rysp)
Ash3Twoij (Ash-THREE-Twoij)
JaHyxlyetag4 (Ja-Hyx-lyet-ag-FOUR)

最后,如果你下载了csdn那一大坨密码文件,这个脚本可以帮你分析各种弱密码的使用频率,结果很欢乐的哦。

(此脚本引用自 waterye@Twitter):

$ awk -F# '{a[$2]++}END{for(i in a){print a[i] ":" i }}' www.csdn.net.sql | sort -rn > a.log

好了,吐槽完成,青蛙也该去整理下密码去了。


Comments

comments powered by Disqus