<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>5.3.2.RELEASE</version>
<scope>compile</scope>
</dependency>
在 Spring Security 中,密码脱敏(加密存储)是通过 PasswordEncoder
接口实现的。它的主要作用是:
- 将明文密码进行加密存储(如使用 BCrypt、SHA256、PBKDF2 等算法)
- 验证用户输入的密码是否正确
✅ 为什么需要使用 PasswordEncoder
直接存储明文密码是非常危险的行为。如果数据库泄露,攻击者就能看到所有用户的密码。
所以必须对密码进行单向加密处理,即:
- 存储时:
明文密码 → 加密 → 存入数据库
- 登录时:
输入密码 → 加密 → 与数据库中加密后的值比较
Spring Security 提供了统一的接口 PasswordEncoder
来完成这个任务。
🔐 常用的 PasswordEncoder
实现类
类名 | 特点 |
---|---|
BCryptPasswordEncoder |
推荐使用,安全且自带盐值(salt),每次加密结果不同 |
NoOpPasswordEncoder |
不加密,用于测试或开发环境(⚠️ 生产环境不要使用) |
Pbkdf2PasswordEncoder |
使用 PBKDF2 算法,适合高安全性场景 |
SCryptPasswordEncoder |
更强的抗暴力破解能力,资源消耗较高 |
Argon2PasswordEncoder |
最新的现代密码哈希算法,推荐用于新项目 |
🧩 示例:使用 BCryptPasswordEncoder
1. 配置 Bean(Spring Boot)
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
2. 注入并使用 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 的特性之一,但能正确匹配原始密码。