diff --git a/spring-security/step-1/ReadMe.md b/spring-security/step-1/ReadMe.md index eeef4ec..b255da8 100644 --- a/spring-security/step-1/ReadMe.md +++ b/spring-security/step-1/ReadMe.md @@ -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 + * + *
Spring Security提供了多种密码编码器实现,推荐使用BCryptPasswordEncoder作为默认选择。
+ * + *特点:
+ *注意:不推荐使用MD5等弱哈希算法,Spring官方也不推荐自定义弱密码编码器。
+ * + * @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是官方文档中首推的密码编码器实现。除非有特殊安全需求,否则应优先选择它。 \ No newline at end of file diff --git a/spring-security/step-1/src/main/java/com/spring/security/config/SecurityConfiguration.java b/spring-security/step-1/src/main/java/com/spring/security/config/SecurityConfiguration.java index cd49dbf..d2f2638 100644 --- a/spring-security/step-1/src/main/java/com/spring/security/config/SecurityConfiguration.java +++ b/spring-security/step-1/src/main/java/com/spring/security/config/SecurityConfiguration.java @@ -35,21 +35,31 @@ public class SecurityConfiguration { } /** - * 自定义密码加密器,可以自己实现,比如自己实现MD5的加密方式,但是Spring官方不推荐 - * 一般来说用Spring自带的加密器就完全可以了,Spring提供了如下的编码器。 - * 如果使用Spring的密码加密器,匹配密码时需要使用 matches 方法 - * {@link BCryptPasswordEncoder}: - *+ * 配置密码编码器Bean * - *+ *
Spring Security提供了多种密码编码器实现,推荐使用BCryptPasswordEncoder作为默认选择。
* - * @return + *特点:
+ *注意:不推荐使用MD5等弱哈希算法,Spring官方也不推荐自定义弱密码编码器。
+ * + * @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); } }