Spring Security - BcryptPasswordEncoder

Uda*_*ani 3 java spring spring-security

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

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

user.setPassword(new BCryptPasswordEncoder().encode("<userPassword>"));
Run Code Online (Sandbox Code Playgroud)

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

我的配置来自WebSecurityConfig:

@Autowired
public void configAuthentication(final AuthenticationManagerBuilder auth) throws Exception {

    auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());

}
Run Code Online (Sandbox Code Playgroud)

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

Ali*_*ani 6

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

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

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

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

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