我在我们的应用程序中使用Spring安全性,并希望使用存储在数据库中的更改密码选项的密码来验证用户输入。
密码如下存储在DB中。
user.setPassword(new BCryptPasswordEncoder().encode("<userPassword>"));
在此,用户输入的密码使用上述逻辑进行编码并存储在DB中。现在,我只是想从用户那里获取更改密码的密码。从用户那里获得密码后,我使用上述逻辑进行编码,然后尝试与数据库进行比较。即使我使用相同的逻辑进行编码,编码后的值似乎也有所不同。
我的配置来自
WebSecurityConfig
:@Autowired
public void configAuthentication(final AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
}
我不确定比较有什么问题。
最佳答案
即使我使用相同的逻辑,编码值似乎也不同
编码。
Bcrypt算法使用的内置盐值每次都不同。因此,是的,即使对于相同的明文,相同的编码过程也会生成不同的密文。
从用户那里获得密码后,我使用上述逻辑进行编码
并尝试与数据库进行比较
不要对原始密码进行编码。假设rawPassword
是客户端给您的密码,而encodedPassword
是数据库中已编码的存储密码。然后,不要使用rawPassword
来编码String#equals
并比较结果,而是使用PasswordEncoder#matches
方法:
PasswordEncoder passwordEnocder = new BCryptPasswordEncoder();
if (passwordEncoder.matches(rawPassword, encodedPassword)) {
System.out.println("Matched!");
}