Spring Boot 日誌脫敏,3 步搞定!So easy~!

来源:https://www.cnblogs.com/javastack/archive/2022/09/05/16658337.html
-Advertisement-
Play Games

本文地址: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中的Key
  • value:需要脫敏的值,如上訴的[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 基礎就不介紹了,推薦看這個免費教程:

https://github.com/javastacks/spring-boot-best-practice

上面這個配置是相對完整的,一定要嚴格遵守層級配置格式。

自定義脫敏支持的方式

1、key:value的方式

  • phone:4,7,表示phone屬性的4-7位進行脫敏
  • 原始數據:13610357861
  • 脫敏後:136****7861

2、以符號作為起始、結束節點作為脫敏標誌

emai:"@>(4,7)"@為脫敏標誌,>表示其為結束節點,<表示其為開始節點。即@>表示對@之前的進行脫敏,@<表示對@之後的進行脫敏。這個示例就是@前的數據的第4-7位進行脫敏。

註意:這種規則里的雙引號、括弧不能省略,其次:=不能作為標誌符號,因為和匹配規則有衝突

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包地址和源碼地址

https://github.com/liuchengyin01/LogbackDesensitization/tree/master/repo/pers/liuchengyin/logback-desensitization/1.0.0

Github地址:

https://github.com/liuchengyin01/LogbackDesensitization

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最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 序言 每逢佳節倍思親,想買個東西給家裡,結果發現手速不夠,網速不夠快,沒有時間下單等等各種原因導致最後想買的東西售罄了… 甚至跟你一起搶購的可能是腳本,太真實了! 今天就給大家分享一個python版搶購月餅的腳本,我們要用魔法打敗魔法!話不多說,直接開搞! 準備工作 今天要用的是一個測試工具的庫:S ...
  • 摘要:經常有朋友問,學 Python 面向對象時,翻閱別人代碼,會發現一個 super() 函數,那這個函數的作用到底是什麼? 本文分享自華為雲社區《Python 中的 super 函數怎麼學,怎麼解?》,作者:夢想橡皮擦。 實戰場景 經常有朋友問,學 Python 面向對象時,翻閱別人代碼,會發現 ...
  • 日誌對程式的重要性不言而喻,輕巧、簡單、無需費腦,程式代碼中隨處可見,幫助我們排查定位一個有一個問題問題。但看似不起眼的日誌,卻隱藏著各式各樣的“坑”,如果使用不當,不僅不能幫助我們,反而會成為服務“殺手”。 本文主要介紹生產環境日誌使用不當導致的“坑”及避坑指北,高併發系統下尤為明顯。同時提供一套... ...
  • IO流 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) IO流體系圖 文件 什麼是文件 文件.對我們並不陌生,文件是==保存數據的地方==,比如大家經常使用的word文檔,txt文件.excel文件...都是文件。它既可以保存一張圖 ...
  • django的基本操作 1.django的安裝 (1)在ubuntu上的安裝 sudo pip3 install django==2.1.12(版本號) 檢查安裝是否成功: sudo pip3 freeze|grep -i ‘Django' 有輸出django==2.2.12 表示安裝成功 (2)在 ...
  • Golang只有二十五個系統保留關鍵字,二十幾個系統內置函數,加起來只有五十個左右需要記住的關鍵字,縱觀編程宇宙,無人能出其右。其中還有一些保留關鍵字屬於“錦上添花”,什麼叫錦上添花?就是從錶面上看,就算沒有,也無傷大雅,不影響業務或者邏輯的實現,比如lambda表達式之類,沒有也無所謂,但在初始化 ...
  • 前言 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 又到了學Python時刻~今天我們來採集一下評論數據! WB態數據抓包+所有的數據提取方式+詞雲圖可視化 開發環境: python 3.8: 解釋器 pycharm: 代碼編輯器 requests 第三方模塊 採集評論代碼 # 導入模塊 import r ...
  • “並行和併發有什麼區別?” 關於這個問題,很多工作5年以上的同學都回答不出來。 或者說,自己有一定的理解,但是不知道怎麼表達。 大家好,我是Mic,一個工作了14年的Java程式員。 關於這個問題,面試官想考察什麼呢? 問題解析 並行和併發最早其實描述的是Java併發編程裡面的概念。 他們強調的是C ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...