以下是常见的脱敏方法及实现步骤,涵盖配置、日志和API响应等多个层面:
1. 配置文件敏感信息脱敏
(1) 使用加密库(如Jasypt)
步骤:
-
添加依赖:
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
-
加密密码:
BasicTextEncryptor encryptor = new BasicTextEncryptor(); encryptor.setPassword("your-secret-key"); // 加密密钥 String encryptedPassword = encryptor.encrypt("your-real-password");
-
在配置文件中使用加密值(用
ENC()
包裹):spring: datasource: password: ENC(encryptedPassword)
-
启动时指定密钥:
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注解),可全方位保护敏感信息。建议结合多种方案,确保密码在存储、传输和展示时均处于脱敏状态。