我使用AES256加密,但可以使用安全密钥解密。我将加密的密码哈希并存储在我的数据库中。但是纯文本“密码”每次加密都不同。并且BCrypt的哈希每次都不同。当用户提交他/她的密码时,我如何存储或检查密码?
AES256Encryption d = new AES256Encryption();
String password = "password";
System.out.println("password : " + password);
String encPsw = d.encrypt(password);
System.out.println("Encrypted string:" + encPsw);
String hash = BCrypt.hashpw(encPsw, BCrypt.gensalt());
System.out.println("hashed string : " + hash);
if(BCrypt.checkpw(password,hash )){
System.err.println("password matched!!");
}else{
System.err.println("password not matched!!");
}
这些代码始终打印“密码不匹配!!”。如何比较用户的密码和数据库中的哈希密码?
答案 0 :(得分:1)
bcrypt是一个密码散列函数。如果要验证密码,则必须提供用于生成哈希的相同密码。
目前,您正在为AES加密的密码生成bcrypt哈希值,但您使用未加密的密码检查哈希值。您可以查看加密密码:
if(BCrypt.checkpw(d.encrypt(password), hash)){
但如果AES256Encryption#encrypt
确实安全,这将会中断。加密通常是随机的(对于语义安全性)。因此,再次加密它不会导致先前散列的加密密码。
此外,如果您有静态密钥,使用AES加密并不比单独执行bcrypt提供更多安全性。如果AES256Encryption#encrypt
在语义上是安全的(随机化),那么您就不能混用AES和bcrypt。您必须删除AES加密。