密码盐不必是随机的,甚至不必是秘密的。重要的是每个密码的盐是唯一的。请参阅下面 Schneier 的应用密码学第二版中第 52 和 53 页的摘录。
随机选择位是一种生成唯一盐的实现,碰撞概率很小。这通常被认为是一种体面的交易,因为这样的盐生成器不需要提升权限来读取系统中当前使用的盐值列表。
使用bcrypt
,salt 以明文形式存储,以供以后的身份验证尝试使用。这意味着您系统的整个散列密码列表可能会受到损害。那时,随机盐无济于事。请注意下面摘录的最后一段中的妙语。Salt混淆了字典攻击,但只是在一定程度上。
保守的方法是使用加密安全的 RNG 来“以防万一”选择盐值,但取决于你试图保护的东西的价值以及对手愿意投入多少努力,这可能是矫枉过正.
字典攻击和盐
使用单向函数加密的密码文件仍然容易受到攻击。在业余时间,Mallory 编制了 1,000,000 个最常用密码的列表。他使用单向函数对所有 1,000,000 个函数进行运算并存储结果。如果每个密码大约 8 字节,则生成的文件将不超过 8 兆字节;它可以装在几张软盘上。现在,马洛里窃取了一个加密的密码文件。他将该文件与他的加密可能密码文件进行比较,并查看匹配的内容。
这是一个字典攻击,而且非常成功(参见第 8.1 节 [“生成密钥”])。盐是一种让它变得更加困难的方法。Salt 是一个随机字符串,它在被单向函数操作之前与密码连接。然后,盐值和单向函数的结果都存储在主机上的数据库中。如果可能的盐值的数量足够大,这实际上消除了针对常用密码的字典攻击,因为 Mallory 必须为每个可能的盐值生成单向哈希。这是对初始化向量的简单尝试(参见第 9.3 节 [“密码块链接模式”])。
这里的重点是确保 Mallory 每次尝试破解另一个人的密码时都必须对其字典中的每个密码进行一次尝试加密,而不是对所有可能的密码进行一次大规模的预计算。
需要大量的盐。大多数 UNIX 系统只使用 12 位盐。尽管如此,Daniel Klein 还是开发了一个密码猜测程序,该程序通常会在一周内破解给定主机系统上 40% 的密码 [847,848](参见第 8.1 节)。David Feldmeier 和 Philip Karn 编制了一份包含约 732,000 个常用密码的列表,这些密码与 4096 个可能的盐值中的每一个连接在一起。他们估计,任何给定主机上 30% 的密码都可以通过此列表破解 [561]。
盐不是灵丹妙药;增加盐位的数量并不能解决所有问题。Salt 只能防止对密码文件的一般字典攻击,而不是防止对单个密码的协同攻击。它可以保护在多台机器上使用相同密码的人,但不会使选择不当的密码变得更好。
561. DC Feldmeier 和 PR Karn,“UNIX 密码安全——十年后” ,密码学进展——CRYPTO '89 论文集,Springer-Verlag,1990 年,第 44-63 页。
847. DV Klein,“'Foiling the Cracker':A Survey of and Implications to, Password Security” ,USENIX UNIX 安全研讨会论文集,1990 年 8 月,第 5-14 页。
848. DV Klein,个人通讯,1994。