使用bcrypt时,盐值以明文形式存储以备后续的身份验证尝试。这意味着您系统中所有哈希密码的列表都可能会被泄露。此时,随机盐值无济于事。请注意下面摘录的最后一段话的要点:盐值可以使字典攻击变得困难,但仅限于某个程度。
字典攻击和盐
使用单向函数加密的密码文件仍然是有漏洞的。Mallory在空闲时间内编制了一个包含1,000,000个最常见密码的列表。他对这100万个密码都进行了单向函数操作并存储了结果。如果每个密码大约8字节,那么生成的文件将不超过8兆字节;它可以放在几张软盘上。现在,Mallory窃取了一个加密密码文件。他将该文件与他的可能加密密码文件进行比较,并查看匹配项。
这就是一种字典攻击,而且成功率惊人(参见第8.1节“生成密钥”)。盐是一种使攻击变得更困难的方法。盐是一个随机字符串,在进行单向函数操作之前与密码连接在一起。然后,盐值和单向函数的结果都存储在主机上的数据库中。如果可能的盐值数量足够大,则这几乎消除了对常用密码的字典攻击,因为Mallory必须为每个可能的盐值生成单向哈希。这是一个简单的初始化向量尝试(请参见第9.3节“密码块链模式”)。
关键在于确保每次试图破解另一个人的密码时,Mallory必须对他字典中的每个密码进行一次试验性加密,而不是只进行一次所有可能密码的大量预计算。
需要很多盐。大多数UNIX系统只使用12位盐。即使如此,Daniel Klein开发的密码猜测程序通常可以在一周内破解给定主机系统上40%的密码[847,848](请参见第8.1节)。David Feldmeier和Philip Karn编制了一个包含约732,000个常见密码和4096个可能盐值的列表。他们估计,在任何给定主机上,30%的密码可以用这个列表破解[561]。
盐不是万能药;增加盐位数并不能解决所有问题。盐只能防止对密码文件进行一般字典攻击,而不能防止对单个密码进行有计划的攻击。它保护那些在多台设备上使用相同密码的人,但它并不能让选择不当的密码变得更好。
561. D.C. Feldmeier and P.R. Karn, “UNIX Password Security—Ten Years Later,” Advances in Cryptology—CRYPTO ’89 Proceedings, Springer-Verlag, 1990, pp. 44–63.
847. D.V. Klein, “ ‘Foiling the Cracker’: A Survey of, and Implications to, Password Security,” Proceedings of the USENIX UNIX Security Workshop, Aug 1990, pp. 5–14.
848. D.V. Klein, personal communication, 1994.