在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不再被认为是一种有效的防御方法。
各种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口令看起来如下:
传统的Unix中均使用该文件来存放用户密码。该文件以加密的方式保存口令,其中的口令必须通过passwd口令来生成(如果使用NIS,相应的为ypasswd),或者从另一账号中复制过来。 P a s s w d文件中的每个条目看起来如下: n a m e : c o d e d - p a s s w d : U I D : G I D : u s e r - i n f o : h o m e - d i r e c t o r y : s h e l l 7个域中的每一个由冒号隔开。空格是不允许的,除非在u s e r- i n f o域中使用。下面总结了 每个域的含义:
①name—给用户分配的用户名,这不是私有信息。 ② c o d e d - p a s s w d—经过加密的用户口令。如果一个系统管理员需要阻止一个用户登录,则经常用一个星号( : * :)代替。该域通常不手工编辑。用户应该使用p a s s w d命令修改他们的口令。值得注意的一点是许多最近的U N I X 产品依赖“影子口令” — 不在/ e t c / p a s s w d中保存的口令。 ③ UID—用户的唯一标识号。习惯上,小于1 0 0的U I D是为系统帐号保留的。 ④ G I D—用户所属的基本分组。通常它将决定用户创建文件的分组拥有权。在Red Hat L i n u x中,每个用户帐号被缺省赋予一个唯一分组。 ⑤ u s e r- i n f o—习惯上它包括用户的全名。邮件系统和f i n g e r这样的工具习惯使用该域中的信息。该域也被称作G E C O S域。 ⑥ home-directory—该域指明用户的起始目录,它是用户登录进入后的初始工作目录。 ⑦ s h e l l—该域指明用户登录进入后执行的命令解释器所在的路径。有好几种流行的S h e l l,包括Bourne Shell (/bin/sh),C Shell (/bin/csh),Korn Shell (/bin/ksh)和Bash Shell( / b i n / b a s h )。注意可以为用户在该域中赋一个/ b i n / f a l s e值,这将阻止用户登录。
传统上,/ e t c / p a s s w d文件在很大范围内是可读的,因为许多程序需要用它来把U I D转换为用户名。例如,如果不能访问/ e t c / p a s s w d,那么ls -l命令将显示数字U I D而不是用户名。不幸的是,使用口令猜测程序,具有加密口令的可读/ e t c / p a s s w d文件表现出巨大的安全危险。多数近来的U N I X产品支持一个变通方法:影子口令文件。影子口令系统把口令文件分成两部分: / e t c / p a s s w d和影子口令文件。影子口令文件保存加密的口令;/ e t c / p a s s w d中的c o d e d - p a s s w o r d域都被置为“X”或其他替代符号。影子口令文件只能被r o o t或像p a s s w d这样的s e t _ u i d程序在需要合法访问时读取,其他所有非授权用户都被拒绝访问。习惯上,影子口令文件保存在/ e t c / s h a d o w中,尽管有些系统使用可选的路径和文件名。例如B S D系统把加密的口令保存在/ e t c / m a s t e r. p a s s w d。
/etc/shadow剖析 / e t c / s h a d o w文件包含用户名和加密口令以及下面一些域: (1) 上一次修改口令的日期,以从1 9 7 0年1月1日开始的天数表示。 (2) 口令在两次修改间的最小天数。口令在建立后必须更改的天数。 (3)口令更改之前向用户发出警告的天数。 (4)口令终止后帐号被禁用的天数。 (5)自从1 9 7 0年1月1日起帐号被禁用的天数。 (6)保留域。 下面是一个Red Hat Linux系统中/ e t c / s h a d o w文件的例子:
在可选影子口令功能的系统中,用一条相对简单的命令设置并更新影子口令文件:p w c o n v。该命令在影子口令文件不存在的情况下创建一个新的。如果已存在一个影子文件,p w c o n v把/ e t c / p a s s w d中的新用户添加到/ e t c / s h a d o w中,把/ e t c / p a s s w d中没有的用户从影子文件中删去,并把口令从/ e t c / p a s s w d移到影子文件中。在Red Hat Linux中,p w c o n v把新的/ e t c / p a s s w d文件写到一个名为n p a s s w d的文件中,把新影子文件写到n s h a d o w中。这些新文件需要手工进行重命名或拷贝。用户可以用p w u n c o n v命令返回到不使用影子文件的情况下,它把影子文件中的信息合并回传统的口令文件中。
提示:早期的L i n u x不支持影子口令。 注意:在solaris下,必须使用隐蔽口令文件,在Linux下,如果用户安装了shadow软件也可以使用。