Как я могу сделать 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
Я надеюсь, что это поможет Вам.
Проблема в том, что 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, прочтите эту статью.