密码散列和腌制

我试图围绕用MD5 / SHA和salting加密密码的逻辑来解决问题。

我理解用户提供文本密码的概念,并向文本密码附加随机字符串(salt),并通过所需的任何加密方法对最终字符串进行散列处理。

这是我失去理念的地方

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

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

如果盐是随机生成的,我不能重新计算它

我是否必须使用用户名/密码记录存储salt? 如果我通过用户名查询数据库中的盐值,那么似乎就会失去进行盐析的目的。

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


从维基百科,盐(密码学)

为每个密码随机生成一个新盐。 在一个典型的设置中,salt和密码被连接在一起并使用密码散列函数进行处理,并且结果输出(但不是原始密码)与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个字符的字符串可以存储在数据库中的单个字段中。 验证功能可以从这个字符串中提取盐。 盐不是秘密,它即使已知它也能达到目的。

请注意,像MD5和SHA- *这样的算法适合散列密码,因为它们速度太快。 而应使用具有BCrypt或PBKDF2等成本因子的算法。 欲了解更多信息,你可以看看我的教程关于安全存储密码。


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

链接地址: http://www.djcxy.com/p/21553.html

上一篇: Password hashing and salting

下一篇: How can bcrypt have built