盐对Bcrypt的随机性有多重要?

时间:2012-06-18 12:32:51

标签: perl bcrypt

我需要为Bcrypt生成盐,我试图了解我的PRNG需要的随机性,因为盐不会太弱以至于使Bcrypt无意义。我有五种一般的随机来源:

  1. Perl 5附带的PRNG用默认种子播种(这似乎是第二个的当前分数,持有当前秒的分数的东西的地址,过程的pid,以及地址Perl堆栈指针全部与一些素数混合在一起)
  2. Perl 5附带的PRNG播种其他种子
  3. 其他一些基于Perl 5的PRNG,如Math::Random::Secure
  4. 只需从/dev/urandom
  5. 读取字节
  6. 只需从/dev/random
  7. 读取字节

    我认为这个代码运行的机器已经很难打/dev/random(当机器忙时,/proc/sys/kernel/random/entropy_avail低于500),否则这将是一个非问题,我会只需使用/dev/random。也就是说,如果它足够重要,我将使用/dev/random/(人们不会经常设置新的密码)。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

密码盐不一定是随机的,甚至不是秘密的。重要的是每个密码的盐都是唯一的。请参阅第二版Schneier Applied Cryptography中第52和53页的摘录。

随机选择位是一种生成具有一些小碰撞概率的独特盐的实现。这通常被认为是一个不错的交易,因为这样的盐生成器不需要提升权限来读取系统中当前使用的盐值列表。

使用bcrypt,salt以明文形式存储,以便以后进行身份验证。这意味着系统的整个散列密码列表可能会受到影响。那时,随机盐没有帮助。请注意下面摘录的最后一段中的妙语。 Salt混淆了字典攻击,但仅限于一点。

保守的方法是使用加密安全的RNG来选择“以防万一”的盐值,但取决于你想要保护的价值,以及对手愿意投入多少努力,可能有点矫枉过正。

  

字典攻击和盐

     

使用单向函数加密的密码文件仍然容易受到攻击。在业余时间,Mallory编制了1,000,000个最常用密码的列表。他使用单向函数操作所有1,000,000个并存储结果。如果每个密码大约是8个字节,则生成的文件不会超过8兆字节;它适合几张软盘。现在,Mallory窃取了一个加密的密码文件。他将该文件与其加密的可能密码文件进行比较,并查看匹配的内容。

     

这是字典攻击,并且出人意料地成功(参见第8.1节[“生成密钥”])。 Salt 是一种让它更难的方法。 Salt是一个随机字符串,在通过单向函数操作之前与密码连接在一起。然后,salt值和单向函数的结果都存储在主机上的数据库中。如果可能的salt值足够大,这实际上消除了对常用密码的字典攻击,因为Mallory必须为每个可能的salt值生成单向散列。这是对初始化向量的简单尝试(参见第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, pp.44-63。
   847。 D.V. Klein,“'挫败饼干':对密码安全的调查和启示”, USENIX UNIX安全研讨会论文集,1990年8月,第5-14页。
   848。 D.V.克莱因,个人通讯,1994年。

答案 2 :(得分:1)

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

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

对于密码,我会默认“以正确的方式行事。”

答案 3 :(得分:1)

我终于去了original article describing Bcrypt找到了这句话:

  

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

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

在文章中使用高质量PRNG的原因也可以是found