org.springframework.security
spring-security-crypto
5.3.2.RELEASE
compile
在 Spring Security 中,密码脱敏(加密存储)是通过 PasswordEncoder
接口实现的。它的主要作用是:
PasswordEncoder
直接存储明文密码是非常危险的行为。如果数据库泄露,攻击者就能看到所有用户的密码。
所以必须对密码进行单向加密处理,即:
明文密码 → 加密 → 存入数据库
输入密码 → 加密 → 与数据库中加密后的值比较
Spring Security 提供了统一的接口 PasswordEncoder
来完成这个任务。
PasswordEncoder
实现类类名 | 特点 |
---|---|
BCryptPasswordEncoder |
推荐使用,安全且自带盐值(salt),每次加密结果不同 |
NoOpPasswordEncoder |
不加密,用于测试或开发环境(⚠️ 生产环境不要使用) |
Pbkdf2PasswordEncoder |
使用 PBKDF2 算法,适合高安全性场景 |
SCryptPasswordEncoder |
更强的抗暴力破解能力,资源消耗较高 |
Argon2PasswordEncoder |
最新的现代密码哈希算法,推荐用于新项目 |
BCryptPasswordEncoder
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
PasswordEncoder
@Service
public class UserService {
@Autowired
private PasswordEncoder passwordEncoder;
// 注册用户:加密密码并保存
public void registerUser(String rawPassword) {
String encodedPassword = passwordEncoder.encode(rawPassword);
// 保存到数据库...
System.out.println("加密后的密码:" + encodedPassword);
}
// 登录验证
public boolean checkPassword(String rawPassword, String encodedPassword) {
return passwordEncoder.matches(rawPassword, encodedPassword);
}
}
registerUser("123456");
// 输出类似:
// 加密后的密码:$2a$10$VUd.eXwWJZ.hnS7/.sN8CeDv9yQYORxkFjIzR7qLmYrZgZzT9eBfK1bG
即使你多次运行 encode("123456")
,生成的加密结果也都不一样,这是 BCrypt 的特性之一,但能正确匹配原始密码。