-
出于安全的考虑,一些敏感的信息是绝对不能以明文的方式存储在数据库中的,比如密码通常是通过哈希算法进行加密的。有很多标准的算法比如
SHA
和 MD5
,结合 salt
(盐)是一种不错的选择,但是如果知道其加密的规则还是相对不安全。
-
Spring security提供了
BCryptPasswordEncoder
类,使用Bcrypt强哈希方法来加密密码
-
Bcrypt强哈希算法每次加密的结果都是不一样的。
API
使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
-
添加security的配置类,如下:
-
在其中注入
BCryptPasswordEncoder
/**
* Spring security的配置类
*/
@Configuration
public class SecurityConfigextends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http)throws Exception {
http.authorizeRequests()
.antMatchers("/**")
.permitAll()
.anyRequest()
.authenticated()
.and().csrf().disable();
super.configure(http);
}
/*
* 注入BCryptPasswordEncoder
*/
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
}
-
主配置类添加
@EnableWebSecurity
@SpringBootApplication
@EnableWebSecurity //开启security
public class AuthServerApplication{
- 在业务层实现登录和注册的功能 ,对密码进行加密和校验
@Service
@Transactional
public class UserServiceImplimplements UserService{
@Resource
private UserRepository userRepository;
@Resource
private BCryptPasswordEncoder bCryptPasswordEncoder; //注入bcryct加密
@Override
public User add(User user){
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); //对密码进行加密
User user2 = userRepository.save(user);
return user2;
}
@Override
public ResultInfo login(User user){
ResultInfo resultInfo=new ResultInfo();
User user2 = userRepository.findByName(user.getName());
if (user2==null) {
resultInfo.setCode("-1");
resultInfo.setMessage("用户名不存在");
return resultInfo;
}
//判断密码是否正确
if (!bCryptPasswordEncoder.matches(user.getPassword(),user2.getPassword())) {
resultInfo.setCode("-1");
resultInfo.setMessage("密码不正确");
return resultInfo;
}
resultInfo.setMessage("登录成功");
return resultInfo;
}
}
原文
https://chenjiabing666.github.io/2018/12/25/SpringBoot实现BCrypt密码加密/