盐渍密码101

Moh*_*mad 18 salt password-hash

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

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

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

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

Zip*_*pit 29

在散列之前将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和密码哈希并重做哈希值以进行比较


Ian*_*Ian 12

salt <- random
hash <- hash(password + salt)
store hash:salt
Run Code Online (Sandbox Code Playgroud)

后来

input password
look up hash:salt
hash(password+salt)
compare with stored hash
Run Code Online (Sandbox Code Playgroud)

得到它了?

  • 腌制的目的是打败字典攻击.您可以强制攻击者重新计算每个唯一盐的所有哈希值,而不是创建哈希密码字典,然后只是在整个地方查找匹配项.这样,密码数据库甚至被允许落入坏人手中,并且没关系,因为攻击者有一个计算上不可行的问题需要解决. (3认同)
  • @Mel:由于salt通常是一堆随机位,因此散列它没有任何意义. (2认同)
  • 散列是不可逆的,你需要知道实际的盐值,所以不,不要哈希它.盐的目的是使彩虹表攻击无害.每个用户需要有所不同才能使生成新的彩虹表的价值降低.完成此任务并不需要保密 - 但如果它是秘密或隐藏的,那么它将使生成表格变得更加困难.例如,真正的盐可能是f(盐),其中f()在你的代码中. (2认同)