如何为Spring Boot应用程序预生成BCrypt哈希密码?

时间:2019-10-29 12:39:32

标签: spring-boot bcrypt password-hash

我有一个带有here的Spring Boot应用程序(代码security configuration),该应用程序使用了BCryptPasswordEncoder:

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

我想预生成几个密码来初始化我的数据库,以便进行测试或登录开发人员计算机。 (不适用于生产。)我的数据库是PostgreSQL,该架构基于Spring Security默认架构,具有一个users表和一个authorities表。我的SQL语句如下所示:

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

我对BCrypt哈希算法的工作方式了解不多,但是我使用看起来合法的免费在线BCrypt hash generator生成了此密码哈希(用于密码“ test”)。但是,我无法登录到我的Spring Boot应用程序。日志中的错误是“凭据错误”。有什么作用?

PS:这是this other question的后续行动。

2 个答案:

答案 0 :(得分:1)

问题原来是哈希中的前缀$2y。假定它代表BCrypt算法的一个版本,但是according to Wikipedia的前缀不是标准的。需要明确的是,在线生成器没有使用非标准的算法,而没有使用非标准的 label

顺便说一句,哈希的下一部分$12表示哈希的数量,即使它与Spring的默认值(10轮)不同,也可以不会造成问题。

解决方案是简单地将y更改为a$2a是BCrypt哈希的标准前缀。您无需查找其他BCrypt生成器或其他任何东西,只需编辑字符串即可。

这有效:

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

答案 1 :(得分:1)

您可以使用在线BCrypt生成器,但事实是,在线生成器可能会生成与Spring Segurity enconder不同的正则表达式。

例如,在线生成器可以使用正则表达式“ $ 2y”生成BCrypt,而您的Spring Boot enconder使用“ $ 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]));

    }
}