密码哈希和盐渍

时间:2014-12-18 16:18:47

标签: hash salt

我正在尝试用MD5 / SHA结合盐析来加密密码的逻辑。

我理解用户证明文本密码的概念,并在文本密码中附加随机字符串(salt),并通过您想要的任何加密方法对最终字符串进行散列。

这是我失去概念的地方

在我的用户数据库中说,我有用户名和使用随机盐值生成的加密密码

当用户登录系统并输入密码时,如何获取正确的盐来检查密码的有效性?

如果盐是随机生成的,我无法重新计算

我是否必须使用用户名/密码记录存储盐?如果我通过用户名查询数据库中的盐值,那么看起来就会失去腌制的目的。

在验证提供的密码时,如何获得正确的盐?

3 个答案:

答案 0 :(得分:1)

来自维基百科,Salt (cryptography)

  

为每个密码随机生成一个新的salt。在典型设置中,salt和密码被连接并使用加密哈希函数进行处理,结果输出(但不是原始密码)与salt一起存储在数据库中

使用哈希值存储它,以防止字典攻击。

答案 1 :(得分:1)

salt存储在数据库中,因此您可以使用相同的salt来验证密码。今天的库通常会在生成的哈希值中包含salt(PHP函数password_hash()的结果):

$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |                     |
 |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |
 |  |  salt = nOUIs5kJ7naTuTFkBy1veu (22 characters)
 |  |
 |  cost-factor = 10 = 2^10 iterations
 |
 hash-algorithm = 2y = BCrypt

这个60个字符的字符串可以存储在数据库的单个字段中。验证函数可以从此字符串中提取salt。盐不是秘密,即使它已知,它也能达到目的。

请注意,MD5和SHA- *等算法适合哈希密码,因为它们太快了。而是使用具有成本因子的算法,如BCrypt或PBKDF2。有关更多信息,您可以查看我的tutorial关于安全存储密码的信息。

答案 2 :(得分:0)

是的,你储存盐。 Salting用于防止预生成的彩虹表,它不需要保密,只是不可预测。