【问题标题】:Spring Security - BcryptPasswordEncoderSpring Security - BcryptPasswordEncoder
【发布时间】:2016-03-31 04:22:38
【问题描述】:

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

密码在DB中存储如下。

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?

标签: java spring spring-security


【解决方案1】:

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

Bcrypt 算法使用内置的盐值,每次都不同。所以,是的,即使对于相同的明文,相同的编码过程也会生成不同的密文。

从用户那里获得密码后,我使用上述逻辑进行编码 并尝试与数据库进行比较

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2018-04-19
    • 2018-09-09
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多