我使用BCryptPasswordEncoder使用spring security。现在要更改密码,我需要做的是将用户提供的现有密码与DB值进行比较。
但是由于salt是由BCryptPasswordEncoder
动态生成的,所以每当我从下面的方法获得不同的散列值时,并不一定会与我的DB值匹配。
public static String encodePassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);
return hashedPassword;
}
这个问题的补救措施是什么?我可以识别用于我的DB字段的盐并在上面的方法中使用相同的盐吗?
答案 0 :(得分:35)
使用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
}
答案 1 :(得分:1)
如果你将BCryptPasswordEncoder和你自己的属性(强度/随机)和Spring MVC一起使用,那么你可以将PasswordEncoder声明为Bean。这样,它将是一个单例实例,您可以重复使用它。
以下是一个示例(我不知道您正在使用哪种配置样式):
在您的安全配置中:
@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);;
}