本文地址:https://blog.csdn.net/qq_40885085 在我們寫代碼的時候,會書寫許多日誌代碼,但是有些敏感數據是需要進行安全脫敏處理的。 對於日誌脫敏的方式有很多,常見的有①使用conversionRule標簽,繼承MessageConverter②書寫一個脫敏工具類,在列印 ...
本文地址:https://blog.csdn.net/qq_40885085
在我們寫代碼的時候,會書寫許多日誌代碼,但是有些敏感數據是需要進行安全脫敏處理的。
對於日誌脫敏的方式有很多,常見的有①使用conversionRule
標簽,繼承MessageConverter
②書寫一個脫敏工具類,在列印日誌的時候對特定特欄位進行脫敏返回。
兩種方式各有優缺點:
- 第一種方式需要修改代碼,不符合開閉原則。
- 第二種方式,需要在日誌方法的參數進行脫敏,對原生日誌有入侵行為。
自定義脫敏組件(slf4j+logback)
一個項目在書寫了很多列印日誌的代碼,但是後面有了脫敏需求,如果我們去手動改動代碼,會花費大量時間。如果引入本組件,完成配置即可輕鬆完成脫敏。(僅需三步可輕鬆配置)
一、自定義脫敏組件 - 脫敏效果演示
二、自定義脫敏組件 - 使用方式
1、引入Jar包依賴
前提是你將Jar包打入本地倉庫,Jar包地址見後文。
<dependency>
<groupId>pers.liuchengyin</groupId>
<artifactId>logback-desensitization</artifactId>
<version>1.0.0</version>
</dependency>
2、替換日誌文件配置類(logback.xml)
日誌列印方式都只需要替換成脫敏的類即可,如果你的業務不需要,則無需替換。
①ConsoleAppender - 控制台脫敏
// 原類
ch.qos.logback.core.ConsoleAppender
// 替換類
pers.liuchengyin.logbackadvice.LcyConsoleAppender
②RollingFileAppender - 滾動文件
// 原類
ch.qos.logback.core.rolling.RollingFileAppender
// 替換類
pers.liuchengyin.logbackadvice.LcyRollingFileAppender
③FileAppender - 文件
// 原類
ch.qos.logback.core.FileAppender
// 替換類
pers.liuchengyin.logbackadvice.LcyFileAppender
替換示例:
<property name="CONSOLE_LOG_PATTERN"
value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
<!-- ConsoleAppender 控制台輸出日誌 -->
<appender name="CONSOLE" class="pers.liuchengyin.logbackadvice.LcyConsoleAppender">
<encoder>
<pattern>
${CONSOLE_LOG_PATTERN}
</pattern>
</encoder>
</appender>
3、添加脫敏配置文件(logback-desensitize.yml)
該配置文件應該放在resources文件下
三、自定義脫敏組件 - 脫敏規範
1、支持數據類型
八大基本類型及其包裝類型、Map、List、業務里的Pojo對象、List<業務里的Pojo對象>、JSON字元串。
註:在配置文件中配置的時候,只需要配置對象里的屬性值就行。
2、不支持的數據類型
List<八大基本類型及包裝類型>,因為不知道脫敏的數據源具體是哪一個。
3、匹配規則
key + 分割符 + value,目前僅支持冒號(:)和等號(=),示例如下:
log.info("your email:{}, your phone:{}", "[email protected]","15310763497");
log.info("your email={}, your cellphone={}", "[email protected]","15310763497");
key
:定義了對應需要脫敏的關鍵字,如上訴的email、phone等以及業務對象中的欄位、Map中的Key、JSON中的Keyvalue
:需要脫敏的值,如上訴的[email protected]
、15310763497
。
4、日誌規範
建議書寫日誌的時候儘量規範,對於key為中文的是沒有辦法脫敏的,規範程度可以見脫敏效果演示里的代碼。
四、logback-desensitize.yml配置說明
# 日誌脫敏
log-desensitize:
# 是否忽略大小寫匹配,預設為true
ignore: true
# 是否開啟脫敏,預設為false
open: true
# pattern下的key/value為固定脫敏規則
pattern:
# 郵箱 - @前第4-7位脫敏
email: "@>(4,7)"
# qq郵箱 - @後1-3位脫敏
qqemail: "@<(1,3)"
# 姓名 - 姓脫敏,如*傑倫
name: 1,1
# 密碼 - 所有需要完全脫敏的都可以使用內置的password
password: password
patterns:
# 身份證號,key後面的欄位都可以匹配以下規則(用逗號分隔)
- key: identity,idcard
# 定義規則的標識
custom:
# defaultRegex表示使用組件內置的規則:identity表示身份證號 - 內置的18/15位
- defaultRegex: identity
position: 9,13
# 內置的other表示如果其他規則都無法匹配到,則按該規則處理
- defaultRegex: other
position: 9,10
# 電話號碼,key後面的欄位都可以匹配以下規則(用逗號分隔)
- key: phone,cellphone,mobile
custom:
# 手機號 - 內置的11位手機匹配規則
- defaultRegex: phone
position: 4,7
# 自定義正則匹配表達式:座機號(帶區號,號碼七位|八位)
- customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
# -後面的1-4位脫敏
position: "-<(1,4)"
# 自定義正則匹配表達式:座機號(不帶區號)
- customRegex: "^[0-9]{7,8}"
position: 3,5
# 內置的other表示如果其他規則都無法匹配到,則按該規則處理
- defaultRegex: other
position: 1,3
# 這種方式不太推薦 - 一旦匹配不上,就不會脫敏
- key: localMobile
custom:
customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
position: 1,3
Spring Boot 基礎就不介紹了,推薦看這個免費教程:
上面這個配置是相對完整的,一定要嚴格遵守層級配置格式。
自定義脫敏支持的方式
1、key:value的方式
- phone:4,7,表示phone屬性的4-7位進行脫敏
- 原始數據:
13610357861
- 脫敏後:
136****7861
2、以符號作為起始、結束節點作為脫敏標誌
emai:"@>(4,7)"
,@
為脫敏標誌,>
表示其為結束節點,<
表示其為開始節點。即@>
表示對@
之前的進行脫敏,@<
表示對@
之後的進行脫敏。這個示例就是@
前的數據的第4-7位進行脫敏。
註意:這種規則里的雙引號、括弧不能省略,其次
:
和=
不能作為標誌符號,因為和匹配規則有衝突
- 原始數據:
[email protected]
"@>(4,7)"
脫敏後:123****[email protected]
"@<(1,3)"
脫敏後:123456789@***com
3、自定義正則脫敏
patterns:
# 手機號
- key: phone,mobile
custom:
# 手機號的正則
- customRegex: "^1[0-9]{10}"
# 脫敏範圍
position: 4,7
customRegex:正則表達式,如果符合該表達式,則使用其對應的脫敏規則(position)
4、一個欄位,根據多種值含義進行自定義脫敏
比如說,username欄位的值可以是手機號、也可以是郵箱,這個值動態改變的,前面幾種方式都沒辦法解決,可以使用該方式。
patterns:
- key: username
custom:
# 手機號 - 11位
- defaultRegex: phone
position : 4,7
# 郵箱 - @
- defaultRegex: email
position : "@>(3,12)"
# 身份證 - 15/18位
- defaultRegex: identity
position : 1,3
# 自定義正則
- customRegex: "^1[0-9]{10}"
position : 1,3
# 都匹配不到時,按照這種規則來
- defaultRegex: other
position : 1,3
註意:上面示例中匹配規則里的 雙引號和括弧 都不能省略
該組件內置四種匹配規則:手機號、身份證號、郵箱、other(其他匹配不到時用的),內置一種脫敏方式:password,表示完全脫敏,可用於pattren下的。
註:當pattern和patterns下的key有重覆的時候,只會使用pattern下指定的方式進行脫敏。
Jar包地址和源碼地址
Github地址:
Jar包打入Maven本地倉庫的方式
1、下載Jar包,放在一個文件夾里
2、在這個文件夾里打開cmd(打開cmd,進入到這個文件夾)
3、執行命令(前提保證maven配置正常,使用mvn -v
命令查看是否正常,如果顯示版本號表示正常)
mvn install:install-file -DgroupId=pers.liuchengyin -DartifactId=logback-desensitization -Dversion=1.0.0 -Dpackaging=jar -Dfile=logback-desensitization-1.0.0.jar
命令說明:
-DgroupId
表示jar對應的groupId
<groupId>pers.liuchengyin</groupId>
-DartifactId:
表示jar對應的artifactId
<artifactId>logback-desensitization</artifactId>
-Dversion
表示jar對應的 version
<version>1.0.0</version>
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
覺得不錯,別忘了隨手點贊+轉發哦!