我有一个带有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的后续行动。
答案 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]));
}
}