3

我需要为 Bcrypt 生成盐,并且我试图了解我的 PRNG 需要多么随机才能使盐不要太弱以至于使用 Bcrypt 毫无意义。我有五类一般的随机性来源:

  1. Perl 5 附带的 PRNG 使用默认种子播种(这似乎是秒的当前分数、保存当前秒分数的事物的地址、进程的 pid 和 Perl 堆栈的地址指针都与一些素数混合在一起)
  2. Perl 5 附带的 PRNG 与其他种子一起播种
  3. 其他一些基于 Perl 5 的 PRNG,例如Math::Random::Secure
  4. 只读取字节/dev/urandom
  5. 只读取字节/dev/random

在我看来,这段代码将运行的机器已经受到/dev/random了很大的打击(当机器很忙时,/proc/sys/kernel/random/entropy_avail低于 500),否则这将不是问题,我只会使用/dev/random. 也就是说,如果它足够重要,我/dev/random/无论如何都会使用(人们不会经常设置新密码)。

4

4 回答 4

6

Salt仅用于在同一输入上运行多次时使散列函数的输出不同并防止彩虹表攻击。密码强度由函数本身的实现提供。任何合理分布的 RNG 都可以用于盐,不需要真正的熵。

于 2012-06-18T12:45:37.350 回答
3

密码盐不必是随机的,甚至不必是秘密的。重要的是每个密码的盐是唯一的请参阅下面 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。

于 2012-06-18T14:02:41.470 回答
1

我建议使用Math::Random::Secure它,因为它通常会从/dev/urandom.

您可以使用弱随机种子,但这样做是在赌 bcrypt 没有仅在盐“容易”可预测时出现的弱点。很有可能,你很好,但你也偏离了加密最佳实践。

对于密码,我会默认为“以正确的方式进行操作”。

于 2012-06-18T12:46:33.570 回答
1

我终于找到了描述 Bcrypt 的原始文章,并找到了这句话:

任何 bcrypt 实现的一个重要要求是它利用完整的 128 位盐空间。OpenBSD 从一个 arcfour (arc4random(3)) 密钥流生成 128 位 bcrypt salt,并使用内核从设备时序收集的随机数据播种。

基于此,我将使用/dev/random初始化一个高质量的 PRNG 来生成种子。

使用高质量 PRNG 背后的原因也可以在文章中找到。

于 2012-06-19T12:54:10.927 回答