再也不用手動脫敏!Java 日志敏感信息一鍵搞定,Sensitive 框架震撼登場
在企業級 Java 開發中,日志往往是最重要的“真相記錄者”——它精準地還原了系統運行的全過程。然而,日志也可能成為“信息泄露的溫床”:用戶身份證號、手機號、銀行卡號、甚至密碼,可能在日志中赤裸裸地暴露出來。 這不僅違反合規要求(如《個人信息保護法》《GDPR》),還可能給企業帶來不可估量的安全風險。
那么,有沒有一種優雅的方式,既能記錄日志,又能自動隱藏敏感信息? 答案是肯定的——這就是 Sensitive 框架。
本文將帶你從零上手這一輕量卻強大的日志脫敏工具,詳解其核心功能、實戰用法、與日志框架的無縫集成方案,以及在高并發場景下的性能優化技巧。
什么是 Sensitive 框架?
Sensitive 是一款由社區開發者 houbb 打造的開源 Java 脫敏工具框架。 它的設計理念非常純粹:讓日志在保留業務可讀性的同時,自動屏蔽敏感數據。
框架基于注解驅動,開發者只需在類字段上添加注解,即可讓框架在運行時動態識別并脫敏數據。 無需手寫字符串替換邏輯,也不用擔心遺漏任何敏感字段。
它的核心模塊主要位于以下路徑:
/src/main/java/com/icoderoad/sensitive/框架內部基于以下理念設計:
- 注解驅動 → 簡化使用方式;
- 策略化脫敏 → 不同信息類型匹配不同規則;
- 可擴展性強 → 支持自定義策略與條件;
- 可深度集成 → 無縫對接 Logback、Log4j2;
- 性能優先 → 支持深拷貝與緩存機制。
核心功能概覽
基于注解的自動脫敏
通過在字段上添加 @Sensitive 注解并指定策略類,Sensitive 就能自動識別敏感數據并進行脫敏處理。
package com.icoderoad.sensitive.model;
import com.github.houbb.sensitive.annotation.Sensitive;
import com.github.houbb.sensitive.core.api.strategy.*;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
@Sensitive(strategy = StrategyChineseName.class)
private String username;
@Sensitive(strategy = StrategyCardId.class)
private String idCard;
@Sensitive(strategy = StrategyPassword.class)
private String password;
}只需這樣簡單的注解標記,當日志打印 User 對象時,框架就會自動將這些字段處理成安全格式。
豐富的內置策略庫
Sensitive 框架默認內置了多種常見脫敏策略,包括:
- 中文姓名(
StrategyChineseName) - 身份證號(
StrategyCardId) - 手機號(
StrategyPhone) - 郵箱(
StrategyEmail) - 密碼(
StrategyPassword)
例如手機號 13800138000 將自動轉換為 138****8000,郵箱 example@qq.com 將轉換為 exa***@qq.com。
自定義脫敏策略
對于項目中的特殊字段(如訂單號、業務編號等),你可以實現 IStrategy 接口來自定義邏輯。
package com.icoderoad.sensitive.strategy;
import com.github.houbb.sensitive.api.IContext;
import com.github.houbb.sensitive.api.IStrategy;
public class CustomStrategy implements IStrategy {
@Override
public Object des(Object original, IContext context) {
String value = (String) original;
return value.substring(0, 3) + "***" + value.substring(value.length() - 3);
}
}在字段上使用:
@Sensitive(strategy = com.icoderoad.sensitive.strategy.CustomStrategy.class)
private String orderCode;深拷貝與嵌套對象支持
Sensitive 不僅支持基本對象的脫敏,還支持對包含嵌套對象或集合的復雜結構進行遞歸脫敏。
package com.icoderoad.sensitive.model;
import com.github.houbb.sensitive.annotation.*;
import com.github.houbb.sensitive.core.api.strategy.*;
import lombok.Data;
import java.util.List;
@Data
public class Order {
@SensitiveEntry
private User user;
@SensitiveEntry
private List<Product> products;
}測試代碼:
Order order = new Order();
order.setUser(user);
order.setProducts(Arrays.asList(product1, product2));
Order safeOrder = SensitiveUtil.desCopy(order);
System.out.println("脫敏前:" + order);
System.out.println("脫敏后:" + safeOrder);框架會遞歸處理內部對象的所有敏感字段,徹底杜絕遺漏。
FastJSON 脫敏輸出支持
在 Web 應用中,Sensitive 與 FastJSON 完美兼容,可直接生成脫敏后的 JSON 輸出,防止敏感信息通過 API 泄露。
String json = JSON.toJSONString(SensitiveUtil.desCopy(user));條件生效策略(Conditional Desensitization)
可通過實現 ICondition 接口,讓某些脫敏規則僅在特定條件下生效(如僅普通用戶脫敏)。
package com.icoderoad.sensitive.condition;
import com.github.houbb.sensitive.api.strategy.IContext;
import com.github.houbb.sensitive.api.strategy.ICondition;
import com.icoderoad.sensitive.model.User;
public class NonAdminCondition implements ICondition {
@Override
public boolean valid(IContext context) {
Object obj = context.getCurrentObject();
if (obj instanceof User) {
return !((User) obj).isAdmin();
}
return false;
}
}注解使用:
@Sensitive(strategy = StrategyCardId.class, condition = NonAdminCondition.class)
private String idCard;環境準備與依賴配置
Maven 依賴配置
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-core</artifactId>
<version>1.7.0</version>
</dependency>如果要集成日志框架:
<!-- Logback 支持 -->
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-logback</artifactId>
<version>1.7.0</version>
</dependency>
<!-- Log4j2 支持 -->
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-log4j2</artifactId>
<version>1.7.0</version>
</dependency>與日志框架無縫集成
Logback 集成
/src/main/resources/logback-spring.xml
<configuration>
<conversionRule conversionWord="sensitive"
converterClass="com.github.houbb.sensitive.logback.converter.SensitiveConverter"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %sensitive(%msg)%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>只需使用 %sensitive(%msg),日志消息自動脫敏。
Log4j2 集成
/src/main/resources/log4j2.xml
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Filters>
<SensitiveFilter>
<Patterns>
<Pattern>(\d{3})\d{4}(\d{4})</Pattern>
<Pattern>(\d{4})\d{10}(\w{4})</Pattern>
</Patterns>
<Replacement>$1****$2</Replacement>
</SensitiveFilter>
</Filters>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>性能優化實踐
復用策略對象 避免在高頻場景下重復創建策略實例:
public class SensitiveUtils {
private static final IStrategy CUSTOM_STRATEGY = new CustomStrategy();
public static Object desensitize(Object value) {
return CUSTOM_STRATEGY.des(value, null);
}
}批量脫敏處理
List<User> sensitiveUsers = SensitiveUtil.desCopyCollection(userList);結果緩存加速
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
public class SensitiveCache {
private static final Cache<String, Object> cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build();
}總結與展望
在數據安全要求愈發嚴格的今天,Sensitive 框架無疑是 Java 開發者的安全利器。 它通過簡潔的注解體系、豐富的內置策略、靈活的擴展機制與日志框架的深度融合,實現了:
一鍵脫敏日志輸出 支持自定義策略與條件邏輯 高性能深拷貝與緩存機制 與 Logback/Log4j2 無縫對接
無論是金融、電商還是政務系統,只要涉及個人隱私數據的日志記錄場景,Sensitive 都值得納入你的安全體系中。
如果你還在為“日志中泄露敏感信息”而焦慮,不妨嘗試將 Sensitive 引入你的項目,用更優雅的方式守護數據安全。
未來,我們期待它能支持更多序列化框架(如 Jackson、Gson)與云原生日志系統,讓“安全日志”成為 Java 世界的新標準。





























