Spring Securty - Как разделить bcrypt между двумя приложениями? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть приложение REST API, где учетные данные хранятся в виде хэшей в таблице базы данных.Кроме того, у меня есть другое приложение, которое управляет учетными данными для первого приложения.Я сгенерировал в обоих приложениях DelagtingPasswordEncoder.

@Bean
public PasswordEncoder delegatingPasswordEncoder() {
    PasswordEncoder defaultEncoder = NoOpPasswordEncoder.getInstance();
    Map<String, PasswordEncoder> encoders = new HashMap<>();
    encoders.put("bcrypt", new BCryptPasswordEncoder());
    encoders.put("scrypt", new SCryptPasswordEncoder());

    DelegatingPasswordEncoder passworEncoder = new DelegatingPasswordEncoder("bcrypt", encoders);
    passworEncoder.setDefaultPasswordEncoderForMatches(defaultEncoder);

    return passworEncoder;
}

Когда я пытаюсь выполнить аутентификацию на REST API с использованием учетных данных, сгенерированных приложением администратора, я получаю Unauthorized 401. Хэш bcrypt, сгенерированный в приложении администратора, не можетбыть сопоставлены bcrypt приложения REST API.Я предполагаю, что случайная соль, сгенерированная bcrypt, также зависит от контекста, в котором она инициализирована?

Мы использовали Basic Auth для теста с правильным паролем, сгенерированным приложением администратора, перед тем как сохранить его как хеш вбаза данных.

Оба приложения совместно используют одну и ту же базу данных, но в остальном независимы друг от друга.

Возможно ли использовать bcrypt в обоих приложениях или каков наилучший способ обмена паролями между обоими приложениями?

1 Ответ

0 голосов
/ 19 октября 2018

Вам не нужно совместно использовать кодировщик BCrypt между приложениями.

Структура хеша BCryptPasswordEncoder представляет собой объединение:

  • алгоритм хеширования
  • количество итераций хеша
  • соль
  • хешированная соль + пароль

Когда вы делаете аутентификацию, вы в основном получаете имя пользователя и пароль из запроса пользователя, выбираете пользователя на основе предоставленного имени пользователя из базы данных, извлекаете хешированиеалгоритм, количество итераций и соль из хешированного пароля из базы данных, хэшируйте пароль запроса на основе этих данных и затем сравнивайте хэши.При аутентификации пользователя не происходит образования соли.Соль генерируется только тогда, когда вы создаете или обновляете пароль.

Обратите внимание, что алгоритм хэширования, количество итераций и извлечение соли выполняется скрытно методом matches из BCryptPasswordEncoder (который принимает в качестве аргументовхешированный пароль и простой пароль).

Лучше всего предположить, что вы не используете метод matches из BCryptPasswordEncoder для сравнения пароля запроса с паролем БД, но перефразируйте пароль запроса и сравниваете полученный хэш с хэшем db.Это не будет работать, поскольку закодированный метод сгенерирует новую соль, с которой будет хэшировать пароль, что приведет к различным хешам.

...