我有关于密码哈希的问题。我在网页上使用这个:
$pw = password_hash($_POST[password], PASSWORD_BCRYPT);
之后,我将此结果存储在数据库中。使用我的Java Web服务,我想验证密码。为此,我使用这种方法:
if (BCrypt.checkpw(password, dbPwd)){
return Response.ok("ok").build();
}
dbPwd
是我存储的密码,密码是第一种方法的纯文本密码。不幸的是我收到此错误代码:
javax.servlet.ServletException:java.lang.IllegalArgumentException: 盐修订版无效
我在互联网上发现,有一个" bug" Java方法使用2y,jBcrypt使用2a。我用2a尝试了它并且它可以工作,但我怎样才能解决这个问题/让它工作?
答案 0 :(得分:0)
经过大量挖掘,我发现了jBcrypt库的较新实现:https://github.com/patrickfav/bcrypt
我使用Scala,但是概念基本相同,并且为了验证$2y$
哈希,我创建了一个小实用程序函数:
import at.favre.lib._
/**
* Verifies an encrypted password against the expected value
*
* @link https://github.com/patrickfav/bcrypt
* @param hash The hashed password (encypted with BCrypt version $2Y$)
* @param password The unencrypted password string
*/
private def verifyBcryptHash(hash: String, password: String): Boolean = {
if (hash == null || hash.trim.isEmpty)
false
else
BCrypt
.verifyer()
.verifyStrict(
password.toCharArray(),
hash.toCharArray(),
BCrypt.Version.VERSION_2Y
)
.verified
}