Spring Security – BcryptPasswordEncoder

我在我们的应用程序中使用Spring安全性,并希望使用存储在数据库中的密码validation用户输入以获取更改密码选项。

密码在DB中按如下方式存储。

user.setPassword(new BCryptPasswordEncoder().encode("")); 

这里用户输入的密码使用上述逻辑编码并存储在DB中。 现在我只是想从用户那里获取更改密码的密码。 从用户获取密码后,我使用上述逻辑进行编码,并尝试与DB进行比较。 即使我使用相同的编码逻辑,编码值似乎也不同。

我在WebSecurityConfig配置:

 @Autowired public void configAuthentication(final AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); } 

我不确定比较有什么问题。

即使我使用相同的编码逻辑,编码值似乎也不同。

Bcrypt算法使用内置的salt值,每次都不同。 所以,即使对于相同的Clear Text,相同的编码过程也会生成不同的Cipher Text

从用户获取密码后,我使用上述逻辑进行编码,并尝试与DB进行比较

不要编码原始密码 。 假设rawPassword是客户端提供给您的密码, encodedPassword是数据库中编码的存储密码。 然后,使用PasswordEncoder#matches方法,而不是编码rawPassword并使用String#equals比较结果:

 PasswordEncoder passwordEnocder = new BCryptPasswordEncoder(); if (passwordEncoder.matches(rawPassword, encodedPassword)) { System.out.println("Matched!"); }