关于java:带有BCrypt哈希的AES 256。

AES 256 with BCrypt hash. How to check user password from database?

本问题已经有最佳答案,请猛点这里访问。

我使用的是AES256加密,但它可以用安全密钥解密。我把加密的密码散列并存储在数据库中。但是纯文本"密码"每次加密的不同。每次按bcrypt散列不同,用户提交密码时如何存储或检查密码?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 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!!");
    }

这些密码总是打印"密码不匹配!!如何比较数据库中的用户密码和哈希密码?


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

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

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

但是,如果AES256Encryption#encrypt实际上是安全的,这将被打破。加密通常是随机的(为了语义安全)。因此再次加密不会产生与先前散列相同的加密密码。

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