UNIX® 系统上的每个用户都有一个与其帐户关联的口令。很显然, 密码只需要被这个用户和操作系统知道。为了保证口令的私密性, 使用了一种容易加密,却很难解密的被称作 “单向散列” 的方法来处理口令。换言之,我们刚刚说的那句话并不十分确切: 操作系统本身并不 真的 知道您的口令。 它只知道口令 经过加密的形式。 获取口令对应 “明文” 的唯一办法是采用暴力在口令可能的区间内穷举。
不幸的是,当 UNIX 刚刚出现时,安全地加密口令的唯一方法基于DES, 数据加密标准 ( the Data Encryption Standard )。 于是这给那些非美国居民带来了问题, 因为 DES 的源代码在当时不能被出口到美国以外的地方, FreeBSD 必须找到符合美国法律,但又要与其他那些使用 DES 的 UNIX 版本兼容的办法。
解决方案是把加密函数库分割为两个, 于是美国的用户可以安装并使用 DES 函数库, 而国际用户则使用另外一套库提供的一种可以出口的加密算法。 这就是 FreeBSD 为什么使用 MD5 作为它的默认加密算法的原因。 MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。
在 FreeBSD 4.4 之前,libcrypt.a 曾经是 一个指向相应加密算法的符号连接。FreeBSD 4.4 开始,把 libcrypt.a 变成了一个可以配置的密码验证散列库。 现在这个库支持 DES,MD5和Blowfish散列函数。默认情况下,FreeBSD 使用 MD5 来加密口令。
可以很容易地识别 FreeBSD 使用哪种加密方法。 检查 /etc/master.passwd 文件中的加密密码是一种方法。 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 $1$ 字符开始。 以 $2a$ 开始的口令是通过 Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征, 但他们要比 MD5 短, 并且以不包括 $ 在内的 64 个可显示字符来表示, 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。
新口令锁使用的密码格式是由 /etc/login.conf 中的 passwd_format 来控制的, 可供选择的算法包括 des, md5 和 blf。 请参考 login.conf(5) 联机帮助以获得更进一步的详情。