我们可以看出,用户通过网络传给服务器的口令是种子值,迭代值和通行短语在计算器作用下的计算结果,用户本身的通行短语并没有在网上传播。只要计算器足够复杂,就很难从中提取出原始的通行短语,从而有效地抵御了网络窃听攻击。又因为迭代值总是不断变化的,比如每当身份认证成功时,将用户的迭代值自动减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#
登录时,您会收到了一个OTP挑战,其中包含您的种子值和当前的计数器。如今,opie正在等待我们的应答(或一次性口令),很明显该应答与当前计数器498有关。需要说明的是,在默认的情况下,登录时用户能够决定是否使用OTP,也就是说如果您在Password:提示符下输入您的可重用口令,您将象往常一样登录。
如果您决定使用OTP登录,眼下要做的事便是计算正确的应答。俗话说得好,不管白猫黑猫,只要能逮住老鼠就是好猫;与此相仿,您在哪儿计算应答无关紧要,只要不通过一个非加密网络连接使用计算器就行。因此,您可以使用另一个虚拟终端来产生应答,例如,您能够按Alt - F3,在本地登录然后运行计算器;另外,如果您能访问室内另一台计算机,甚至一个运行计算器软件的Palm,在那里计算应答也未尝不可。
利用计算器产生正确的应答时,有三样东西必不可少∶(1)当前计数器,(2)您的种子值和(3)您的秘密通行短语。当前计数器和种子在挑战中出现,实际上他们是公开的,但重要的是您的秘密通行短语只有您本人知道;换句话说,一旦某人得到了您的通行短语,他就能够以您的身份计算应答并且登录——很不幸,您的“嘴脸”并没有深深地烙在计算机的脑海里,除非您使用的是更高级的生物鉴别系统。
现在让我们利用种子值和计数器计算所需要的应答,如下∶
BSD# opiekey 498 gr9306
Using the MD5 algorithm to compute response。
Reminder: Don't use opiekey from telnet or dial-in sessions。
Enter secret pass phrase: /*在此输入秘密通行短语*/
BEAM GWYN WART MOLT WAD RUDY
这里需要说明的是,不要在Password:提示符后键入您的可重用口令,而是按回车键开启echo,这样就允许您看到所键入的应答。但对可重用口令系统来说,Echo可绝不是个“好玩意”,所以使用可重用口令时它总是被关闭。然而,对一次性口令技术来说,每次登录时的应答都不相同,所以即使有人看着您输入也不要紧,因为下次它就不可用了。另外,与可重用口令不同的是,该应答不区分大小写,所以无论是大写或小写字母的应答,它都会来者不拒。
现在如果您运行opieinfo命令的话,您将看到下一个预期应答与计数器497相关。也就是说,每次使用一次性口令登录后,该计数器将自动减1。现在您可以放心地使用了,但一定注意绝不要让您的计数器减少为0,至于为什么,我想不用我说您也一定猜得到。
建立密钥表
就像有人吃苹果时喜欢现吃现洗,而有人则一次把苹果都洗干净,嘴馋时拿过来就往嘴里送一样,并不是所有人都喜欢上面介绍的方法。现在让我们展示第二方法——一次产生多个应答。为此,在使用计算器时,除了需要参数n外,还需要一个数字作为参数,以便指出想一次计算多少个应答。在这里,假设我们想产生10个应答,当前计数器为497,见下面的命令:
BSD# opiekey -n 10 497 gr9306
Using the MD5 algorithm to compute response。
Reminder: Don't use opiekey from telnet or dial-in sessions。
Enter secret pass phrase:
488: COIN LO DOG GOLF ACTA FULL
489: SOD STUN SINK DRAW LAWN TILT
490: MALT STAY MASH CAR DEBT WAST
491: HOWE DRY WALL TOO BUDD SWIM
492: ROOT SPY BOND JEST HAIL SCAR
493: MEAN ADD NEON CAIN LION LAUD
494: LYLE HOLD HIGH HOME ITEM MEL
495: WICK BALI MAY EGO INK TOOK
496: RENT ARM WARN ARC LICE DOME
497: LEAD JAG MUCH MADE NONE WRIT