1.概述
早期U N I X系统把用户口令保存在一个纯文本可读的“口令文件”中,这可能在系统管理员注意不到的情况下被截取并暴露。它也可能在一次偶然事件中泄露。
从AT&T UNIX版本6开始,Thompson 等决定采用一个不同的方式: U N I X口令采用以美国军方M - 2 0 9密码机为模型的基于旋转的算法来进行编码。这种快速算法被证明对穷尽纯文本搜索有弱点并被AT&T UNIX版本7中出现的更先进的crypt ( )库代替。
现在Unix/Linux将口令以不可读的方式保存在机器中。系统使用名为cryptographic hash的算法将口令转换成文本字符串。这个串即称为散列或者散列值。使用的算法可以有多种,但它们都是不可逆的,也就是说不能从散列值中恢复出原始口令。不同的系统,所使用的密码文件以及加密算法都可能不同。管理、维护好这些密码文件是保证系统安全的首要任务。(说明:本文所有命令均在csh下以root身份运行)
2.加密算法简介
2.1---crypt()简介---key 和 salt
在Unix/Linux下存在多种散列算法。可以通过库函数crypt()调用这些系统支持的算法。crypt()有key和salt两个参数,并返回相应的散列值。salt亦即我们常说的“盐”,它只是简单的字符串,它的长度取决于所使用的算法,不同的散列算法它有不同的取值范围。所以,即使是相同的算法,相同的原始口令,使用不同的salt,也会得到不同的加密口令。salt的目的也就是为了加大口令破解的难度,当我们使用passwd命令来修改密码时,它会随机选择一个salt. s a l t使得使用预编译字典对加密口令进行攻击变得更困难。代替为字典中每个单词做一次单独加密,��击者现在不得不对字典中每个单词的4 0 9 6种排列进行加密和储存。在2 0年前,s a l t是作为本质上的资源障碍引入的,但现在1 2位s a l t不再被认为是一种有效的防御方法。
crypt()可以在C程序中直接调用,甚至可以用perl直接调用,(详细信息请man 3 crypt),如下例:
%perl -e 'print crypt("mypass","s1"),"\n"'
s1tROevFyi.yQ
%perl -e 'print crypt("mypass","s2"),"\n"'
s2JQ85JElCMeU
以上两例中s1、s2分别为salt 值,可以看到,相同的口令(上例中为mypass)使用不同的salt将得到不同的散列值。 以上两例使用的都是DES算法,加密后的散列值将salt值作为其前缀。
2.2DES算法
由美国政府和IBM研制。所有的Linux版本和几乎所有的Unix系统都支持DES.DES实际上为一个加密算法,但是crypt(3)将之做为散列算法。普通的DES算法容许的原始口令长度为8个字符,多余的口令也接受,但是多余部分会被系统自动摒弃。但有些系统(例如HP-UX)使用DES的多次迭代来解决此问题,这样就可以使用任意长度的密码。但是使用DES加密后的口令为13个字符长。
2.3MD5算法
它是真正的散列算法。允许无限长的口令。它使用的salt空间也别DES算法大得多,所以两口令相同的可能性更小。它也通过调用crypt(3)函数实现。MD5算法使用的 salt必须以$1$开头,并以$结尾。且salt长度为8个字符。例如要用abcdef为salt 散列mypass,那么如下:
%perl -e 'print crypt("mypass","\$1\$abcdef\$"),"\n"'
$1$abcdef$nRHvewzGzJoYskdQAIEQr
注:上例中的"\n"均为转义字符。salt值为$1$abcdef$,原始密码为mypass,散列值为:$1$abcdef$nRHvewzGzJoYskdQAIEQr,MD5算法得到的散列值为31个字符长,并且都以$1$开头。
2.4其他算法:
BSDI风格的DES和Blowfish使用也比较广泛,本文将在后面会有讨论。
2.5 BSD使用的加密机制:
各种D E S很长一段时间内一直是U N I X口令加密的主要算法,但还有其他算法可以代替D E S。现代B S D系统提供了一些其他算法的应用范例。缺省情况下, FreeBSD默认使用MD5加密机制,因为MD5没有出口限制,同时也更安全于DES。DES仍然可用,只不过DES存在的目的仅仅是为了和其他 UNIX系统所用的密码的向后兼容性。并且使用DES的系统也能鉴别出MD5,因为MD5所用的Hash也在DES中被使用。
O p e n B S D走得更远。其开发小组在加拿大,这样就不受美国的出口限制。O p e n B S D可以被配置成使用传统的UNIX crypt () 、比如“扩充加密”、M D 5或B l o w f i s h。M D 5由Ronald L.Rivest开发,它在RFC 1321中描述。F r e e B S D和O p e n B S D中基于M D 5的crypt ( ) 产生的口令条目包含版本号、s a l t和哈希口令,彼此之间用“ $”符号分隔。一个M D 5口令看起来如下:
$ 1 $ c a e i H Q w X $ h s K q O j r F R R N 6 K 3 2 O W K C B f 1
这里“$ 1”指明M D 5,“c a e i H Q w X”是s a l t。
B l o w f i s h由Bruce Schneier在1 9 9 3年开发,是D E S的一个快速、压缩、简单且免费的替代品]。虽然S c h n e i e r指出B l o w f i s h不适合产生单向哈希,但O p e n B S D就为这个目的使用它。B l o w f i s h版的crypt ( )使用1 2 8位s a l t,足够使最坚定的破坏者泄气。用所有可能的s a l t值进行预编译的字典将十分昂贵。其最大口令长度为7 2个字符。B l o w f i s h算法是一个由p i的十六进制数字组成的固定字符串进行初始化的。初始化的B l o w f i s h状态由s a l t和口令进行扩展,该过程重复一定的次数(该数值也被编入口令串中)。最后的B l o w f i s h口令条目是使用B l o w f i s h状态对字符串“ O r p h e a n B e h o l d e r S c r y D o u b t”加密6 4次而得到的。
加密的口令条目包含B l o w f i s h版本号、算法重复次数以及s a l t和哈希口令的连结—每个之间由“ $”字符隔开。一个编码“ 8”将声明2 5 6次循环。一个有效的B l o w f i s h口令看起来如下:
$2a$12$eIAq8PR8sIUnJlHaohxX209x9O1m2vk97LJ5dsXdmB.eXF42qjchC
在这个例子中,初始的扩展进行4 0 9 6次。给出了很大的重复次数和长的口令, B l o w f i s h加密的口令比其他基于传统D E S机制加密的口令更难被攻击。给出由这些算法改进所提供的额外安全措施后,它被应用在其他U N I X系统中只是一个时间问题了。
2.6----如何得知你的系���使用的加密算法
方法一:可以通过查看 libcrypt[._*]链接到/usr/lib下的哪些库文件来得知你的系统密码所使用的加密算法。如果链接到libcrypt*库,那么使用的为MD5,如果为libdescrypt*,就应该为DES了。具体操作如下:
%cd /usr/lib
%ls -l libcrypt[._]*
lrwxr-xr-x 1 root wheel 11 Jun 9 06:18 /usr/lib/libcrypt.a@ ->
libscrypt.a
lrwxr-xr-x 1 root wheel 12 Jun 9 06:19 /usr/lib/libcrypt.so@ ->
libscrypt.so
lrwxr-xr-x 1 root wheel 14 Jun 9 06:21 /usr/lib/libcrypt.so.2@ ->
libscrypt.so.2
lrwxr-xr-x 1 root wheel 13 Jun 9 06:22 /usr/lib/libcrypt_p.a@ ->
libscrypt_p.a
%
注意:在FreeBSD4.4中,从FreeBSD 4.4开始就完全由login.conf来控制所使用的加密算法,并且默认已经设置为MD5,要改为DES,只须将其中:password_format段的md5替换成des。
附:我们强烈建议用户尽可能的使用MD5库而非DES.所以往往也很有必要将一些安装了DES加密算法的系统的DES库转换成MD5库,操作也很简单,只须先删除libcrypt[._*]链接,然后将它们重新链接到相应到md5库。(即以s代替des):
Links DES MD5
----- --- ---
libcrypt.a libdescrypt.a libscrypt.a
libcrypt.so libdescrypt.so libscrypt.so
libcrypt.so.2 libdescrypt.so.2 libscrypt.so.2
libcrypt_p.a libdescrypt_p.a libscrypt_p.a
方法二:查看/etc/login.conf中的password_format段。其值md5,des,blf分别对应MD5,DES和blowfish.
方法三、查看密码文件/etc/passwd或者/etc/shadow(BSD 下相应为/etc/master.passwd),根据密码特征得知使用的加密算法。例如以$1$开头的为MD5,以$2$开头的为 blowfish.DES没有明显的特征,但它的密码段相对���短,且均为字母,没有$之类的字符,也很容易辨别!