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

相关推荐
“负拾捌”3 分钟前
LangChain 中 ChatPromptTemplate 的几种使用方式
python·langchain·prompt
咋吃都不胖lyh31 分钟前
小白零基础教程:安装 Conda + VSCode 配置 Python 开发环境
人工智能·python·conda
刘一说1 小时前
深入理解 Spring Boot Actuator:构建可观测性与运维友好的应用
运维·spring boot·后端
oak隔壁找我1 小时前
Spring AI 入门教程,使用Ollama本地模型集成,实现对话记忆功能。
java·人工智能·后端
郝开1 小时前
最终 2.x 系列版本)2 - 框架搭建:pom配置;多环境配置文件配置;多环境数据源配置;测试 / 生产多环境数据源配置
java·spring boot·后端
闲人编程1 小时前
构建一个短链接生成器服务(FastAPI + SQLite)
jvm·python·sqlite·fastapi·生成器·短链接·caodecapsule
用户3777967210961 小时前
RabbitMQ Unacked 消息深度解析:机制、问题与解决方案
spring boot·rabbitmq
南囝coding2 小时前
100% 用 AI 做完一个新项目,从 Plan 到 Finished 我学到了这些
前端·后端
Homeey2 小时前
深入理解ThreadLocal:从原理到架构实践的全面解析
java·后端
杰瑞哥哥2 小时前
标准 Python 项目结构
开发语言·python