虽然大部分用户还在使用可重用口令技术来保护他们的系统,但随着网络应用的大规模普及,可重用口令技术的缺陷日渐暴露无遗。换句话说,传统的可重用口令技术业已不能胜任当前的应用环境,而本文的目的便是为读者介绍一种更为安全的口令鉴别技术――一次性口令技术。本文不但讨论了一次性口令技术的机制,同时还详细介绍了OPIE在FreeBSD系统下的应用。
可重用口令技术的缺点
随着社会信息化程度的提高,信息作为一种与人们的切身利益息息相关的资产,其安全性正日益受到人们的关注。因此,在我们能够使用信息系统之前,通常需要经过以下两个步骤:鉴别和授权。鉴别是授权的基础,因为如果不能正确的识别用户的身份,正确的授权就无从谈起。利用口令认证用户是最常用的一种鉴别技术,而口令鉴别技术通常又分为两种:历史悠久的可重用口令鉴别技术和后起之秀一次性口令鉴别技术。
也许是可重用口令鉴别技术的历史太悠久的缘故,人们已经对她太熟悉,所以列举起她的缺点来简直如数家珍。这里是其主要的几种缺陷:
?网络窃听 有时候口令需要通过网络传输,但是很多鉴别系统的口令是未经加密的明文,攻击者只要通过窃听网络数据,就很容易获取鉴别所需的用户名和口令。
?重放攻击 有的系统会将鉴别信息进行简单加密后进行传输,这时攻击者虽然无法窃听密码,但他们却可以首先截取加密后的口令然后将其重放,从而利用这种方式进行有效的攻击。
?字典攻击 由于多数用户习惯使用有意义的单词或数字作为密码,某些攻击者会使用字典中的单词来尝试用户的密码。所以大多数系统都建议用户在口令中加入特殊字符,以增加口令的安全性。
?强力攻击 这是一种特殊的字典攻击,它使用字符串的全集作为字典,即穷举所有可能的口令空间。这需要很大的耐心和巨大的工作量以及一点运气。然而,若用户的密码较短,那么它很快就会被穷举出来,因而很多系统都建议用户使用长口令。
?窥探 攻击者利用与被攻击系统接近的机会,安装监视器或亲自窥探合法用户输入口令的过程,以得到口令。对于后者,根本不需要特别的技术或设备,只要眼睛不是近视得太夸张,需要的仅是静悄悄的站在您的身后,就可以轻松实施攻击。
?社交工程 攻击者冒充管理人员发送邮件或打电话给合法用户,比如“我是某某单位的系统管理员,现在需要更新所有用户的密码,请将您原来使用的口令告诉我。”这种情况下,许多经验不足的用户会毫不犹豫地将其口令奉上。
?垃圾搜索 攻击者通过搜索被攻击者的废弃物,得到与攻击系统有关的信息,如果用户将口令写在纸上又随便丢弃,则很容易成为垃圾搜索的攻击对象。有文章报道说,当今的商业间谍流行以清洁工人的身份来搜集情报,一方面清洁工人不太引起人们的注意,同时工作起来特顺手。
虽然可以通过强迫用户经常更换密码和增加密码长度来保证安全,但由于人类天性懒惰的缘故,经常更换难以记忆的密码会让他们感觉很不舒服,这时难保他们不会将口令写到小纸条上并置于键盘之下(若系统管理员看到了会气得在地上打滚)。所以说实施某项安全措施时,必须考虑到来自用户的阻力。
一次性口令技术
仅从字面上理解,一次性口令技术好像要求用户每次使用时都要输入一个新的口令,但事实正相反,用户所使用的仍然是同一个重复使用的口令。要想弄清这是怎么回事,让我们先从一次性口令技术的工作原理谈起。
首先,在用户和远程服务器之间建立一个秘密――相当于传统口令技术当中的“口令”,该秘密在此被称为“通行短语”。同时,它们之间还应具备一种相同的“计算器”,该计算器实际上是某种算法的硬件或软件实现,它的作用是生成一次性口令(见下文)。当用户向服务器发出连接请求时,服务器向用户提出挑战(challenge)。挑战通常是由两部分组成的一个字符串。挑战的一部分是种子值(seed),它是分配给用户的在系统内具有唯一性的一个数值,也就是说,一个种子对应于一个用户,同时它是非保密的;而另一部分是迭代值(iteration),它是服务器临时产生的一个数值,与通行短语和种子值不同的是它总是不断变化的。用户收到挑战后,将种子值,迭代值和通行短语输入到“计算器”中进行计算,并把结果作为回答返回服务器。服务器暂存从用户那里收到回答,因为它也知道用户的通行短语,所以它能计算出用户正确的回答,通过比较就可以核实用户的确切身份。以上过程可用下图表示:
我们可以看出,用户通过网络传给服务器的口令是种子值,迭代值和通行短语在计算器作用下的计算结果,用户本身的通行短语并没有在网上传播。只要计算器足够复杂,就很难从中提取出原始的通行短语,从而有效地抵御了网络窃听攻击。又因为迭代值总是不断变化的,比如每当身份认证成功时,将用户的迭代值自动减1,这使得下一次用户登录时使用鉴别信息于上次不同(一次性口令技术由此得名),从而有效地阻止了重放攻击。总之,与可重用口令技术的单因子(口令)鉴别不同,一次性口令技术是一种多因子(种子值,迭代值和通行短语)鉴别技术,其中引入的不确定因子使得它更为安全。下面介绍FreeBSD操作系统下一次性口令系统的实例――OPIE。
FreeBSD下的OPIE
OPIE的前身是由Bellcore研制的基于一次性口令思想的免费身份认证系统S/KEY。后来,Bellcore在S/KEY的基础上开发了一套商业版本,并将S/KEY注册为商标。此后,来自其他地方的开发者继续在OPIE (One-time Passwords In Everything)的名义下对原来的免费系统进行维护开发。
FreeBSD系统管理员是幸运的,因为该系统自身带有OTP软件,同时配置起来也比较容易FreeBSD4。x以及更低版本下,s/key(注:自此及以下出现的s/key都是指免费版的)和opie都随系统同时安装。S/KEY最初使用DES技术作为散列算法,后因安全问题改用MD4作为其加密算法。OPIE与之不同,它使用比s/key的MD4更为强壮的MD5算法,因此一般认为OPIE更为安全。FreeBSD系统从5。0版开始,将逐步停用s/key而仅支持OPIE。下面开始介绍OPIE的配置。
OTP起步
开始使用opie之前,你必须自己在/etc/opiekeys目录中添加opie数据库。默认时,此数据库为空,这意味着如果运行more命令你只能得到下面的提示符:
BSD#more /etc/opiekeys
/etc/opiekeys: No such file or directory
为添加自己的数据库,可以使用带参数的opiepasswd命令∶
BSD# opiepasswd - c
Adding root:
Only use this method from the console; NEVER from remote。 If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password。
Then run opiepasswd without the -c parameter。
Using MD5 to compute responses。
Enter new secret pass phrase: /*在此输入通行短语*/
注意开始部分的警告,当运行opiepasswd - c命令时,你或者坐在你要登录到其上的机器旁边(控制台),要么经由ssh连接到该机器。否则,你的秘密通行短语和一次性口令将以明文文本的形式通过网络发送――很明显,这是一个严重的的安全隐患。接下来在提示符下故意输入一个字符数较短的通行短语如“ace6nm/”,看一下它有何反应:
Secret pass phrases must be between 10 and 127 characters long。
Enter new secret pass phrase: /*在此输入符合要求的通行短语*/
Again new secret pass phrase: /*再次输入以上通行短语*/
这里我们收到一个警告,因为刚才输入的通行短语太短,按要求通行短语的长度应在10到127个字符之间。此通行短语在概念上于SSH系统中的产生公/私密钥对的通行短语相仿。此通行短语本身并不充当一个口令,而是用来证明我是将root帐户添加到数据库以及有权建立“应答”(或一次性口令)的那个人。从下文可以看到,应答包含六个单词,每个单词由毫无意义的大写字母组成。按照提示输入正确的通行短语之后,屏幕输出如下:
ID root OTP key is 499 gr9306
AUNT CLUE WHOM CASK HERO HOLT
BSD#
此时回到命令提示符,我可以再次使用more命令验证opie数据库∶
BSD# more /etc/opiekeys
root 0499 gr9306
4f0d07ed32197333
Apr 28,2003 18:22:10
注意,在数据库中,存在包含我的用户名root的一个登记项,后面跟着计数器( 499),然后是一个种子值( dh0391),再后面是一个一次性口令(4f0d07ed32197333),最后面是登记项增到数据库的日期与时间。对我们来说重要的是计数器和种子值,因为每次通过一次性口令等录时都要用到它们。
如果需要验证我们的计数器和种子值,可用此命令进行∶
BSD# opieinfo
498 gr9306
opieinfo命令显示下次登录时使用的资料。请注意,下次通过一次性口令登录时的预期应答与“ 498 ”有关,而非关上面more /etc/opiekeys命令中见到的“ 499 ”对应的应答,即4f0d07ed32197333。为得到所预期的应答, 我们需要用到一个OTP计算器,实际上就是opiekey命令。
登录
现在,用下面的命令退出本次会话准备重新登录:
BSD#logout
FreeBSD/i386 (grid.grid.grid) (ttyv0)
login:
此时我们实际上有两种选择:(1)每次登录时使用某终端上的计算器产生一个应答,或者(2)一次产生一列应答,并以此建立一个应答表,直到将表上的应答