【问题标题】:Salting passwords 101盐渍密码101
【发布时间】:2011-04-03 17:31:45
【问题描述】:

有人可以帮我了解加盐的工作原理吗?

到目前为止,我了解以下内容:

  1. 验证密码
  2. 生成随机字符串
  3. 将密码和随机字符串散列并连接它们,然后将它们存储在密码字段中...

我们如何存储盐,或者在用户登录时知道它是什么?我们是否将其存储在自己的领域中?如果我们不这样做,应用程序如何确定盐是什么?如果我们确实存储了它,它不会破坏整个目的吗?

【问题讨论】:

标签: salt password-hash


【解决方案1】:

盐在散列之前与密码结合。将密码和盐清除值连接起来,并对结果字符串进行哈希处理。这保证了即使两个人使用相同的密码,您也会得到不同的哈希值。 (也使得使用彩虹表的字典攻击变得更加困难)。

然后将盐与哈希结果一起以原始/清晰格式存储。然后,当您想要验证密码时,您将再次执行原始过程。将记录中的盐与用户提供的密码相结合,对结果进行散列,比较散列。

您可能已经知道这一点。但重要的是要记住。每次都必须随机生成盐。每个受保护的散列必须不同。很多时候,RNG 用于生成盐。

所以..例如:
用户密码:“我的密码”
随机盐:“abcdefg12345”
结果明文:“mypassword:abcdefg12345”(如何组合它们取决于您。只要您每次都使用相同的组合格式)。
散列生成的明文:“somestandardlengthhashbasedonalgorithm”

现在您将在您的数据库中存储所使用的哈希值和盐值。我已经看到了两种方式:

方法一:
field1 - salt = "abcdefg12345"
field2 - password_hash = "somestandardlengthhashbasedonalgorithm"

方法二:
field1 - password_hash = "abcdefg12345:somestandardlengthhashbasedonalgorithm"

在任何一种情况下,您都必须从数据库中加载盐和密码哈希并重做哈希以进行比较

【讨论】:

    【解决方案2】:
    salt <- random
    hash <- hash(password + salt)
    store hash:salt
    

    稍后

    input password
    look up hash:salt
    hash(password+salt)
    compare with stored hash
    

    知道了吗?

    【讨论】:

    • 加盐的目的是为了打败字典攻击。您无需创建散列密码字典,然后简单地在各处查找匹配项,而是强制攻击者重新计算每个唯一盐的所有散列。这样一来,密码数据库甚至被允许落入坏人之手,这没关系,因为对手有一个计算上不可行的问题要解决。
    • 伊恩,盐也需要散列吗?
    • @Mel:由于盐通常是一堆随机位,散列它没有意义。
    • 散列是不可逆的,你需要知道实际的盐值,所以不,不要散列它。盐的目的是使彩虹表攻击无害。每个用户需要不同,以降低生成新彩虹表的价值。完成此操作不需要保密 - 但如果它是保密的或有点隐藏,那么生成表格会变得更加困难。例如,真正的盐可能是 f(salt),其中 f() 在您的代码中的某处。
    • @Lou Franco:实际上,散列的目的是避免相同的明文散列始终相同(因此具有相同密码的两个用户将具有相同的散列密码,并且攻击者可以预先计算散列常用密码)。彩虹桌的出现要晚得多。
    【解决方案3】:

    我们如何存储盐,或者在用户登录时知道它是什么?我们是否将其存储在自己的领域中?

    是的。

    如果我们确实存储了它,它不会破坏整个目的吗?

    没有。盐的目的不是保密,而只是为了防止攻击者分摊计算世界上所有站点(不是盐)或您站点中的所有用户(所有用户使用单一盐)的彩虹表的成本。

    【讨论】:

      【解决方案4】:

      根据实用密码学(Neils Ferguson 和 Bruce Schneier),您应该使用加盐的、拉伸的散列以获得最大的安全性。

      x[0] := 0
      x[i] := h(x[i-1] || p || s)  for i = 1, ..., r
      K := x[r]
      
      where
         h is the hash (SHA-1, SHA-256, etc.)
         K is the generated hashed password
         p is the plaintext password
         r is the number of rounds
         s is the randomly generated salt
         || is the concatenation operator
      

      盐值是与加密密码一起存储的随机数。它不需要保密。

      拉伸是多次执行哈希的行为,以使攻击者在计算上更难测试密码的许多排列。应选择r,以便在用户计算机上计算大约需要 200-1000 毫秒。随着计算机速度越来越快,r 可能需要增加。

      【讨论】:

        【解决方案5】:

        如果您使用的是众所周知的散列算法,那么某人可能会列出许多已经使用该算法散列的可能密码,并将该列表中的项目与他们想要破解的散列密码进行比较(字典攻击) .
        如果您在散列之前对所有密码“加盐”,那么这些字典将毫无用处,因为它们必须使用您的盐创建。

        【讨论】:

          猜你喜欢
          • 2014-10-31
          • 2011-08-07
          • 2016-07-28
          • 2021-10-02
          • 2011-06-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多