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

Posted

技术标签:

【中文标题】带有 BCrypt 哈希的 AES 256。如何从数据库中检查用户密码? [复制]【英文标题】:AES 256 with BCrypt hash. How to check user password from database? [duplicate] 【发布时间】:2016-05-01 23:11:28 【问题描述】:

我使用的是 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】:

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

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

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

但是如果AES256Encryption#encrypt 实际上是安全的,这将中断。加密通常是随机的(为了语义安全)。所以再次加密它不会导致与之前散列的相同的​​加密密码。

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

【讨论】:

在这篇文章中,尝试五; nakedsecurity.sophos.com/2013/11/20/… 他说使用哈希。如果我只使用 AES 并存储数据,它会被解密吗?并且 AES 不会给出相同的加密密码,它每次都会改变。我的问题是如何存储加密密码,当用户尝试登录时如何检查用户密码是否正确? 这就是 bcrypt 的用途。密码不应该被加密和解密。必须对它们进行哈希处理,bcrypt 正在这样做。 AES 是加密,因为您需要附近的密钥,所以它不提供额外的安全性。如果您仍想使用 AES,那么您需要使用 AES 加密初始 bcrypt-hash 并使用 AES 解密此加密哈希,然后再将其传递给BCrypt.checkpw 是的,这是真的,但在加密哈希后,我将其存储在数据库中,下次用户想要登录时,我会检查用户的密码纯文本和存储的值,它会给我一个例外,因为哈希字符串并且加密的字符串每次都会更改。它不是相同的存储字符串。而且我不明白 bcrypt 和 AES 一样安全吗?如果我使用 bcrypt 和 AES 是不可能的吗?如果我只使用 AES 并存储用于解密的加密密码? 您永远不应该加密您的用户密码。您需要使用散列代替一些强大的散列,例如 PBKDF2、bcrypt、scrypt 和 Argon2。由于散列函数是单向函数,因此您将无法“解密”散列。为了验证您的用户,您可以再次通过哈希函数运行密码,以便与存储在数据库中的哈希值进行比较。查看更多:How to securely hash passwords?。如果您可以将密钥保密,AES可以增加安全性,但它需要一个密钥,它通常与数据接近。 只需删除 AES。 bcrypt 足以验证密码。

以上是关于带有 BCrypt 哈希的 AES 256。如何从数据库中检查用户密码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 ubuntu/linux/unix 中是不是有带有 cbc 加密的 aes 256?

如何将密码文本与 bcrypt 哈希值进行比较?

bcrypt 哈希究竟如何防止彩虹表查找?

nodejs - 如何比较bcrypt的两个哈希密码

将密码哈希从 md5 升级到 bcrypt [关闭]

跨平台AES 256 GCM Javascript和Elixir