BCrypt是一种密码哈希函数,BCrypt算法使用“盐”来加密密码,这是一种随机生成的字符串,可以在密码加密过程中使用,以确保每次加密结果都不同。盐的使用增强了安全性,因为攻击者需要花费更多的时间来破解密码。
下图为使用BCrypt算法后的的密码结果值:
下面讲一下注册登陆场景中如何使用BCrypt算法的。
首先,确保项目中包含了Spring Security Crypto的依赖,可以在pom.xml文件中添加Spring Security的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Security是一个广泛使用的身份验证和授权框架,而Spring Security Crypto是其中的一个模块,专门用于提供加密和安全相关的功能,提供对称加密(如AES和RSA)、密钥生成和密码编码等功能。这个模块作为核心模块的一部分,但不依赖于任何其他Spring Security或Spring代码。
在Spring Security Crypto中,你可以使用BCryptPasswordEncoder类来进行BCrypt加密、验密。
可以写一个工具类来存放权限相关的操作,以便后续扩展。
/**
* 权限获取工具类
*/
public class SecurityUtils {
/**
* 生成BCryptPasswordEncoder密码
*
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rawPassword, encodedPassword);
}
}
注册时,直接调用工具类SecurityUtils来加密密码
/**
* 注册
*/
public void register(RegisterBody param) {
// 注册用户信息
User user = new User();
user.setUserName(param.getUsername());
user.setPassword(SecurityUtils.encryptPassword(param.getPassword()));
// 入库
}
登陆时,直接调用SecurityUtils来验密
/**
* 登录
*/
public User login(LoginBody form) {
String username = form.getUsername();
// 前端密码RSA加密,这里需要调用自定义工具类RSAUtil.decodeValue方法解密
String password = RSAUtil.decodeValue(form.getPassword());
// 查询用户信息
User user = remoteUserService.getUserInfo(username);
// 验密
if (!SecurityUtils.matchesPassword(password, user.getPassword())) {
// 更新用户密码错误次数以及密码错误锁定时间
} else {
// 登录成功清空密码登录错误次数
}