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 AuthUtils {
/**
* 生成BCryptPasswordEncoder密码
*
*/
public static String encryptPassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rPassword 真实密码
* @param ePassword 加密后字符
*/
public static boolean matchesPassword(String rPassword, String ePassword) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rPassword, ePassword);
}
}
注册时,直接调用工具类SecurityUtils来加密密码
/**
* 注册
*/
public void register(RegisterBody param) {
// 注册用户信息
User user = new User();
user.setUserName(param.getUsername());
user.setPassword(AuthUtils.encryptPassword(param.getPassword()));
// 入库
}
登陆时,直接调用SecurityUtils来验密
/**
* 登录
*/
public User login(LoginBody form) {
String username = form.getUsername();
// 前端密码RSA加密,这里需要进行RSA解密
String password = RSAUtil.decodeValue(form.getPassword());
// 查询用户信息
User user = remoteUserService.getUserInfo(username);
// 验密
if (!AuthUtils.matchesPassword(password, user.getPassword())) {
// 更新用户密码错误次数以及密码错误锁定时间
} else {
// 登录成功清空密码登录错误次数
}