Total Pageviews

Friday, 15 April 2016

浅谈密码安全和密码设计

Google UK 前段时间推出了一个 Good to Know 的系列文章,其中一篇 Stay Safe Online - Passwords 讲的是密码安全方面的知识,就内容来说对 Google 官方帮助里的“选择安全密码”有所补充。
两篇文章都是很有必要看一看的,我在这里对这两篇文章提出的原则做一下总结并补充一个设计密码的思路:

密码设计原则

首先不妨从攻击者的角度看问题,将获得他人密码的途径按难易程度从最简单到最难依次列出,也就不难一一找到对策:

猜测

如果你的密码在 The Top 500 Worst Passwords of All Time 里面,那说明你的密码实在是太好猜了……
正如 Google 官方帮助里说,任何简单的词或短语、键盘布局密码、排序式密码、与个人信息相关的密码或者类似的容易被猜到的密码都是不安全的。正确的做法应该是:选择字母、数字或符号的组合,创建与个人信息无关的独特密码。

暴力破解

先来看下面这组数据:
  • 只使用小写字母的 6 位密码:3*108 种可能组合
  • 混合使用大小写字母、数字和符号的 6 位密码:7*1011 种可能组合,比上一种多 2000 倍
  • 只使用小写字母的 10 位密码:1014 种可能组合,比上一种多 200 倍
  • 混合使用大小写字母、数字和符号的 10 位密码:5*1019 种可能组合,比上一种多 400000 倍
可以看到,混合使用大小写字母、数字和符号固然是增加密码复杂度的有效方法,然而增加密码长度才是最根本的解决办法。(这里鄙视一下限制密码长度或者组成字符种类的各种网站,完全是上个世纪的遗留产物,无法理解)

钓鱼套取密码

对于习惯在网上使用同一个通用密码的用户,有一个最简单的方法来套取密码,那就是建立一个网站诱骗用户来注册。另外即使某些网站并非出于不良目的套取密码,由于小站的技术限制,有很大可能会被不法分子利用,从中破解出用户的通用用户名和密码,从而用于登录其他网站。因此正确的应对措施是:
对每个帐户分别使用不同的密码,特别是电子邮件和网上银行等重要帐户。
其中电子邮件尤为重要,在当前网络环境中,大部分找回密码服务都是通过邮件进行的,掌握了一个用户的电子邮件就相当于掌握了他绝大部分的网上账户。

木马

至于如果电脑中了窃取密码的木马怎么办……这就完全不是这篇文章所涵盖的范围了,良好的电脑使用习惯才是最重要的。

密码设计思路

根据上述的几个原则:
  • 选择字母、数字或符号的组合
  • 使用足够长的密码
  • 对每个帐户分别使用不同的密码
网上有流传一种密码设计方法:
  1. 首先选用一个复杂的(由字母、数字和符号组成的密码),例如 “sPo0kyh@ll0w3En”
  2. 然后每当需要在一个网络服务注册时,加上一个独特的域名相关的后缀,例如在 Google 使用 “sPo0kyh@ll0w3En-google” 作为密码,在新浪则使用 “sPo0kyh@ll0w3En-sina”
这种方法完全无异于隔靴搔痒,试想作为一个攻击者,如果拿到了用户的新浪密码是 “blabla-sina”,略有智商都会猜出 google 的密码。
因此一个好的密码设计方案应该满足除满足上述三点以外,还应该满足以下几点:
  • 域名相关,这个没问题,在对不同网站使用不同密码的同时也方便人脑记忆
  • 与域名的关系要隐蔽,上一个方法简直就是藐视攻击者的智商
  • 可以借助工具生成,但是一定不能依赖工具
这里的最后一条稍后再解释。
有了这些原则之后,具体的密码设计方法就可以各自发挥想象力了,举个例子抛砖引玉:
  1. 对一个网站域名,加上一个自定义的后缀,比如 “pinepara”,得到一个字符串
  2. 对字符串每个字符计算其 ASCII 码,连成一个数字字符串
  3. 将这个数字字符串倒序后再按一定规则切分成 ASCII 码,组成最终的密码字符串
最后就是对刚才最后一条原则的解释了:有些算法比如 MD5 等就不大适合用于密码设计,其安全度高则高矣,但是一旦遇到需要在非自己的电脑上或者在移动设备上登录时,可以手算 MD5 的神人固然毫无压力,没有 MD5 工具的就傻眼了。通常情况下,建议把密码设计算法的“可手算性”列为考虑之一。