Java 我的Spring安全项目中的BCrypt(Spring安全)
我如何做加密。这样在数据库中就不会显示用户密码。我现在保存在数据库中-登录名和密码,用户角色。我需要密码必须加密(BCrypt) 在数据库中Java 我的Spring安全项目中的BCrypt(Spring安全),java,spring,jakarta-ee,spring-security,Java,Spring,Jakarta Ee,Spring Security,我如何做加密。这样在数据库中就不会显示用户密码。我现在保存在数据库中-登录名和密码,用户角色。我需要密码必须加密(BCrypt) 在数据库中 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exceptio
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/**").permitAll()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/allStudents")
.and()
.logout()
.and()
.csrf().disable();
}
@Bean
public PasswordEncoder weDoNotWantEncryption() {
return new PasswordEncoder() {
@Override
public String encode(CharSequence rawPassword) {
return rawPassword.toString();
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return rawPassword.toString().equals(encodedPassword);
}
};
}
}
非常简单-只需将
WedonotContentCryption()
函数替换为返回BCrypt实例的函数:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
BCryptPasswordEncoder
实现了PasswordEncoder
(顾名思义),因此已经为encode()
和匹配()定义了好方法
请注意,这(当然)会使数据库中当前的任何密码无法使用,尽管这些密码是以明文形式存储的,但我假设(并希望/祈祷)这是在测试环境中,而不是在生产环境中。当我们加密存储密码时,我们通常对它们进行散列,使其成为单向加密,即即使我们知道散列算法,也无法从加密密码中检索原始密码
我们遵循的主要步骤如下所示
- 使用字符串“password”
- 将salt(一个随机字符串,以确保具有相同密码的多个用户不具有相同的哈希密码)添加到密码:random salt:“A3fcherf42”,生成的字符串:“A3fcherf42password”
- 使用加密算法对该字符串进行散列,您可能会得到:“d143d1w132dd23dsgrg5”
- 在验证用户登录时,将salt附加到加密密码以供将来使用:“A3fcherf42d143d1w132dd23dsgrg5”
- 使用用户id将其保存在数据库中
现在验证用户登录:
- 从登录表单获取密码,即“密码”
- 读取存储在数据库中的哈希:“A3fcherf42d143d1w132dd23dsgrg5”
- 从存储的散列密码“A3fcherf42”中提取盐
- 将salt附加到用户输入的密码:“A3fcherf42password”
- 散列密码,现在生成的散列应该与数据库中存储的散列匹配
使用Bcrypt实现这一点是一个简单的过程,因为大部分工作都由库处理。我解释了上述场景,以便您能够很好地理解幕后发生的事情。要生成并保存哈希密码,请执行以下操作
String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
现在已经有了散列字符串,可以将其存储到数据库中
当用户登录时,您获取他输入的密码,即数据库存储的哈希字符串,并对其进行验证
if (BCrypt.checkpw(entered_pw, stored_hash))
return True;
请参阅有关BCrypt哈希的spring安全文档:
注意-如果使用BCrypt,则盐将作为哈希的一部分包含(如BCrypt规范所定义)。因此,不需要为salt创建额外的数据库列,因为它是密码的一部分。BCrypt在验证Bro时也会考虑到这一点,我会将您的代码添加到我的文件中。但是mySQL数据库中的密码仍然可见。这不会更改任何现有密码。尝试添加一个新密码,它应该以BCrypt格式显示。Spring中的密码编码器用于在将密码放入数据库时对其进行散列BCryptPasswordEncoder.encode()
在数据库存储操作期间被调用,因此您不应该看到数据库中有任何差异。(仅供参考如果进行测试,您可以将ddl设置为create
,以便在每次运行时设置新的db,这将避免这些错误。