只要计算器足够复杂,就很难从中提取出原始的通行短语,从而有效地抵御了网络窃听攻击。又因为迭代值总是不断变化的,比如每当身份认证成功时,将用户的迭代值自动减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)一次产生一列应答,并以此建立一个应答表,直到将表上的应答用完为止。让我们先从第一方案开始∶
login: root
otp-md5 498 gr9306 ext
password:
登录时,您会收到了一个otp挑战,其中包含您的种子值和当前的计数器。如今,opie正在等待我们的应答(或一次性口令),很明显该应答与当前计数器498有关。需要说明的是,在默认的情况下,登录时用户能够决定是否使用otp,也就是说如果您在password:提示符下输入您的可重用口令,您将象往常一样登录。
如果您决定使用otp登录,眼下要做的事便是计算正确的应答。俗话说得好,不管白猫黑猫,只要能逮住老鼠就是好猫;与此相仿,您在哪儿计算应答无关紧要,只要不通过一个非加密网络连接使用计算器就行。因此,您可以使用另一个虚拟终端来产生应答,例如,您能够按alt - f3,在本地登录然后运行计算器;另外,如果您能访问室内另一台计算机,甚至一个运行计算器软件的palm,在那里计算应答也未尝不可。
利用计算器产生正确的应答时,有三样东西必不可少∶(1)当前计数器,(2)您的种子值和(3)您的秘密通行短语。当前计数器和种子在挑战中出现,实际上他们是公开的,但重要的是您的秘密通行短语只有您本人知道;换句话说,一旦某人得到了您的通行短语,他就能够以您的身份计算应答并且登录——很不幸,您的“嘴脸”并没有深深地烙在计算机的脑海里,除非您使用的是更高级的生物鉴别系统。 现在让我们利用种子值和计数器计算所需要的应答,如下∶
bsd# opiekey 498 gr9306
using the md5 algorithm to compute response。
reminder: dont use opiekey from telnet or dial-in sessions。
enter secret pass phrase: /*在此输入秘密通行短语*/
beam gwyn wart molt wad rudy
请注意,在按照提示输入秘密通行短语后,我们得到了与计数器498对应的应答∶beam gwyn wart molt wad rudy。现在,让我们继续进行先前未完成的opie登录∶
login: root
otp-md5 498 gr9306 ext
password: /*注意,这里输入回车键而不是可重用口令*/
otp-md5 498 gr9306 ext
password [echo on]: 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: dont 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
以上便是备您今后十次登录所需的口令列表。您当然可以为它做一份硬拷贝,比如把它打印到一张纸上,然后将其保存到一个安全的地方。在此强烈建议男士们将其放到您的钱包中,因为携伴外出时,可爱的女士们常常为其男伴的钱包而“揪心”:一则怕其随小偷而去,更重要的是“不知这次他有没有把钱带够呀?”。现在让我们把口令表输出到名为secretlist的文件中∶
bsd# opiekey -n 10 497 gr9306 > secretlist
接下来您可以打印了,不过请注意,一旦打印完毕,请立刻将该文件从硬盘上抹去,除非您疯狂到要留十个口令副本在硬盘上的地步。
如果您的计数器小得到了危险的地步,比方说10左右,建议您使用opiepasswd命令重置它。在您连到口令数据库后,可以用带n(数字开关)以及s(种子值开关)而非c开关的opiepasswd命令完成这项工作。比如,您打算将计数器重置为366,同时将您的种子值改为mssp298,假设当前的种子值为7,执行命令时的情形如下∶
bsd# opiepasswd -n 366 -s mssp298
updating root:
you need the response from an otp generator。
old secret pass phrase:
otp-md5 7 gr9306 ext
response: lopt omut sffe erdc jout dxrk
new secret pass phrase:
otp-md5 366 mssp298
response: hdwn as dom mel mcli maln
此时,有一点您可能感到疑惑:既然在login提示符下既可以用可重用口令登录也可以用一次性口令登录,那么在哪些情况下更应当使用后者呢?如果您正在一个安静的地方使用ssh来登录到远程系统的话,您大可不必使用otp,因为ssh将您的全部信息都加密处理,其中包括您的登录口令。可是,如果您需要在某些“热闹”的场所登录并使用系统的话,比如在嘈杂的候车厅里使用您的笔记本电脑的情形,很可能有一双眼睛正在您的背后密切地注视着您的键盘,这时一次性口令便有了用武之地。也就是说,是否选择使用otp取决于当您登录时口令是否受到外部的威胁。当然,如果您愿意也可以修改默认配置,让freebsd系统强迫用户总是使用otp登录,方法是建立一个称作/etc/opieaccess的文件,但是,通常认为此方法有安全漏洞并且系统也在man opieaccess中给出了警告。
七、结束语
对于计算机系统,只有经过授权的合法用户才能访问,而问题的关键在于如何正确的鉴别用户的真实身份。用户鉴别,或称用户认证,就是用户向计算机系统以一种安全的方式提交自己的身份证明,然后由系统确认用户的身份是否属实。本文在说明可重用口令技术的缺陷的基础上,介绍了一种更为安全的口令鉴别技术——一次性口令技术及其机制,最后详细介绍了freebsd系统下的opie的使用方法,希望本文对读者的实际工作有所帮助。