Получив же хэшированное значение при использовании BCryptPasswordEncoder
Я использую spring security с помощью BCryptPasswordEncoder. Теперь для изменения пароля мне нужно сравнить существующий пароль, предоставленный пользователем, со значением DB.
но так как соль генерируется динамически BCryptPasswordEncoder
, каждый раз, когда я получаю другое хэшированное значение из метода ниже, и не обязательно оно будет соответствовать моему значению DB.
public static String encodePassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);
return hashedPassword;
}
каково решение этой проблемы? могу ли я определить соль, используемую для моего поля DB, и использовать ту же соль в приведенном выше методе ?
2 ответов
использовать 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
}
Если вы используете BCryptPasswordEncoder со своими собственными свойствами (strength / random) вместе с Spring MVC, то вы можете объявить свой PasswordEncoder как Боб. Таким образом, это будет одноэлементный экземпляр, и вы можете использовать его повторно.
вот пример (я не знаю, какой стиль конфигурации вы используете):
в Настройки Безопасность:
@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);;
}