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