Как я могу предварительно сгенерировать хешированный пароль BCrypt для моего приложения Spring Boot? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть приложение Spring Boot (код здесь ) с конфигурацией безопасности , которая использует BCryptPasswordEncoder:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

Я хотел бы предварительносоздать пару паролей для инициализации моей базы данных, для тестирования или для входа в систему на компьютере разработчика. (Не для производства.) Моя база данных - PostgreSQL, и схема основана на схеме по умолчанию Spring Security с таблицей users и таблицей authorities. Мой оператор SQL выглядит следующим образом:

insert into users (username, password, enabled) values ('joe','$2y$12$XodbOuISPCPQijlY8MIRUepDeURhxDe09/4VQU0Cno5zkTEKjZouO',true);

Я не знаю много о том, как работает алгоритм хэширования BCrypt, но я сгенерировал этот хэш пароля (для пароля "test"), используя бесплатный онлайн BCrypt хэш-генератор , который выглядит законным. Тем не менее я не могу войти в приложение Spring Boot. Ошибка в журналах "неверные учетные данные". Что дает?

PS: Это продолжение этого другого вопроса .

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Вы можете использовать онлайн-генератор BCrypt, но дело в том, что онлайн-генератор может генерировать регулярные выражения из вашего Spring Segurity enconder.

Например, онлайн-генератор может сгенерировать BCrypt с регулярным выражением «$ 2y», а ваш Spring Boot enconder сгенерировать с регулярным выражением «$ 2a». Если это произойдет, вы всегда получите неверные учетные данные.

Я настоятельно рекомендую вам создавать пароли с помощью Spring Boot BCrypt Enconder.

@SpringBootApplication
public class QuartzJdbcJobStoreBciApplication extends SpringBootServletInitializer{

public static void main(String[] args {
    SpringApplication.run(QuartzJdbcJobStoreBciApplication.class, args);
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String password [] = {"Password1", "Password2", "Password3"};
    for(int i = 0; i < password.length; i++)
        System.out.println(passwordEncoder.encode(password[i]));

    }
}
1 голос
/ 29 октября 2019

Проблема оказалась в префиксе $2y в хэше. Предполагается, что это представляет собой версию алгоритма BCrypt, но, согласно Википедии , префикс не является стандартным. Понятно, что в онлайн-генераторе не используется нестандартный алгоритм , а просто нестандартная метка .

Кстати, следующий раздел хэша, $12, указывает число раундов хэширования, и хотя это не то же самое, что стандартное значение Spring (10 раундов), это не вызывает проблемы.

решение состоит в том, чтобы просто изменить y на a. $2a является стандартным префиксом для хэша BCrypt. Вам не нужно искать другой генератор BCrypt или что-то еще, просто отредактируйте строку.

Это работает:

insert into users (username, password, enabled) values ('joe','$2a$12$XodbOuISPCPQijlY8MIRUepDeURhxDe09/4VQU0Cno5zkTEKjZouO',true);
...