1.概述
从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系统中只是一个时间问题了.