我正在尝试用MD5 / SHA结合盐析来加密密码的逻辑。
我理解用户证明文本密码的概念,并在文本密码中附加随机字符串(salt),并通过您想要的任何加密方法对最终字符串进行散列。
这是我失去概念的地方
在我的用户数据库中说,我有用户名和使用随机盐值生成的加密密码
当用户登录系统并输入密码时,如何获取正确的盐来检查密码的有效性?
如果盐是随机生成的,我无法重新计算
我是否必须使用用户名/密码记录存储盐?如果我通过用户名查询数据库中的盐值,那么看起来就会失去腌制的目的。
在验证提供的密码时,如何获得正确的盐?
答案 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用于防止预生成的彩虹表,它不需要保密,只是不可预测。