我正在使用BCryptPasswordEncoder使用Spring Security。现在,要更改密码,我需要将用户提供的现有密码与DB值进行比较。
但是由于salt是由BCryptPasswordEncoder
动态生成的,因此每次我从下面的方法中获得不同的哈希值时,不一定与我的DB值匹配。
public static String encodePassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);
return hashedPassword;
}
这个问题有什么补救办法?如何识别用于数据库字段的盐,并在上述方法中使用相同的盐?
最佳答案
在matches
接口(interface)上使用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
}