带有BCrypt哈希的AES 256。如何从数据库中检查用户密码?

时间:2016-01-25 15:19:52

标签: java aes bcrypt

我使用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!!");
    }

这些代码始终打印“密码不匹配!!”。如何比较用户的密码和数据库中的哈希密码?

1 个答案:

答案 0 :(得分:1)

bcrypt是一个密码散列函数。如果要验证密码,则必须提供用于生成哈希的相同密码。

目前,您正在为AES加密的密码生成bcrypt哈希值,但您使用未加密的密码检查哈希值。您可以查看加密密码:

if(BCrypt.checkpw(d.encrypt(password), hash)){

但如果AES256Encryption#encrypt确实安全,这将会中断。加密通常是随机的(对于语义安全性)。因此,再次加密它不会导致先前散列的加密密码。

此外,如果您有静态密钥,使用AES加密并不比单独执行bcrypt提供更多安全性。如果AES256Encryption#encrypt在语义上是安全的(随机化),那么您就不能混用AES和bcrypt。您必须删除AES加密。