Spring Security - BcryptPasswordEncoder

4
我在我们的应用程序中使用Spring Security,并希望通过在数据库中验证用户输入来实现更改密码选项。
密码在数据库中存储如下:
user.setPassword(new BCryptPasswordEncoder().encode("<userPassword>"));

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

WebSecurityConfig 的配置如下:

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

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

}

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


你是如何比较编码后的密码的?使用 String#equals 还是 PasswordEncoder#matches - Ali Dehghani
1个回答

10
即使我使用相同的编码逻辑,编码后的值似乎也不同。
Bcrypt算法使用内置的盐值,每次都不同。因此,即使对于相同的“明文”和相同的编码过程,也会生成不同的“密文”。
从用户那里获取密码后,使用上述逻辑进行编码并尝试与数据库进行比较。
不要对“原始密码”进行编码。假设`rawPassword`是客户端提供给你的密码,而`encodedPassword`是数据库中存储的编码后的密码。然后,不要对`rawPassword`进行编码并使用`String#equals`比较结果,而是使用`PasswordEncoder#matches`方法:
PasswordEncoder passwordEnocder = new BCryptPasswordEncoder();
if (passwordEncoder.matches(rawPassword, encodedPassword)) {
    System.out.println("Matched!");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接