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注解),可全方位保护敏感信息。建议结合多种方案,确保密码在存储、传输和展示时均处于脱敏状态。

相关推荐
Super Rookie6 分钟前
Spring Boot 企业项目技术选型
java·spring boot·后端
来自宇宙的曹先生8 分钟前
用 Spring Boot + Redis 实现哔哩哔哩弹幕系统(上篇博客改进版)
spring boot·redis·后端
电商数据girl20 分钟前
有哪些常用的自动化工具可以帮助处理电商API接口返回的异常数据?【知识分享】
大数据·分布式·爬虫·python·系统架构
CoooLuckly23 分钟前
numpy数据分析知识总结
python·numpy
expect7g29 分钟前
Flink-Checkpoint-1.源码流程
后端·flink
00后程序员36 分钟前
Fiddler中文版如何提升API调试效率:本地化优势与开发者实战体验汇总
后端
超龄超能程序猿39 分钟前
(六)PS识别:源数据分析- 挖掘图像的 “元语言”技术实现
python·组合模式
用户8122199367221 小时前
C# .Net Core零基础从入门到精通实战教程全集【190课】
后端
bobz9651 小时前
FROM scratch: docker 构建方式分析
后端
amazinging1 小时前
北京-4年功能测试2年空窗-报培训班学测开-第四十四天
python·学习·appium