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