3.2.1 口令

3.2.1 口令

口令是用与特定实体相关联的信息来证明实体所声称的身份确实属于该实体。基于口令的认证方法属于实体知道什么。实体提供一个口令,安全系统检查这个口令的有效性。如果这个口令和这个实体相关联,那么这个实体的身份就被认证通过了。否则,这个实体/口令被拒绝,认证失败。口令保护不允许存储口令的明文,即对f∈F,f:A→C是单向Hash函数。

1.口令攻击

认证系统的组成可归纳为以下5个部分:

(1)认证信息集合A,即实体用于证明其身份的特定信息的集合;

(2)补充信息集合C,即系统存储并用于验证认证信息的信息集合;

(3)补充函数集合F,即根据认证信息生成补充信息的函数集合;

(4)认证函数集合L,即用于验证身份的函数集合;

(5)选择函数集合S,即使得一个实体可以创建或修改认证信息和补充信息。

对口令的攻击最常见的就是字典攻击。字典攻击通过重复试验和连续排错的方法来猜测一个口令。常见的字典攻击有两种类型:一是如果补充信息C和补充函数F可以获得,那么对每一个猜测p和每一个f∈F计算f(p),直到计算的结果与保存的同一实体的补充信息C相匹配为止;二是如果L可以获得,那么对每一个猜测p调用所有l∈L,如果返回值为真,则p就是正确的口令。L是用于验证身份的认证函数集合,即对l∈L,l:A×C→{true,false}。

2.对抗口令猜测

对抗口令猜测的目的是最大限度地增加攻击者猜测出正确口令所花费的时间。假设P是攻击者在一段确定的时间内口令猜测成功的概率(以单位时间数来统计),G是一个单位时间内能够测试口令的次数,T是测试过程中所花费的单位时间数,N是可能的口令数,Anderson公式为P≥TG/N。

口令猜测的一个通用情景如下:

公式为P≥TG/N,R是通信信道上每分钟可以发送的字节数,E是登录时需要交互的字符数,S是口令的长度,A是口令字符表中的字符数,M是口令猜测可持续的月数。那么可能的口令数N=AS,每分钟可以猜测的口令数目为G=R/E,测试过程中所经历的时间为T=4.32×104 M,则

P≥4.32×104 M(R/E)/AS

或者

AS≥4.32×104×M×R/(P×E)

例3-1 已知一个字母表包含的字符数为96个,每秒能测试的猜测次数为104次,希望做到在363天内猜测成功的概率是0.3。假设用于猜测口令的时间是连续的,所有的口令被选择的机会是相等的,口令的最小长度必须是多少?

根据以上公式,计算的结果是N≥TG/P=6.31×1011。因此,必须选择一个整数S满足,当S≥6时不等式成立。所以,为了满足期望的要求,口令的长度至少要为6个字符。

这个例子中隐含了若干假设。首先,测试一个口令的时间必须是个常数;其次,所有口令等概率地被选取。

如果实际的补充信息或者补充函数不能公开得到,那么猜测口令的唯一方法就是使用系统提供的、授权用户用于登录系统的认证函数。虽然这听起来很难,但是有些攻击者会耐心等待时机。

与字典式攻击不同,口令猜测攻击是不能防止的,因为认证函数必须公开可用,使合法用户可以访问系统。除了通过验证口令,系统没法区别授权用户与非法用户。

要对抗这种攻击,就必须要求对攻击者而言,认证函数的使用是非常困难的,或者使认证函数以非常规的方式进行交互。通常有4种实现技术。

(1)“后退”技术

最常见的是指数后退技术。当一个用户尝试认证并失败后,指数后退技术就会迫使用户等待一段时间后才可以再次尝试认证。假设x是系统管理员选择的参数,在用户第n次登录失败后,系统会等待xn-1秒才允许重新登录。如果用户第一次登录失败,那么系统等待x0=1秒才重新提示用户输入用户名和认证数据。如果用户再次认证失败,那么系统再等待x1=x秒才提示用户。依此类推,如果用户被认证失败n次之后,那么系统会等待xn-1秒。

(2)断开连接

经过设定次数失败的认证尝试后,连接断开,用户必须重新建立连接。

(3)禁用机制

如果一个账户连续n次登录失败,这个账户就被禁用了,直到安全管理者重新允许其使用。

(4)监禁

