如何为我的 Spring Boot 应用程序预生成 BCrypt 散列密码?

How can I pre-generate a BCrypt hashed password for my Spring Boot application?

我有一个 Spring 引导应用程序(代码 here) with a security configuration 使用 BCryptPasswordEncoder:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

我想预先生成几个密码来初始化我的数据库,用于测试或登录开发人员机器。 (不适用于生产。)我的数据库是 PostgreSQL,架构基于 Spring 安全默认架构,具有 users table 和 authorities table。我的 SQL 语句如下所示:

insert into users (username, password, enabled) values ('joe','y$XodbOuISPCPQijlY8MIRUepDeURhxDe09/4VQU0Cno5zkTEKjZouO',true);

我不太了解 BCrypt 哈希算法的工作原理,但我使用看起来合法的免费在线 BCrypt hash generator 生成了此密码哈希(用于密码 "test")。然而,我无法登录我的 Spring 启动应用程序。日志中的错误是 "bad credentials"。给出了什么?

PS:这是 .

的后续

问题原来是散列中的前缀y。这应该代表 BCrypt 算法的一个版本,但是,according to Wikipedia,前缀不是标准的。需要明确的是,该在线生成器并未使用非标准的 算法 ,只是使用了非标准的 label.

顺便说一句,散列的下一部分 </code> 表示散列的 <em> 轮数 </em>,尽管它与 [=31] 不同=]默认(10轮),不会引起问题。</p> <p>解决方案是简单地将 <code>y 更改为 aa 是 BCrypt 散列的标准前缀。您不需要寻找其他 BCrypt 生成器或任何东西,只需编辑字符串即可。

这个有效:

insert into users (username, password, enabled) values ('joe','a$XodbOuISPCPQijlY8MIRUepDeURhxDe09/4VQU0Cno5zkTEKjZouO',true);

您可以使用在线 BCrypt 生成器,但问题是在线生成器可能会生成与您的 Spring 安全编码器不同的正则表达式。

例如,在线生成器可以使用正则表达式“$2y”生成 BCrypt,而您的 Spring 引导编码器可以使用“$2a”正则表达式生成。如果发生这种情况,您将永远得到错误的凭据。

我强烈建议您使用 Spring Boot BCrypt Enconder 生成密码。

@SpringBootApplication
public class QuartzJdbcJobStoreBciApplication extends SpringBootServletInitializer{

public static void main(String[] args {
    SpringApplication.run(QuartzJdbcJobStoreBciApplication.class, args);
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String password [] = {"Password1", "Password2", "Password3"};
    for(int i = 0; i < password.length; i++)
        System.out.println(passwordEncoder.encode(password[i]));

    }
}