【问题标题】:How does BCryptPasswordEncoder work with Spring Security?BCryptPasswordEncoder 如何与 Spring Security 一起使用?
【发布时间】:2018-01-07 05:46:53
【问题描述】:

我正在开发一个使用 Spring Security 对用户进行身份验证的项目。另一方面,我想使用 BCryptPasswordEncoder 来检查用户是否存储。我正在使用下面的代码通过 BCryptPasswordEncoder 从 TEST1234 生成哈希。在每个 for 循环中,BCryptPasswordEncoder 生成不同的哈希。假设我正在获取它们的第一个哈希值并存储在数据库中。

public static void main(String[] args) {
    int i = 0;
    while (i < 10) {
        String password = "TEST1234";
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String hashedPassword = passwordEncoder.encode(password);

        System.out.println(hashedPassword);
        i++;
    }
}

在此之后,我正在运行项目,调用安全页面,输入用户名和密码并访问安全页面。

现在,我将停止该项目并从上面的 for 循环中获取第二个哈希。我正在运行项目,调用安全页面,输入用户名和密码,然后可以“再次”访问安全页面。

我不明白它是如何工作的。

当服务器运行时,为什么如果我更改数据库登录中的哈希值不起作用并且当服务器停止并且数据库中的哈希值更改并且服务器启动时,为什么登录使用真实的用户名和密码?

我的 Spring Security 验证器代码是这样的:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication()
        .dataSource(dataSource)
        .usersByUsernameQuery("select memberUserName,password,enabled from Member where memberUserName=?")
        .authoritiesByUsernameQuery("select memberUserName,role from userroles where memberUserName=?")
        .passwordEncoder(new BCryptPasswordEncoder());
}

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

    BCryptPasswordEncoder 自动生成并使用随机盐来计算哈希,这就是为什么每次调用它都会得到不同的输出。

    如果您在一个循环中生成 10 个哈希,那么它们都将不同且有效。

    请参阅此问题和答案以获得进一步的解释:How can bcrypt have built-in salts?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 2016-09-04
      • 2018-04-14
      • 2020-11-02
      • 2021-09-03
      • 2011-01-15
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多