盐渍密码101

时间:2010-08-25 13:15:21

标签: salt password-hash

有人可以帮我理解腌制的效果吗?

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

  1. 验证密码
  2. 生成随机字符串
  3. 哈希密码和随机字符串并连接它们,然后将它们存储在密码字段中......
  4. 我们如何存储盐,或者在用户登录时知道它是什么?我们将它存放在自己的领域吗?如果我们不这样做,应用程序如何确定盐是什么?如果我们存储它,它不会打败整个目的吗?

5 个答案:

答案 0 :(得分:27)

在散列之前将Salt与密码结合使用。将密码和salt clear值连接起来,并对生成的字符串进行哈希处理。这保证即使两个人拥有相同的密码,你也会得到不同的哈希值。 (也使用彩虹表格将攻击称为字典攻击更加困难)。

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

你可能已经知道了。但重要的是要记住。每次必须随机生成盐。每个受保护的哈希值必须不同。通常RNG用于生成盐。

所以..例如:
用户密码:“mypassword”
随机盐:“abcdefg12345”
结果 - 明文:“mypassword:abcdefg12345”(你如何组合它们取决于你。只要你每次使用相同的组合格式)。
哈希得到的明文:“somestandardlengthhashbasedonalgorithm”

现在,在您的数据库中,您将存储使用的哈希值和salt。我见过两种方式:

方法1:
field1 - salt =“abcdefg12345”
field2 - password_hash =“somestandardlengthhashbasedonalgorithm”

方法2:
field1 - password_hash =“abcdefg12345:somestandardlengthhashbasedonalgorithm”

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

答案 1 :(得分:12)

salt <- random
hash <- hash(password + salt)
store hash:salt

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

知道了吗?

答案 2 :(得分:3)

  

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

  

如果我们存储它,它是否会破坏整个目的?

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

答案 3 :(得分:2)

根据 Practical Cryptography (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

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

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

答案 4 :(得分:1)

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