Spring Boot中如何对密码等敏感信息进行脱敏处理

以下是常见的脱敏方法及实现步骤,涵盖配置、日志和API响应等多个层面:


1. 配置文件敏感信息脱敏

(1) 使用加密库(如Jasypt)

步骤​:

  1. 添加依赖:

    复制代码
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>
  2. 加密密码:

    复制代码
    BasicTextEncryptor encryptor = new BasicTextEncryptor();
    encryptor.setPassword("your-secret-key"); // 加密密钥
    String encryptedPassword = encryptor.encrypt("your-real-password");
  3. 在配置文件中使用加密值(用ENC()包裹):

    复制代码
    spring:
      datasource:
        password: ENC(encryptedPassword)
  4. 启动时指定密钥:

    复制代码
    java -jar your-app.jar --jasypt.encryptor.password=your-secret-key

(2) 自定义属性源(实现PropertySource
复制代码
public class MaskedPropertySource extends PropertySource<Map<String, Object>> {
    public MaskedPropertySource(String name, Map<String, Object> source) {
        super(name, source);
    }

    @Override
    public Object getProperty(String name) {
        Object value = source.get(name);
        if (name.contains("password") && value != null) {
            return "​**​*​**​*"; // 返回脱敏值
        }
        return value;
    }
}

2. 日志脱敏

(1) 使用Logback的replace功能

logback-spring.xml中配置脱敏规则:

复制代码
<configuration>
    <conversionRule conversionWord="maskedMsg" converterClass="com.example.MaskingPatternLayout"/>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %maskedMsg%n</pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

自定义转换器:

复制代码
public class MaskingPatternLayout extends PatternLayout {
    @Override
    public String doLayout(ILoggingEvent event) {
        String message = super.doLayout(event);
        return message.replaceAll("password\":\"(.*?)\"", "password\":\"​**​*​**​*\"");
    }
}

3. API响应脱敏

(1) 使用Jackson注解忽略敏感字段
复制代码
public class UserDTO {
    private String username;

    @JsonIgnore // 完全忽略该字段
    private String password;

    @JsonProperty(access = Access.WRITE_ONLY) // 仅允许写入,响应时不序列化
    private String secretKey;
}
(2) 自定义序列化器
复制代码
public class PasswordSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider provider) 
        throws IOException {
        gen.writeString("​**​*​**​*"); // 返回固定脱敏值
    }
}

// 在DTO字段上指定序列化器
public class UserResponse {
    @JsonSerialize(using = PasswordSerializer.class)
    private String password;
}

4. 其他注意事项

  • 环境变量 :优先使用环境变量传递敏感信息,而非明文配置文件:

    复制代码
    export SPRING_DATASOURCE_PASSWORD=your_password
  • 安全存储密钥:加密密钥(如Jasypt的密钥)应通过安全渠道(如KMS、Vault)管理,避免硬编码。

  • 代码审查 :避免在代码中硬编码密码,使用.gitignore排除敏感配置文件。


总结

通过配置文件加密(如Jasypt)、日志脱敏(Logback替换)和API响应控制(Jackson注解),可全方位保护敏感信息。建议结合多种方案,确保密码在存储、传输和展示时均处于脱敏状态。

相关推荐
IT学长编程几秒前
计算机毕设选题 基于SpringBoot的书店管理系统的设计与实现 网上书店系统 前后端分离 Java毕设项目 毕业设计选题 【附源码+文档报告+安装调试】
java·spring boot·毕业设计·课程设计·前后端分离·网上书店系统·书店管理系统
王琦0318几秒前
Python 综合大作业
python
IT学长编程3 分钟前
计算机毕设选题 基于SpringBoot的房产租赁管理系统 房屋租赁系统 前后端分离 Java毕设项目 毕业设计选题 【附源码+文档报告+安装调试】
java·spring boot·毕业设计·课程设计·房屋租赁系统·房产租赁系统·文档报告
Dxy123931021625 分钟前
Python自动连接已保存WiFi
开发语言·python
依旧很淡定1 小时前
Selenium(Python)创建Chrome浏览器实例
chrome·python·selenium
中文Python1 小时前
小白中文Python-db_桌面小黄鸭宠物
数据库·python·pygame·宠物·中文python·小白学python
李慕婉学姐1 小时前
【开题答辩过程】以《基于 Spring Boot 的宠物应急救援系统设计与实现》为例,不会开题答辩的可以进来看看
数据库·spring boot·宠物
canonical_entropy2 小时前
DDD本质论:从哲学到数学,再到工程实践的完整指南之理论篇
后端·低代码·领域驱动设计
一只大头猿2 小时前
基于SpringBoot和Vue的超市管理系统
前端·vue.js·spring boot
后端小张2 小时前
SpringBoot 控制台秒变炫彩特效,秀翻同事指南!
java·后端