先让非认证用户访问系统的有限部分,并欺骗他,使得他相信自己拥有了系统的所有访问权限,然后记录下攻击者的行为。这种技术可用于确定攻击者想做什么,或者仅仅是浪费攻击者的时间。监禁技术的另一种形式是在一个运行系统中植入一些假的数据,当攻击者侵入系统后,他就会获取这些数据。下载这些伪造文件所需的时间足够监控者用来跟踪攻击者。这种技术也称为蜜罐,经常被用于入侵检测系统。

3.口令的生成与管理

口令验证是根据用户知道什么来进行的。口令验证方法已经广泛地应用于日常生活的各个方面,从《阿里巴巴与四十大盗》的开门咒语到军事领域的哨兵口令,以及目前在计算机系统中的注册口令。在这种方法中,人们主要关注的是口令的生成与管理。

目前口令生成主要有两种方法:一种是由口令拥有者自己选择口令;另一种是由计算机自动生成随机的口令。前者的优点是用户很容易记忆,一般不会忘记,缺点是易于猜测;后者的优点是随机性好,难以猜测,缺点是用户记忆困难。用户自己选择的口令大多是用户的姓名、街道名、城市名、汽车牌照、房间号码、手机号码、倒过来拼写的有意义的字母等。对于想要窃取别人口令的人来说,这些都是要优先猜测的目标。

用户可以选择容易记忆的口令,但是要拒绝容易被猜到的口令。容易猜测的口令有以下一些类型,用户应该避免:

(1)基于账号名的口令;

(2)词典里的词;

(3)翻转字典里的单词;

(4)把字典单词的其中一部分或者全部字母大写;

(5)将字典里的词中任意字母替换为控制字符;

(6)对字典里的词进行简单的变换:a→2或者4,e→3,h→4或者$;

(7)对字典里的词进行动词变化或者词形变换;

(8)短于6个字母的口令;

(9)仅包含大写或者小写字母,或者字母和数字,或者字母和标点符号;

(10)像许可证号码的口令;

(11)首字母简略词(如“ATM”“IEEE”“APQP”“ISO”);

(12)过去用过的口令;

(13)字典单词的连接;

(14)在字典单词前面或者后面添加一些数字、标点符号或者空格;

(15)把字典单词中所有的元音字母删除;

(16)把字典单词中的空格删除。

例3-2 串“good”和“yoursystem”是弱口令,因为它们违反了原则(2)和原则(13)。好的口令可以通过若干方法构造出来。强口令至少包含一个数字、一个字母、一个标点符号和一个控制字符。

对口令的管理至关重要,口令在系统中的保存就是一个问题。对于一个采用口令方法认证用户身份的信息系统来说,如果同时有许多用户在其中注册,那么相应地,每个用户都要有一个自己的口令,并且原则上,不同用户的口令是不同的。口令要严格保密,不能被其他用户得到(不管用什么方法)。系统要想对用户的身份进行认证,就必须保存用户的口令,但是口令显然不能以明文的形式存放在系统中,否则口令很容易泄露。如果采用通常的加密方法对存放在系统中的口令进行加密(如DES算法),那么加密密钥的保存就成了一个验证的安全问题,一旦加密密钥泄露出去,就可能把系统中所有的口令都泄露出去。所以,口令在系统中的保存应该满足这样的要求,即利用密文形式的口令恢复出明文形式的口令在计算上是不可能的。口令一旦加了密,就永远不会以明文的形式在任何地方出现。这就是说,要求对口令进行加密的算法是单向的,只能进行加密,解密是不可能的。系统利用这种方法对口令进行验证时,首先将用户输入的口令进行加密运算,将运算结果与系统中保存的该口令的密文进行比较,相等就认为是合法的,不等就认为是非法的。

口令管理的第二个问题是关于口令的传送问题。口令一定要以安全的方式传送,否则就可能泄漏,使之失去意义。用加密的方法解决不了这个问题,因为即使采用加密方法,也必须对接收者的身份进行认证,如果对接收者的身份不加认证的话,就无法保证口令会正确地传送到合法用户手中。而对接收者的身份进行认证是口令要解决的问题,在口令建立起来之前无法对接收者的身份进行认证,也就无法保证口令能够传送到合法的用户手中,所以必须考虑采用其他方法。一种方法是采用寄信的方式,许多银行就是利用这种方法向它们的客户分送PIN的。

