【问题标题】:Improve password hashing with a random salt使用随机盐改进密码散列
【发布时间】:2012-02-23 20:28:03
【问题描述】:

我正在创建一个网站,我正在尝试决定如何加密用户密码以将其存储在 SQL 数据库中。

我意识到使用简单的 md5(密码)是非常不安全的。我正在考虑使用 sha512(password.salt),并且我一直在研究生成有用盐的最佳方法。 我阅读了许多文章,指出盐应该尽可能随机以将熵添加到哈希中,这看起来是个好主意。但是:

  • 您需要将随机盐与哈希一起存储
  • 鉴于攻击者以某种方式访问​​了您的哈希密码(并试图将哈希反转为纯文本),这意味着他可能转储了您的数据库,然后还访问了您的随机盐

数据库中哈希值旁边看起来很奇怪的值是盐,这不是很明显吗?如果攻击者可以访问盐以及哈希值,那如何更安全?

有人在这方面有专长吗?谢谢!

【问题讨论】:

  • 别忘了,在这一切之后,你仍然需要好的密码。
  • @PeeHaa:攻击者不需要为每个盐值创建一个彩虹表吗?
  • 盐可以防止彩虹表攻击。现在攻击者必须为每个盐创建一个彩虹表,而不是只为所有记录创建一个。
  • 要小心,即使使用盐,您也容易受到暴力攻击(尤其是在廉价云超级计算机可用的情况下)。如果你想做到这一点,最好的选择是use a library
  • "我意识到使用简单的 md5(password) 非常不安全。我正在考虑使用 sha512(password.salt)" 我们将 md5 与 wowza 一起使用,这还不够好吗?

标签: php mysql security hash sha


【解决方案1】:

“允许”攻击者知道盐 - 您的安全性必须设计成即使知道盐仍然是安全的。

盐有什么作用?

Salt 使用预先计算的“彩虹表”帮助防御暴力攻击。
Salt 让攻击者的暴力破解成本更高(在时间/内存方面)。
计算这样的表很昂贵,并且通常仅在它可用于多个攻击/密码时才进行。
如果您对所有密码使用相同的盐,攻击者可以预先计算这样一个表,然后将您的密码强制转换为明文...
只要您为要存储哈希值的每个密码生成一个新的(最好的加密强度)随机盐就没有问题。

如果您想进一步加强安全性
您可以多次计算哈希(哈希哈希等) - 这不会花费您太多,但它会使暴力攻击/计算“彩虹表”更加昂贵......请不要发明自己- 有经过验证的标准方法可以做到这一点,例如参见 http://en.wikipedia.org/wiki/PBKDF2http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

注意:

现在强制使用这种机制,因为“CPU 时间”(可用于彩虹表/蛮力等攻击)越来越广泛使用(例如,请参阅以下事实:亚马逊的云服务是全球最快的超级计算机前 50 名之一,任何人都可以使用相对较少的费用)!

【讨论】:

    【解决方案2】:

    鉴于攻击者以某种方式获取了您的散列密码 (并试图将哈希反转为纯文本),这意味着他 可能转储了您的数据库,然后可以访问您的随机盐 还有

    加盐的全部意义在于打败“彩虹桌”:

    http://en.wikipedia.org/wiki/Rainbow_table

    看看为什么足够长的盐会在“防御彩虹表”部分下击败任何彩虹表

    如何更安全?

    过去它更安全,因为它迫使攻击者尝试在当时非常昂贵的蛮力方法,而不是立即查看预先计算的彩虹表。如果你有一个 64 位的盐,攻击者需要有 2^64 个预先计算的彩虹表而不是一个......换句话说:它使彩虹表无用。

    但是请注意,现代 GPU 每秒可以破解数十亿个密码,这使得攻击者存储巨大的彩虹表几乎毫无意义(而不是存储数十亿个哈希,只需在几秒钟内计算它们)。

    现在您想使用 PBKDF2 或 scrypt 之类的东西来存储“密码”。

    【讨论】:

      【解决方案3】:

      散列、加盐密码的强度取决于以下所有因素:

      • 散列算法的强度
      • 盐的随机性
      • 密码的随机性

      您的系统与上述最弱的系统一样强大。

      【讨论】:

        【解决方案4】:

        以下问题来自姐妹网站Security StackExchange。他们讨论了散列、盐、PBKDF2、bcrypt、scrypt 和其他一些东西。

        * 上也有一些先前的讨论:

        Is BCrypt a good hashing algorithm to use in C#? Where can I find it?

        简单地回答你的问题,盐是一种保护措施,它可以像散列一样在发生泄露时花费很长时间来恢复密码。如果攻击一个密码,salt 不会有任何影响。如果尝试使用预先计算的字典或同时测试多个密码,则为每个条目使用不同的盐将大大增加所需的工作量,并且通常无法生成合适的彩虹表。

        【讨论】:

          【解决方案5】:

          这是一篇关于密码学的好文章:http://www.javacodegeeks.com/2012/02/introduction-to-strong-cryptography-p1.html

          有关盐的讨论,请参阅哈希算法的真实世界使用,场景 1 部分。

          我强烈建议使用http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html 生成盐

          【讨论】:

          • 可能是因为问题是关于 PHP 的,您建议使用 Java 库。
          • 可能是因为您的答案容易受到链接腐烂的影响。您应该在回答中包含文章中与问题相关的确切部分。
          • 啊,当我点击这个时,我以为我正在查看带有 Java 标记的问题。问题本身从未真正提到过 PHP。尽管如此,不赞成可能就足够了。我会为粗鲁或积极无益的答案投反对票,但我想这只是我的风格......