带有 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。如何从数据库中检查用户密码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章