3.2 鉴别

    当Alice登录进入计算机(或自动柜员机、电话银行系统、或其它的终端类型)时,计算机怎么知道她是谁呢?计算机怎么知道她不是其他人伪造Alice的身份呢?传统的办法是用通行字来解决这个问题的。Alice先输入她的通行字,然后计算机确认它是正确的。Alice和计算机两者都知道这个秘密通行字,当Alice每次登录时,计算机都要求Alice输入通行字。

    利用单向函数的鉴别

    Roger Needham和Mike Guy意识到计算机没有必要知道通行字。计算机只需有能力区别有效通行字和无效通行字就成。这种办法很容易用单向函数来实现[1599,526,1274,1121]。计算机存储通行字的单向函数而不是存储通行字。

        (1)Alice将她的通行字传送给计算机。

        (2)计算机完成通行字的单向函数计算。

        (3)计算机把单向函数的运算结果和它以前存储的值进行比较。

    由于计算机不再存储每人的有效通行字表,所以某些人侵入计算机,并偷取通行字的威胁就减少了。由通行字的单向函数生成通行字表是没用的,因为单向函数不可能逆向恢复出通行字。

    字典式攻击和Salt

    用单向函数加密的通行字文件还是脆弱的。Mallory在他的业余时间编制1,000,000个最常用的通行字表,他用单向函数对所有1,000,000个通行字进行运算,并将结果存储起来。如果每个通行字大约是8个字节,运算结果的文件不会超过8M字节,几张软盘就能存下。现在Mallory偷出加密的通行字文件。把加密的通行字和已加密的可能通行字文件进行比较,再观察哪个能匹配。

    这就是字典式攻击,它的成功率令人吃惊(参看8.1节)。Salt是使这种攻击更困难的一种方法。

    Salt是一随机字符串,它与通行字连接在一起,再用单向函数对其运算。然后将Salt值和单向函数运算的结果存入主机数据库中。如果可能的Salt值的数目足够大的话,它实际上就消除了对常用通行字采用的字典式攻击,因为Mallory不得不产生每个可能的Salt值的单向hash值。这是初始化矢量的简单尝试(参看9.3节)。

    这儿的关键是确信当Mallory试图破译其他人的通行字时,他不得不每次试验字典里的每个通行字的加密,而不是只对可能的通行字进行大量的预先计算。

    许多Salt是必需的。大多数Unix系统仅使用12比特的Salt。即使那样,Daniel Klein开发了一个猜测通行字的程序,在大约一星期里,经常能破译出一个给定的系统中的40%的通行字[847,848](见8.1节)。David Feldmeier和Philip Karn编辑了大约732,000个常用的通行字表,表中的通行字都和4096个可能的Salt值中的每个值都有联系。采用这张表,他们估计在一给定系统中,大约能够破译出30%的通行字[561]。

    Salt不是万灵药,增加Salt的比特数不能解决所有问题。Salt只防止对通行字文件采用的一般的字典式攻击,不能防止对单个通行字的一致攻击。在多个机器上有相同的通行字的人使人难以理解,因为这样做并不比拙劣选用的通行字更好。

    SKEY

    SKEY是一种鉴别程序,它依赖于单向函数的安全性。这很容易理解。

    为了设置系统,Alice输入随机数R,计算机计算f(R)、f(f(R))、f(f(f(R)))等等大约100次。调用x1 ,x2 ,x3 ,。。。,x100这些数。计算机打印出这些数的列表,Alice把这些数放入口袋妥善保管,计算机也顺利地在登录数据库中Alice的名字后面存储x101的值。

    当Alice第一次登录时,她输入她的名字和x100,计算机计算f(x100),并把它和x101比较,如果它们匹配,那么证明Alice身份是真的。然后,计算机用x101代替数据库中的x100。Alice将从她的列表中取消x100

    Alice每次登录时,都输入她的列表中未取消的最后的数xI,计算机计算f(xI),并和存储在它的数据库中的xI+1比较。因为每个数只被用一次,并且这个函数是单向的,所以Eve不可能得到任何有用的信息。同样的,数据库对攻击者也毫无用处。当然,当Alice用完了她的列表上面的数后,她必须重新初始化系统。