当用户进入系统时,若诸如某些与真实网页有相似域名并且版面看起来很像原网页的虚假网页出现,用户终端屏幕上会出现这样的请求“请输入口令”。假如这时用户未能发现域名相差一个字符,就会不假思索地输入他的口令,但这很可能是一个骗局。由于系统没有向用户证明它是真正、正确的系统,所以用户面对的可能是一个专门设计的用于窃取用户口令的冒充者。

在人机通信过程中,另一种根据用户知道什么进行身份认证的方法是:当某用户第一次进入系统时,系统向他提出一系列问题,这些问题看起来与技术问题没有什么联系,如他曾就读的高中全称、他父母的血型、他喜欢的作家名字以及他喜欢的颜色等。不是所有的问题都必须回答,但是要回答足够多的问题。有些系统还允许用户添加他自己定义的一些问题与答案。系统要记住用户的问题与相应的答案,以后当该用户再访问系统时,系统就要向他提出这些问题,只要他能够正确地回答出足够多的问题,系统就认为该用户具有他所声称的合法身份。系统安全性取决于选择的问题多少,以及难易程度。这些问题的选择原则是:对用户来讲比较容易记忆,而对于非法者来说,要想获得足够多的正确答案却很困难。

这种方法的优点是对用户比较友好,用户可以选择他非常熟悉而其他人又不容易获得的正确答案,所以它的安全性是有一定保障的。它的缺点是在系统与用户之间需要交换的认证信息比较多,有些时候觉得不方便或者觉得比较麻烦。另外,这种方法还需要在系统中占据较大的存储空间来存储认证信息,认证时间也相应长一些。它的安全性完全取决于对手对用户的背景知道多少,所以在高度安全的系统中,这种方法仍是不太适用的。

4.口令的时效性

猜测口令需要能够访问补充信息、补充函数或者获得认证函数。当口令被猜测出来后,如果以上三种信息都不变,那么攻击者就可以使用猜测出来的口令访问系统。解决该问题的方法是:如果以上三种信息都不变,要确保当口令被猜测出来后,口令已不再有效。口令的时效性就是要求每隔一段时间,或者经过一些事件后,必须改变口令。

(1)最长口令期限

最长口令期限要求用户按照规定的计划改动口令,通过指定用户在一定时间之后必须改动口令来实现这一点。假设期望猜测到一个口令的时间是30天,如果在不到30天的时间里就改变口令,理论上,这样能够减少攻击者猜测出有效口令的概率。实际上,时效性本身并不能确保安全,因为猜测一个口令的估计时间是个平均值,它均衡了那些容易猜测的口令和那些不容易猜测的口令。如果用户选择的是很容易被猜测出来的口令,对期望猜测的时间估计应该选择最小值,而不是平均值。因此,口令的时效性只有在其他机制一起使用时才能发挥更好的作用。实现口令时效性会涉及很多问题。首先,迫使用户改变口令;其次,需要提供改变口令的通知和一个友好的口令改变方法。

(2)口令历史

当用户需要不断地改变口令时,尽管有严格的要求,但用户可能还是不愿意使用口令。为每个用户记住最后几个口令,口令历史就可以防止口令的重复使用。这种方式提供了一个清单,可以对用户使用的任何更新口令进行检查。记录在清单中先前使用过的口令将被拒绝使用。可以为系统设置记住多少个先前使用过的口令。这种机制存在的问题是:用户很快就改变了n次口令,然后又改变回原来的口令。这样,口令时效性就失去了作用。

(3)最短口令期限

在最短口令期限到期之前,用户不能改动口令。这样可以防止用户多次改动口令,耗尽口令历史并重复使用他们喜欢的口令,阻止口令的快速循环。然而,如果在某段时间内,用户口令泄露了,这种方式会阻碍用户改变口令。如果由用户选择口令,那么提醒用户更改口令非常重要。必须给用户以足够的时间想出一个好的口令,或者必须检测用户选择的口令。

(4)账户更新

在许多机构中,一个大的问题是保持账户的更新。当用户离开某机构时,其账户至少应当被禁用。如果不给IT部门提供任何通知,继续让账户保持有效的话,该账户有可能被用来进行攻击。通过提供账户到期,账户就可以自动失效。在大的环境中,为每个成员这样做可能导致维护困难,因为账户必须定期更新。一个折中的办法是,为所有临时、兼职和联系工作的人员提供到期期限,限制用户对系统的访问是安全中的重要环节。一些系统允许对一天中的某些时间进行限制,还可以对特定账户能使用的工作站进行限制。