Spring Security 是 Spring 框架中负责安全管理的模块,主要用于:
1. 认证(Authentication)
- 用户登录验证
- 支持多种认证方式(用户名密码、OAuth2、JWT等)
- 会话管理
2. 授权(Authorization)
- 访问控制
- 角色权限管理
- URL级别的权限控制
3. 安全特性
- 密码加密(我们用到的 PasswordEncoder)
- CSRF 防护
- XSS 防护
- 会话固定攻击防护
Spring Security 默认使用的是 BCrypt 加密算法,这是一个公开的算法,它的安全性在于:
1. 算法特性:
// 即使是相同的密码,每次加密结果都不同
String password = "123456";
String encoded1 = passwordEncoder.encode(password);
// $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
String encoded2 = passwordEncoder.encode(password);
// $2a$10$K8aVkZj9TzpL.ISQVxK3.OzIXhN0/BnxpqhK8dA0/2WgCS.LZ4E2u
2. 加盐(Salt)机制:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
| | | |
| | | 实际的散列值
| | 盐值(随机生成)
| 工作因子(计算强度)
算法版本
3. 计算强度:
- BCrypt 算法故意设计得很慢
- 正常登录验证只需验证一次,用户无感知
- 但暴力破解时需要大量计算,成本很高
所以安全性不在于算法的保密性,而在于:
- 算法本身的数学特性
- 随机盐值
- 高计算成本