gpt4 book ai didi

java - 无法验证使用 jBcrypt 使用 php password_hash() 创建的 passwordhash+salt

转载 作者:行者123 更新时间:2023-11-30 10:40:09 25 4
gpt4 key购买 nike

我们正在将身份验证模块从 PHP 迁移到 Java。目前密码hash+salt使用BCrypt算法存储在数据库中。该值是使用 PHP 的 password_hash() 函数生成的。为了验证纯文本密码,我们使用 PHP 的 password_verify() 函数。

PHP代码

$hash = password_hash($password,PASSWORD_DEFAULT); //stored in db

if(password_verify($candidate,$hash)===TRUE) { //$hash fetched from DB
echo "valid";
}

为了将此身份验证模块迁移到 Java,我们使用 jBCrypt使用 jBCrypt-0.4.jar

Java代码

private static String hashPassword(String password) {
String hashed = BCrypt.hashpw(password, BCrypt.gensalt());
return hashed;
}

private static boolean checkpasword(String candidate, String hashed){
boolean matches = false;

if (BCrypt.checkpw(candidate, hashed)){
matches = true;
}

return matches;
}

但是,从 php 生成的 passwordhash+salt 没有在 java 中验证。对于字符串 'abcd' ,生成的 hash+salt 是

PHP - $2y$10$SA4iLMAniuNO6p9P1ZJElePaJvlN5eHGZ2dDt2Mutle4FQr1OY4hC

Java - $2a$10$YnqJT5NPCPTI8qKBbLfgIOIOW4eckdbE1R85tJGNRUJKmxz1TLkWG

当我尝试匹配在 Java 中使用 PHP 生成的字符串时

 if (BCrypt.checkpw("abcd", "$2y$10$SA4iLMAniuNO6p9P1ZJElePaJvlN5eHGZ2dDt2Mutle4FQr1OY4hC")){
matches = true;
}

我得到了下面的

Exception in thread "main" java.lang.IllegalArgumentException: Invalid salt revision at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:665) at org.mindrot.jbcrypt.BCrypt.checkpw(BCrypt.java:764)...`

如何使两者兼容?

最佳答案

在 PHP 中由 password_hash() 生成的散列包括盐。这意味着当您根据明文密码对其进行检查时,将使用相同的盐来生成针对明文密码的散列,并以恒定时间方式比较这两个散列验证。

您在 Java 中所做的是每次生成不同的盐,这意味着您无法比较两者。您的 Java 实现使用了不同的版本,在您的散列中用 $2a$ 表示。注意 PHP 使用的是 $2y$ 并且盐分明显不同。

From the PHP manual

Versions of PHP before 5.3.7 only support "$2a$" as the salt prefix: PHP 5.3.7 introduced the new prefixes to fix a security weakness in the Blowfish implementation. Please refer to » this document for full details of the security fix, but to summarise, developers targeting only PHP 5.3.7 and later should use "$2y$" in preference to "$2a$".

因此,您不应在 Java 中生成新的散列来验证由 PHP 生成并存储在数据库中的现有散列。相反,将存储的哈希提供给 BCrypt.checkpasword 进行验证。

关于java - 无法验证使用 jBcrypt 使用 php password_hash() 创建的 passwordhash+salt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39040576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com