记得很久以前……也忘了是什么任务,总之需要写一个自动生成 Linux 下的 shadow 文件的程序。程序倒是简单,不过十来行 C 代码,不过有一点让我很奇怪,那就是 Linux 对密码的 hash 处理方式。
当时用的是 Redhat Linux 9 ,它是用 MD5 做 hash,但我弄出来的结果总是不对,仔细一看,Shadow 文件里的 hash 多了一个字段,Linux 的文档里称之为 salt,那就是盐咯……不解。
事实上,不同的 salt 值会导致生成的 hash 值完全不同,但 salt 值是以明文置于 hash 值前面的,也就是说,对于增加解密难度是没有任何帮助的,那么这个 salt 有什么用呢?当时和 canonical 讨论了几句,没有结果,也就算了。
今天不知触动了哪根筋,突然想到了一个可能的原因:一是提高暴力破解的强度;二是防止两个密码相同的用户出现相同的 hash 码。
关于提高暴力破解的强度:如果系统中有1000个用户,那么取得了 shadow 文件的黑客想要破解所有用户的密码,就必须进行1000次词典遍历,无法取巧,无法将词典事先生成一遍 hash 码,就用来直接取得用户的密码,黑客的计算强度因此提高了1000倍。
关于防止两个密码相同的用户出现相同的hash码:这个原理毋庸赘言,只是其动机何在?我想有两点:对于批量统一设置密码的用户,无法从 shadow 文件表面上直接看出哪些用户没有改动过密码,这对系统的安全有一点点好处;对于两个密码恰好相同的用户,不至于引起其中一个的密码泄露,这对系统的安全也有一点点好处。
以意逆志,自谓得之,无所谓对错吧,乱猜而已。

