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



我有一个Spring Boot应用程序(此处代码(,其安全配置使用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散列生成器生成了这个密码散列(用于密码"测试"(。尽管如此,我还是无法登录到我的Spring Boot应用程序。日志中的错误是"凭据不正确"。什么东西?

附言:这是对另一个问题的跟进。

您可以使用在线BCrypt生成器,但问题是在线生成器可能会从您的SpringSegurity编码器生成不同的regex。

例如,在线生成器可以使用regex"$2y"生成BCrypt,而您的Spring Boot编码器则使用regex生成"$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]));
}
}

问题原来是哈希中的前缀$2y。这本应代表BCrypt算法的一个版本,但根据维基百科的说法,前缀不是标准的。需要明确的是,该在线生成器没有使用非标准的算法,只是使用了非标准的标签。

顺便说一句,散列的下一部分$12指示散列的轮数,即使它与Spring默认值(10轮(不同,也不会导致问题。

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

这项工作:

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

最新更新