✨ 密码校验器说明
This commit is contained in:
parent
d21f679278
commit
e435a212a2
|
@ -1,4 +1,4 @@
|
|||
# Spring Security 6 入门指南优化版
|
||||
# Spring Security 6 入门指南
|
||||
|
||||
## 基本配置
|
||||
|
||||
|
@ -89,7 +89,7 @@ authorizeRequests
|
|||
.requestMatchers("/api/**").hasAnyAuthority("all", "read")
|
||||
```
|
||||
|
||||
## 完整配置示例
|
||||
### 完整配置示例
|
||||
|
||||
```java
|
||||
@EnableMethodSecurity
|
||||
|
@ -127,3 +127,79 @@ public class SecurityWebConfiguration {
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 密码校验器
|
||||
|
||||
```java
|
||||
/**
|
||||
* 配置密码编码器Bean
|
||||
*
|
||||
* <p>Spring Security提供了多种密码编码器实现,推荐使用BCryptPasswordEncoder作为默认选择。</p>
|
||||
*
|
||||
* <p>特点:</p>
|
||||
* <ul>
|
||||
* <li>BCryptPasswordEncoder - 使用bcrypt强哈希算法,自动加盐,是当前最推荐的密码编码器</li>
|
||||
* <li>Argon2PasswordEncoder - 使用Argon2算法,抗GPU/ASIC攻击,但需要更多内存</li>
|
||||
* <li>SCryptPasswordEncoder - 使用scrypt算法,内存密集型,抗硬件攻击</li>
|
||||
* <li>Pbkdf2PasswordEncoder - 使用PBKDF2算法,较老但广泛支持</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>注意:不推荐使用MD5等弱哈希算法,Spring官方也不推荐自定义弱密码编码器。</p>
|
||||
*
|
||||
* @return PasswordEncoder 密码编码器实例
|
||||
* @see BCryptPasswordEncoder
|
||||
*/
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
// 实际项目中只需返回一个密码编码器
|
||||
return new BCryptPasswordEncoder();
|
||||
|
||||
// 其他编码器示例(根据需求选择一种):
|
||||
// return new Argon2PasswordEncoder(16, 32, 1, 1 << 14, 2);
|
||||
// return new SCryptPasswordEncoder();
|
||||
// return new Pbkdf2PasswordEncoder("secret", 185000, 256);
|
||||
}
|
||||
```
|
||||
|
||||
### 密码校验器的作用和特点
|
||||
|
||||
#### 作用
|
||||
|
||||
密码校验器(PasswordEncoder)在Spring Security中负责:
|
||||
|
||||
1. 密码加密 - 将明文密码转换为不可逆的哈希值
|
||||
2. 密码验证 - 比较输入的密码与存储的哈希是否匹配
|
||||
3. 防止密码泄露 - 即使数据库泄露,攻击者也无法轻易获得原始密码
|
||||
|
||||
#### 各编码器特点
|
||||
|
||||
1. **BCryptPasswordEncoder**
|
||||
- 使用bcrypt算法
|
||||
- 自动加盐,防止彩虹表攻击
|
||||
- 可配置强度参数(默认10)
|
||||
- 目前最推荐的密码哈希方案
|
||||
2. **Argon2PasswordEncoder**
|
||||
- 使用Argon2算法(2015年密码哈希比赛获胜者)
|
||||
- 抗GPU/ASIC攻击
|
||||
- 内存密集型,参数配置复杂
|
||||
- 适合高安全需求场景
|
||||
3. **SCryptPasswordEncoder**
|
||||
- 使用scrypt算法
|
||||
- 内存密集型,抗硬件攻击
|
||||
- 比bcrypt更抗ASIC攻击
|
||||
4. **Pbkdf2PasswordEncoder**
|
||||
- 使用PBKDF2算法
|
||||
- 较老的算法,但广泛支持
|
||||
- 需要高迭代次数才安全
|
||||
|
||||
### Spring Security中的最佳实践
|
||||
|
||||
**最佳实践是使用BCryptPasswordEncoder**,原因包括:
|
||||
|
||||
1. 它是Spring Security默认推荐的编码器
|
||||
2. 自动处理盐值,无需额外存储
|
||||
3. 经过充分的安全审查和实际验证
|
||||
4. 平衡了安全性和性能
|
||||
5. 广泛支持,易于配置
|
||||
|
||||
在Spring Security 5+版本中,BCryptPasswordEncoder是官方文档中首推的密码编码器实现。除非有特殊安全需求,否则应优先选择它。
|
|
@ -35,21 +35,31 @@ public class SecurityConfiguration {
|
|||
}
|
||||
|
||||
/**
|
||||
* 自定义密码加密器,可以自己实现,比如自己实现MD5的加密方式,但是Spring官方不推荐
|
||||
* 一般来说用Spring自带的加密器就完全可以了,Spring提供了如下的编码器。
|
||||
* 如果使用Spring的密码加密器,匹配密码时需要使用 matches 方法
|
||||
* {@link BCryptPasswordEncoder}:
|
||||
* <pre>
|
||||
* 配置密码编码器Bean
|
||||
*
|
||||
* </pre>
|
||||
* <p>Spring Security提供了多种密码编码器实现,推荐使用BCryptPasswordEncoder作为默认选择。</p>
|
||||
*
|
||||
* @return
|
||||
* <p>特点:</p>
|
||||
* <ul>
|
||||
* <li>BCryptPasswordEncoder - 使用bcrypt强哈希算法,自动加盐,是当前最推荐的密码编码器</li>
|
||||
* <li>Argon2PasswordEncoder - 使用Argon2算法,抗GPU/ASIC攻击,但需要更多内存</li>
|
||||
* <li>SCryptPasswordEncoder - 使用scrypt算法,内存密集型,抗硬件攻击</li>
|
||||
* <li>Pbkdf2PasswordEncoder - 使用PBKDF2算法,较老但广泛支持</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>注意:不推荐使用MD5等弱哈希算法,Spring官方也不推荐自定义弱密码编码器。</p>
|
||||
*
|
||||
* @return PasswordEncoder 密码编码器实例
|
||||
* @see BCryptPasswordEncoder
|
||||
*/
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
// 实际项目中只需返回一个密码编码器
|
||||
return new BCryptPasswordEncoder();
|
||||
|
||||
// 自定义实现密码加密器,如果使用自定义不用使用 Bean注入
|
||||
// return new MD5PasswordEncoder();
|
||||
// 其他编码器示例(根据需求选择一种):
|
||||
// return new Argon2PasswordEncoder(16, 32, 1, 1 << 14, 2);
|
||||
// return new SCryptPasswordEncoder();
|
||||
// return new Pbkdf2PasswordEncoder("secret", 185000, 256);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue