密码脱敏(加密存储)

发布于:2025-06-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

 

<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 的特性之一,但能正确匹配原始密码


网站公告

今日签到

点亮在社区的每一天
去签到