我在我们的应用程序中使用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!");
}

08-25 22:50