有人可以帮我理解腌制的效果吗?
到目前为止,我理解以下内容:
我们如何存储盐,或者在用户登录时知道它是什么?我们将它存放在自己的领域吗?如果我们不这样做,应用程序如何确定盐是什么?如果我们存储它,它不会打败整个目的吗?
答案 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)
如果您使用的是众所周知的散列算法,那么有人可能会使用该算法列出许多已经散列过的密码,并将该列表中的项目与他们想要破解的散列密码进行比较(字典攻击) 。
如果你在对它们进行散列之前“加盐”所有密码,这些字典就没用了,因为它们必须使用你的盐来创建。