设计口令那些事

2014-08-07

Security, Password

曾经以网站开发者的视角写过“忘记密码(口令)”功能的设计。这次再从用户角度出发,浅谈一下如何设计好记又安全的口令。

口令的破解

首先,我们来看看什么样的口令是“弱口令”。

弱口令之所以弱,在于它容易被破解。那么我们可以了解一下,那些破解工具是怎么做的:

ARPR

上面是ARPR——一个RAR加密压缩包破解软件。它主要使用两种方式解开口令:

其一,暴力猜测。也就是将数字和字母的组合依次枚举,进行猜测。很自然地,较短的口令会被轻松地枚举出来。在绝大多数的场景下,不多于六个字符的口令都可以通过这种方式破解出来。

其二,套用固定的字典进行猜测。像passwordiloveyou这种常见的口令会被包含在字典里。

别忘了,如果你使用你的生日、手机号、QQ号等作为口令,破解者也有可能将它们找到并且加入字典。一些软件还支持对字典内的值进行变换,例如将iloveyou变成i1oVey0u,并且和暴力猜测配合使用。

弱口令通常是易于破解的,但有时强一些的口令也会面对一些风险。我们知道RAR的口令是作为加密密钥使用的,只要加密算法(如AES)本身没有纰漏,一个足够强的口令就是安全的。不过别忘了,口令还有可能会被hash,或者明文存储。

对于hash,除了枚举和字典以外,还可以使用彩虹表,也就是事先生成的口令到hash值对应表。对于过于常见的、或者有一定漏洞的hash算法,彩虹表破解往往效果突出。例如Windows XP的登陆口令使用的LM Hash,由于采用七字节分组hash,全部的可显示字符只有约2^43种组合,其中字母和数字约2^36种组合,一张表几乎可以全覆盖。

至于明文口令,那又是另一番景象了。CSDN曾经泄露过一份明文口令表,一度搞出了个大新闻(显然我也中枪了)

有人做过统计,CSDN口令表中出现频率最高的口令是1234567891234567811111111,以及谜一般的dearbook

一份典型的口令字典可以覆盖列表的八成以上;虽然注册时有口令长度限制,但列表中极为常见的八个数字的口令仍然在枚举破解、彩虹表可接受的范围内。因此,即使没有CSDN捅的这个篓子,很多人的口令依然处在危险之中。

口令的性价比

我们并非简单地希望将口令设得最安全,而是追求在口令足够安全的同时,记忆难度尽可能低。或者更精确地说,我们希望log(破解口令所需猜测次数)/口令的信息量比值尽可能大,然后通过增加口令的信息量来增加破解口令所需的猜测次数。

如果破解工具是足够理想化的,那么这个比值应该是固定的。幸运的是,破解工具往往不够智能。

破解工具能拥有的“背景知识”是限定在一个范围内的。

例如,考虑到大部分口令系统和破解工具是在英文背景下制作的,yigedaxigua应该是比watermalon更安全的口令,尽管它们都是十个小写字母的组合。假如口令可以是一个大西瓜这样的中文形式,绝大多数字典和彩虹表会对它束手无策。

破解工具能猜测的长度是有限的。

曾经有个笑话,说有个网站注册时要求用户输入“A password with at least 4 characters”,然后有人就输入了:SupermanBatmanIronmanSpiderman。虽然是一个出人意料的歧义导致的结果,但这个口令却是一种有效的尝试(前提是网站允许你输入这么长的口令)。考虑到输入也是一件麻烦事,我们不必用很多单词的组合,只要在一般的口令后加一两个单词或者其它你能轻易背下来的东西,就能大大增强它的安全性。

当然,除了破解工具以外,我们还要考虑到人的因素。上面举的例子对旁窥的防御力稍稍弱了些,可以考虑选取一些对大部分人来说意义不明的东西,比如nnzbwsll(你们慢慢猜=w=),结合程序猿能轻易背下来的65536,得到诸如nnzbwsll65536这种形式的口令。

综合防范

搞定单个口令的安全性之后,我们还需要考虑多个口令之间的关系。如果只是简单地使用同一个口令,只要一处失守就会处处失守。例如CSDN口令事件之后,就有人用脚本在各种网站上试填泄露的用户名和口令,导致CSDN用户大面积中枪。

因此,我们需要一定的策略来防范口令泄露。一个安全的方案下,大致包括以下几组口令:

  1. 用于实体终端的口令,例如银行卡、充值卡、门禁,准备几串六位数字,只在有严格安全保障、难以实施暴力猜测的场合使用它们;

  2. 网上支付,使用单独的口令;

  3. 你常用的(至少是能记住的)那几个大型网站或客户端,使用一个基础口令,并且针对每个网站做一点小改(例如QQ可以用nnzbwsll65536Q);

  4. 本地,使用稍简单些、能防止旁窥的口令;

  5. 那些不重要的网站,使用不会影响到上述口令安全的口令。

对于3和5,你也可以使用自动的口令管理工具,例如LastPass。至于用还是不用,这取决于你对这些工具的信任程度以及口令安全对你而言的重要性。