我们正在将我们的身份验证模块从 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-0.4.jar来使用jBCrypt库
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;
}
我得到了以下
线程“主”java.lang.IllegalArgumentException 中的异常:org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:665) 的 org.mindrot.jbcrypt.BCrypt.checkpw(BCrypt.java:764) 的盐修订无效。 ..`
如何使两者兼容?