若依(RuoYi)框架采用了Spring Security提供的密码加密机制,主要涉及用户密码的存储和验证过程。以下是其核心实现原理:
1. 密码加密机制
加密算法
若依默认使用BCryptPasswordEncoder作为密码加密器,这是Spring Security推荐的密码哈希算法,特点包括:
基于Blowfish加密算法
自动加盐(salt)处理
内置抗彩虹表攻击能力
支持自适应计算成本(迭代次数可配置)
配置位置
加密器在Spring Security配置类中定义:
java
复制
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
2. 密码存储流程
用户注册/修改密码时:
java
复制
// SysUserServiceImpl.java @Override public boolean updateUserProfile(SysUser user) { // 如果修改了密码,对新密码进行加密 if (StringUtils.isNotEmpty(user.getPassword())) { user.setPassword(passwordEncoder.encode(user.getPassword())); } return userMapper.updateUser(user) > 0; }
数据库存储:
加密后的密码格式类似:
$2a$10$N9qo8uLOickgx2ZMRZoMy...
其中
$2a$
表示BCrypt算法版本10
表示成本因子(2^10次迭代)剩余部分包含盐值和实际哈希值
3. 密码验证流程
用户登录时:
java
复制
// SysLoginService.java public String login(String username, String password) { // 验证用户 Authentication authentication = null; try { // 这里会触发密码验证 authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(username, password)); } // ... }
Spring Security自动验证:
框架会自动调用
PasswordEncoder.matches(rawPassword, encodedPassword)
方法比较用户输入的明文密码与数据库存储的加密密码是否匹配
验证时会自动提取存储密码中的盐值进行一致性校验
4. 密码强度配置
若依在application.yml
中提供了密码强度配置:
yaml
复制
# 密码配置
ruoyi:
password:
maxRetryCount: 5 # 密码最大尝试次数
lockTime: 10 # 密码锁定时间(分钟)
minLength: 5 # 密码最小长度
maxLength: 20 # 密码最大长度
5. 加解密特点
不可逆加密:
BCrypt是单向哈希函数,无法解密
系统只存储密码的哈希值,不存储明文密码
安全性保障:
相同密码每次加密结果不同(自动加盐)
支持计算成本递增,对抗硬件破解
前端传输:
前端密码字段通常使用HTTPS传输
可选配置前端加密(如RSA)后再传输
6. 自定义加密
如需替换加密方式,可以:
实现
PasswordEncoder
接口在Security配置中替换默认的BCryptPasswordEncoder
修改用户服务中的密码处理逻辑
这种设计确保了若依系统中的密码存储和验证过程符合当前安全最佳实践,有效防止密码泄露风险。