Получение того же хэшированного значения при использовании 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);;
}