認証モジュールを 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' の場合、生成されるハッシュ + ソルトは次のとおりです。
PHP - $2y$10$SA4iLMAniuNO6p9P1ZJElePaJvlN5eHGZ2dDt2Mutle4FQr1OY4hC
Java - $2a$10$YnqJT5NPCPTI8qKBbLfgIOIOW4eckdbE1R85tJGNRUJKmxz1TLkWG
PHPを使用して生成された文字列をJavaで照合しようとしたとき
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)。 ..`
両方に互換性を持たせるにはどうすればよいですか?