作为Internet上最流行的服务器操作系统,U NIX安全性倍受关注。Unixd的安全性主要靠口令实现,因此,Unix口令加密算法几度改进,现在普遍采用DES算法对口令文件进行25次加密,而对每次DES加密产生的结果,都要用2的56次方次查找与匹配才能进行一次遍历,要破解这样的口令,其工作量是巨大的,所以从理论上说这种口令是相当安全的。然而不幸的是我们仍然不时听道口令被攻破的消息。这些口令是如何被攻破的,我们又怎样才能保证口令的安全呢。下面将对这一问题进行探讨。
Unix 口令文件的格式及安全机制
Unix的口令文件passwd是一个加密后的文本文件,储存在/etc目录下。该文件用于用户登录时校验用户的口令,仅对root权限可写。口令文件中每行代表一个用户条目,格式为:LOGNAME : PASSWord : UID : GID : USERINFO : HOME : SHELL。每行的头两项是登录名和加密后的口令,UID和GID是用户的ID号和用户所在组的ID号,USERINFO是系统管理员写入的有关该用户的信息,HOME是一个路径名,是分配给用户的主目录,SHELL是用户登录后将执行的shell(若为空格则缺省为/bin/sh)。目前多数Unix系统中,口令文件都做了Shadow变换,即把/etc/passwd文件中的口令域分离出来,单独存在/etc/shadow文件中,并加强对shadow的保护,以增强口令安全。
Unix系统使用一个单向函数crypt()来加密用户的口令。Crypt()是基于DES的加密算法,它将用户输入的口令作为密钥,加密一个64bit的0/1串,加密的结果又使用用户的口令再次加密;重复该过程,一共进行25次。最后的输出为一个13byte的字符串,存放在/etc/passwd的PASSWord域。单向函数crypt()从数学原理上保证了从加密的密文得到加密前的明文是不可能的或是非常困难的。当用户登录时,系统并不是去解密已加密的口令,而是将输入的口令明文字符串传给加密函数,将加密函数的输出与/etc/passwd文件中该用户条目的PASSWord域进行比较,若匹配成功,则允许用户登录系统。
口令破解原理
口令破解通常有蛮力攻击和字典攻击两种方式。Unix中一共有 [0x00~0xff] 共128个字符,其中 95个字符(10(数字)+33(标点符号)+26*2(大小写字母) )可作为口令的字符。假设m为可能使用的字符集的大小,n为口令的长度,则可生成的口令数为m的n次幂,随着字符集的扩大与口令长度的增加,口令攻击尝试次数将迅速增加。 如口令长度为6,取字母和数字组合,可能性是62 的6次幂56,800,235,584。但如果5个字母是一个常用汉字的拼音或英文单词,估算一下常用词约为10000条, 从10000个常用词中取一个词与任意一个数字字符组合成口令,则仅10000* 10 = 100000 (10万种可能)。在口令的设置过程中,还有许多个人因素在起作用,为使自己的口令容易记忆,许多人往往将个人的姓名、生日、电话号码、街道的号码等作为口令,这样便为口令的破解留下了方便之门。 贝尔实验室的计算机安全专家R.Morris和K.Thompson提出了这样一种攻击的可能性:可以根据用户的信息建立一个他可能使用的口令的字典。比如:他父亲的名字、女朋友的生日或名字,街道的名字等等。然后对这个字典进行加密,每次拿出一个经过加密计算的条目与口令文件比较,若一致,口令就被猜到了。 也许有人认为口令毫无规律可言,字典中不会有,计算机是破译不了的,那就大错特错了。有很多专门生成字典的程序,比如:Dictmake、txt2dict、xkey等等。以dictmake为例:启动程序后,计算机会要求输入最小口令长度、最大口令长度、口令包含的小写字符、大写字符、数字、有没有空格、含不含标点符号和特殊字符等一系列的问题。当回答完了计算机提出的问题后,计算机就会按照给定的条件自动将所有的组合方式列出来并存到文件中,而这个文件就是资料字典。目前,在因特网上,有一些数据字典可以下载,包含的条目从1万到几十万条。数据字典一般囊括了常用的单词。 攻击者一旦通过某种途径获得了passwd文件,破译过程便只需一个简单的C程序即可完成。Unix中有一组子程序可对/etc/passwd文件进行方便的存取。getpwuid()函数可从/etc/passwd文件中获取指定的UID的入口项。getpwnam()函数可在/etc/passwd文件中获取指定的登录名入口项。这两个子程序返回一指向passwd结构的指针,该结构定义在/usr/include/pwd.h中,定义如下: