S/KEY 一次性口令认证 ( RFC1760-- 翻译者 smartlinux)
概况 Internet上计算机常常受到的一种攻击是窃听: 通过在网络连接上进行窃听获得合法用户的ID和密码。攻击者会在以后使用获得的ID和密码来获得系统的访问权。 S/KEY一次性口令认证就是用来对抗这种重放攻击的。
使用S/KEY,只有一个口令会在网络上出现。 用户的真正密码任何时候都不会出现在网络上,包括登录过程图、执行其它需要认证的命令(Unix中的su)。因此,窃听攻击就没有效果了。正是由于不需要在任何系统中保存秘密信息(包括保护的主机),安全性得到了提高。
S/KEY保护认证子系统不受外来的被动攻击。它无法阻止窃听者对私有数据的访问, 无法防范拦截并修改数据包的攻击, 无法防范内部攻击。
介绍 S/KEY一次性口令认证系统包括两部分。在客户端上,需要产生合适的一次性口令。在服务器上,服务器需要验证一次性口令并支持用户密钥的安全变换。
S/KEY系统的客户端通过多次执行hash函数来产生一次性口令。每使用一次,执行的次数减1,因此可以得到一个唯一的密钥序列。服务器通过进行一次hash运算并与上次的结果进行碧聊来验证一次性口令。 这种就是是由Leslie Lamport首先提出的。
安全hash函数 一个安全hash函数能够很容易的进行正向运算,但是无法反向运算。S/KEY是基于Ronald Rivest设计的MD4消息摘要算法。在S/KEY认证系统使用后,MD5消息摘要算法也出现了。由于很多客户端已经发布,我们选择继续使用MD4算法。有些地方已经使用基于MD5的系统。显然,客户端和服务器要使用同样的hash函数。
S/KEY系统的口令长度为64位。这个长度相信是足够安全的,而且在需要输入的时候也很方便。
S/KEY系统多次使用安全hash函数运算,得到一个64位的输出。MD4接受一个任意长度的输入,产生128bit的输出。(MD5算法的长度128bit,SHA1算法的输出长度160bit。值得一提的是我国的王小云教授已经找到了MD5的碰撞算法,非常值得自豪。不过有些人错误的成为“破解”)S/KEY安全hash函数包括对64bit的数据使用MD4算法进行计算,并把结果折半并进行异或获得一个64位的输出。
一次性口令的产生 这部分描述S/KEY一次性口令的计算。它包括对所有输入进行组合的预处理步骤,包括使用多次hash函数的产生步骤,包括将64bit一次性口令以可读格式现实的过程。
客户端的密钥可是是任意长度,应该多于8个字符。由于S/KEY需要64bit的输入,因此需要一个预处理的步骤。在这步中,密钥和从服务器端以明文传输过来的种子拼接在一次。这个明文的种子使用户可以在多台计算机上使用同一个密钥,通过更换种子保证密钥的安全。(为了方便解析,种子不包括任何空格,应该由字母和数字组成) 拼接后的结果通过MD4算法,并通过异或算法得到8字节。
下面这段代码使用RFC1320定义的MD4算法并包括了预处理过程:
strcpy(buf,seed); strcat(buf,passwd); MDbegin(&md) MDupdate(&md,(unsigned char *)buf,8*buflen); /* Fold result to 64 bits */ md.buffer[0] ^= md.buffer[2]; md.buffer[1] ^= md.buffer[3]; 通过对预处理结果进行多次安全hash函数的处理得到一系列的一次性口令。也就是说,第一个一次性口令通过对S进行用户指定的N次hash运算得到。下一个一次性口令通过对S进行N-1次hash运算得到。监听一次性口令传输的窃听者无法得到后继的口令(要得到后继的口令相当于对hash函数进行逆向运算)。
密钥的形式 上面的过程得到的一次性口令是64bit。输入64bit是非常困难的,而且很容易错误。 有些S/KEY系统的一次性口令计算机程序将这个口令插入到输入流,另外的允许系统剪切和复制。有一些需要手工输入。S/KEY系统设计的时候就考虑了不影响自动方式而且要方便手工输入。因此,一次性口令被转化为6个短(1-4个字母)英文单词串。每个单词都来自于有2048个单词的字典;每个单词可以编码为11bit,因此所有的一次性
口令都可以被编码。互操作性要求所有的S/KEY系统中服务器和客户端使用相同的字典。标准字典附在后面。
一次性口令的验证 使用S/KEY系统的服务器一个需要的功能就是发起一个S/KEY系统挑战。 这个挑战把当前的S/KEY系统参数(序列号和种子)发送给客户端。非常重要的是S/KEY系统挑战必须是标准格式,这样自动化的客户端才可以识别并提取参数。挑战的格式:
s/key 序列号 种子这三个值用单空格间隔。挑战以空格或者新行结束。
给定参数和密钥,客户端可以计算出一次性口令。然后,它将一次性口令发给服务器进行验证。
服务器有一个文件(Unix系统中是/etc/skeykeys),这个文件包含每个用户最后一次成功登录时的一次性口令,或者是使用keyinit命令(这个命令的名字与实现无关)初始化的第一个一次性口令。要验证一个认证请求,服务器把收到的一次性口令传给安全hash函数进行一次运算。如果结果与上一次保留的一次性口令匹配,那么认证通过并将收到的一次性口令保存下来供以后使用。
由于使用hash函数的次数会逐次减1, 因此过一段时间后用户需要重新初始化无法登录的系统。这个通过使用keyinit命令完成,这个命令可以修改密钥,重复次数,种子。一个常常使用的技巧将种子的尾数增大并重新设置重复次数(通常的范围是500-1000)。
客户端 有好几个程序可以用来计算S/KEY的一次性口令。最基本的计算器是key命令,格式如下:
key [-n count] sequence seed可选项count用来显示多个一次性口令。这在要产生一个一次性口令列表时比较有用。
最自动化的计算器程序时termkey程序,它作为一个终端运行并常驻在PC上。它扫描平湖,找到S/KEY参数,提示输入密码,自动将一次性口令填入键盘缓冲区。
致谢,参考文献以及附录的词典 统统省略,需要的可以到查看。 翻译的比较粗略,如果有错误,请大家指出。 相信不会影响大家的理解。
阅读(4006) | 评论(0) | 转发(0) |