我在这个问题中使用Spring安全性,但可能不需要它的知识来回答这个问题。
我试图了解Spring security的blowfish加密类(BCrypt
)如何验证给定的密码。我试着:
BCrypt.gensalt(10);
BCrypt.hashpw(clearText, salt)
它工作得很好。然后,我想将用过的salt存储在数据库中,以便在用户输入密码时能够重用它。
我意识到BCryptPasswordEncoder
在检查密码时不使用salt。相反,它使用哈希密码将密码密码为salt:
public boolean matches(CharSequence rawPassword, String encodedPassword) {
[...]
return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}
所以我尝试了这段代码:
public static void main(String[] args) {
String salt = BCrypt.gensalt(12);
String clearText="test";
String hashed = BCrypt.hashpw(clearText, salt);
String reHashed = BCrypt.hashpw(clearText, hashed);
System.out.println("salt : " + salt);
System.out.println(hashed);
System.out.println(reHashed);
}
输出:
salt : $2a$12$gzUymsNBoW.f1OfkLpb2se
$2a$12$gzUymsNBoW.f1OfkLpb2seFZrniorawujSOp6Qe.PWDIHJvmYSP6y
$2a$12$gzUymsNBoW.f1OfkLpb2seFZrniorawujSOp6Qe.PWDIHJvmYSP6y
这似乎证实了:
good password => hashed = hash(clearPassword, hashed)
我理解错了吗?这是否意味着盐对密码检查毫无用处?因此,这是否意味着我不需要将盐存储在数据库中?
答案 0 :(得分:3)
BCrypt将盐存储为" hash"它返回的字符串
这由Bcrypt.*
函数处理,因此您无需执行任何操作。