diff --git a/spring-security/step-1/ReadMe.md b/spring-security/step-1/ReadMe.md index b255da8..4ed2da5 100644 --- a/spring-security/step-1/ReadMe.md +++ b/spring-security/step-1/ReadMe.md @@ -192,7 +192,7 @@ public PasswordEncoder passwordEncoder() { - 较老的算法,但广泛支持 - 需要高迭代次数才安全 -### Spring Security中的最佳实践 +#### 最佳实践 **最佳实践是使用BCryptPasswordEncoder**,原因包括: @@ -202,4 +202,57 @@ public PasswordEncoder passwordEncoder() { 4. 平衡了安全性和性能 5. 广泛支持,易于配置 -在Spring Security 5+版本中,BCryptPasswordEncoder是官方文档中首推的密码编码器实现。除非有特殊安全需求,否则应优先选择它。 \ No newline at end of file +在Spring Security 5+版本中,BCryptPasswordEncoder是官方文档中首推的密码编码器实现。除非有特殊安全需求,否则应优先选择它。 + +### 实现自定义校验器 + +在Spring Security中,自定义密码编码器需要实现`PasswordEncoder`接口。 + +以下是实现MD5示例及注意事项: + +```java +/** + *
MD5算法因其计算速度快且易受彩虹表攻击而被认为不安全。即使密码哈希本身是单向的, + * 但现代计算能力使得暴力破解和预先计算的彩虹表攻击变得可行。
+ * + *Spring Security推荐使用BCrypt、PBKDF2、Argon2或Scrypt等自适应单向函数替代MD5。
+ * + * @see PasswordEncoder + * 一般仅用于遗留系统兼容,新系统应使用更安全的密码编码器 + */ +public class MD5PasswordEncoder implements PasswordEncoder { + + @Override + public String encode(CharSequence rawPassword) { + if (rawPassword == null) { + throw new IllegalArgumentException("原始密码不能为null"); + } + + byte[] md5Digest = DigestUtils.md5Digest(rawPassword.toString().getBytes()); + return HexFormat.of().formatHex(md5Digest); + } + + @Override + public boolean matches(CharSequence rawPassword, String encodedPassword) { + if (rawPassword == null) { + throw new IllegalArgumentException("原始密码不能为null"); + } + + if (!StringUtils.hasText(encodedPassword)) { + return false; + } + + return encodedPassword.equalsIgnoreCase(encode(rawPassword)); + } + + @Override + public boolean upgradeEncoding(String encodedPassword) { + // MD5已不安全,始终返回true建议升级到更安全的算法 + return true; + } +} +``` \ 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 d2f2638..2279036 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 @@ -54,12 +54,12 @@ public class SecurityConfiguration { */ @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); + + // 实际项目中只需返回一个密码编码器 + return new BCryptPasswordEncoder(); } }