如何为我的 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
更改为 a
。 a
是 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]));
}
}
我有一个 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
更改为 a
。 a
是 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]));
}
}