Как я могу сделать bcrypt в php и jbcrypt в java-совместимых

Я хочу сделать страницу регистрации в php и сделать пароль хэшированным с помощью bcrypt и положить его в базу данных.

Я также хочу создать систему входа в систему на Java и получить пароль с тем же паролем, используя jbcrypt.

Как я могу сделать jbcrypt и bcrypt в php совместимым, с той же солью.

2 ответа

Вы можете проверить это:

https://github.com/ircmaxell/password_compat/issues/49

это работает для меня:

public static void main(String[] args) {
    //Laravel bcrypt out
    String hash_php = "$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO".replaceFirst("2y", "2a");
    System.out.println("hash php " + hash_php);
    //String a_hash = BCrypt.hashpw("123456", BCrypt.gensalt());
    //System.out.println("Encrypt " + a_hash);
    if (BCrypt.checkpw("123456", hash_php)) {
        System.out.println("It matches");
    } else {
        System.out.println("It does not match");
    }
    //mtPruebaRecuperarClave();

}

Консоль - OutPut

1

Я надеюсь, что это поможет Вам.

Проблема в том, что PHP с этим password_hash() имеет свою собственную схему версий из-за того, что в предыдущих реализациях были критические ошибки и должна быть возможность распознавать старые хэши.

Таким образом, версия, используемая OpenBSD $2a$ (будет $2b$ в будущих выпусках) и password_hash() использования $2y$ (ранее $2x$), поэтому, конечно, не будет соответствовать, например,

$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO

против

$2a$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO

( см. статью в Википедии о дополнительной информации о версиях)

В настоящее время jBcrypt (0.4) поддерживает только $2a$,

Есть 2 возможности:

1. Замените идентификатор версии вручную перед передачей его в jBcrypt (взломать)

String hash_php = "$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO".replaceFirst("$2y$", "$2a$");

2. Использование другой реализации, поддерживающей пользовательский идентификатор версии

По этой причине я реализовал новую библиотеку для bcrypt (на основе jBcrypt). https://github.com/patrickfav/bcrypt

Просто используйте его так (он не проверяет версию по умолчанию, вы можете использовать verifyStrict() в таком случае)

BCrypt.Result result = BCrypt.verifyer().verify(password.toCharArray(), "$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO")
if(result.verified) {...}

Если вы хотите, чтобы bcrypt создал $2y$ хэши:

String bcryptHash = BCrypt.with(BCrypt.Version.VERSION_2Y).hashToString(6, password.toCharArray());
// $2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO

Полный отказ от ответственности: я автор bcrypt

Если вы удалите первые 7 символов из хешей (2y$10$ / 2a$10$), остальные должны быть такими же, независимо от языка программирования, который вы использовали. Первые символы сгенерированного хеша - это префикс, который больше рассказывает о алгоритме хеширования.

В вашем примере $ 2y $ и $ a2 $ определяют алгоритм хеширования, а 10 $ - это "стоимость" генерации хеша (сколько раз алгоритм хеширования применялся повторно или что-то в этом роде).

Если вы хотите узнать больше о префиксах в хэшах, сгенерированных bcrypt, прочтите эту статью.

Другие вопросы по тегам