在密码加密中使用随机盐?

时间:2010-10-26 05:59:04

标签: database encryption hash passwords

我已经看过关于这个主题的其他几个主题,但我似乎无法找到一些涉及在密码加密中使用 random salt 的问题的答案。根据我的理解,步骤是这样的:

  1. 为用户生成随机盐。
  2. 将盐添加到密码中。
  3. 使用类似SHA-2的内容来散列结果。
  4. 将salt和哈希密码存储在数据库中。
  5. 检索用户密码和验证登录时,此方法如何工作?一个响应说应该检索用户的盐,附加到他们输入的密码,散列,然后与存储的哈希进行比较,但这不会引起一些问题吗?即:

    • 如何在不影响该用户的情况下检索盐?如果有人想强制使用某个帐户的密码,他们是否能够检索从服务器发回的盐来散列输入的密码,从而消除了添加盐的安全性?
    • 如果我们通过盐检索服务器端来避免以前的问题,那么我们不会在一个点或另一个点发送未加密的用户输入密码(以便以后可以将其附加到检索到的盐)? / LI>

6 个答案:

答案 0 :(得分:4)

盐不应该暴露在服务之外 - 你的本能是正确的,这会暴露盐并引入风险。

客户端和服务器之间的任何通信都应通过SSL连接进行 - 或者至少使用某种加密方式进行交互。

请记住salt的用途:使某人更难以预先计算哈希码,因此在数据库被泄露的情况下能够查找密码。 8位盐使哈希空间大256倍,使预先计算更加困难。盐不是为了确保沟通 - 还有其他解决方案。

答案 1 :(得分:2)

你必须使用随机盐,因为使用它的目的是防止某些类型的攻击,如字典攻击,暴力攻击和彩虹攻击。因此,为每个密码生成随机盐并在用户表中存储哈希密码和盐或附加到用户配置文件是非常重要的。当您想要验证用户密码时,它足以使用存储的盐散列输入的密码并与存储的哈希值进行比较。我不相信@cherouvim的建议,因为他似乎并不关心上述攻击。有关更多信息,我建议Defuse Security

撰写一篇精彩,简单易懂的文章 祝你好运。

答案 2 :(得分:1)

我使用固定盐(对于所有密码),它是在应用程序代码上硬编码的。假设盐不能暴露(例如通过应用程序的UI),这看起来简单而且足够好。

答案 3 :(得分:1)

salt引入的安全性是你获得比普通密码更大和非标准的哈希值。它的算法是否被关闭并不重要,因为它保护存储在数据库中的普通哈希免受彩虹或字典攻击。

它也被建议用递归几次哈希,也许在每次迭代时读取盐,这样蛮力就会花费更长的时间。

编辑:Bevan所说的关于通信的内容:通常使用“一次使用的号码”(NONCE)方案通过不安全的信道传输密码。服务器向客户端提供以前从未使用的随机字符串,他将其附加到普通密码,计算哈希值并发送它。这可以保护您免受窃听攻击。

答案 4 :(得分:1)

不发送可用于登录的未加密值的唯一方法是使用SSL。如果散列被发送到服务器,散列本身可以被嗅探并用于登录。服务器端。

+1 ruslik对盐的评价。它可以防止字典/彩虹攻击。用于平均密码的彩虹表+几个字节的随机二进制数据将是天文数字巨大的。

答案 5 :(得分:0)

散列密码可以防止明显可见的密码,并保护它们防止字典攻击。至于在传输过程中保护密码,我建议使用SSL / TLS。