Получение того же хэшированного значения при использовании BCryptPasswordEncoder
Я использую spring безопасность, используя BCryptPasswordEncoder. Теперь для смены пароля мне нужно будет сравнить Существующий пароль, предоставленный пользователем с значением DB.
Но так как соль генерируется динамически с помощью BCryptPasswordEncoder
, каждый раз, когда я получаю другое значение хэширования снизу, и не обязательно это будет соответствовать моему значению БД.
public static String encodePassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);
return hashedPassword;
}
Какое средство для решения этой проблемы? могу ли я определить соль, используемую для моего поля БД, и использовать ту же соль в вышеуказанном методе?
Ответы
Ответ 1
Используйте метод matches
на интерфейсе PasswordEncoder
, чтобы проверить, действительно ли пароль действителен, а не кодировать его снова и сравнивать с существующим хешем.
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String existingPassword = ... // Password entered by user
String dbPassword = ... // Load hashed DB password
if (passwordEncoder.matches(existingPassword, dbPassword)) {
// Encode new password and store it
} else {
// Report error
}
Ответ 2
Если вы используете BCryptPasswordEncoder со своими собственными свойствами (сила/случайность) вместе с Spring MVC, вы можете объявить свой парольEncoder как Bean. Таким образом, это будет экземпляр singleton, и вы можете его повторно использовать.
Вот пример (я не знаю, какой стиль конфигурации вы используете):
в вашей конфигурации безопасности:
@Bean
public PasswordEncoder passwordEncoder() {
int strength = // your strength;
SecureRandom random = // your random
PasswordEncoder encoder = new BCryptPasswordEncoder(strength, random);
return encoder;
}
Однако в вашем контроллере вы можете сравнить пароли следующим образом:
@Autowired
private PasswordEncoder passwordEncoder;
public boolean checkPassword(String password, String
return passwordEncoder.matches(password, hashedPassword);;
}