[英]BCrypt in my Spring Security project (Spring security)
我该怎么做加密。 因此,在数据库中它不会显示用户密码。 我现在保存在数据库中 - 登录名和密码,用户角色。 我需要密码必须在数据库中加密(BCrypt)
@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);
}
};
}
}
非常简单-只需将您的weDoNotWantEncryption()
函数替换为一个返回BCrypt实例的函数即可:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
BCryptPasswordEncoder
实现了PasswordEncoder
(顾名思义),因此已经具有为encode()
和matches()
定义的良好方法。
请注意,这将(当然)使数据库中当前的所有密码都不可用,尽管鉴于这些密码是以明文形式存储的,但我假设(并希望/祈祷)这是在测试环境中而不是在生产环境中。
当我们加密用于存储的密码时,通常会对其进行哈希处理,因此这是一种单向加密,即,即使我们知道哈希算法,也无法从加密的密码中检索原始密码。
为此,我们遵循的主要过程如下。
现在验证用户登录:
使用Bcrypt做到这一点很简单,因为大多数工作都是由库处理的。 我解释了上述情况,因此您对幕后发生的事情有很好的了解。 您执行以下操作来生成并保存哈希密码。
String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
现在您有了哈希字符串,可以将其存储到数据库中。
用户登录时,您将使用其输入的密码,数据库存储的哈希字符串并进行验证。
if (BCrypt.checkpw(entered_pw, stored_hash))
return True;
请参阅有关BCrypt哈希的Spring安全文档:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.