2

認証モジュールを 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)。 ..`

両方に互換性を持たせるにはどうすればよいですか?

4

1 に答える 1