Springboot+Hutool自定義注解實現(xiàn)數(shù)據(jù)脫敏
一、前言
我們在項目中會處理敏感數(shù)據(jù)(如手機號、身份證號、姓名、地址等)時,通常需要對這些數(shù)據(jù)進行脫敏,以確保數(shù)據(jù)隱私和安全。
我們本次使用 Hutool
庫來輕松實現(xiàn)數(shù)據(jù)脫敏,如果項目中不讓使用,可以自己防著hutool來寫一些工具類。
本次使用Springboot整合Hutool來自定義注解實現(xiàn)數(shù)據(jù)脫敏!
二、什么是數(shù)據(jù)脫敏
數(shù)據(jù)脫敏(Data Masking)
,也稱為數(shù)據(jù)遮蔽或數(shù)據(jù)隱藏,是一種 數(shù)據(jù)保護技術
,用于處理和存儲敏感數(shù)據(jù)時,以減少或消除數(shù)據(jù)中的敏感信息,從而保護數(shù)據(jù)的隱私和安全。數(shù)據(jù)脫敏的主要目的是在保持數(shù)據(jù)可用性的同時,減少數(shù)據(jù)泄露和濫用的風險。
數(shù)據(jù)脫敏一般指數(shù)據(jù)庫正常存儲,返回前端時進行數(shù)據(jù)庫處理!
三、Hutool簡介
Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函數(shù)式語言般的優(yōu)雅,讓Java語言也可以“甜甜的”。
Hutool是項目中“util”包友好的替代,它節(jié)省了開發(fā)人員對項目中公用類和公用工具方法的封裝時間,使開發(fā)專注于業(yè)務,同時可以最大限度的避免封裝不完善帶來的bug。
雖然Hutool可能會有一些bug,比起小編寫的還是強上不少的,所以選定它來!
現(xiàn)在最新版為: 5.8.16
,我們直接使用最新的,bug會少一些,功能會完善一些!
支持的脫敏規(guī)則:
- 用戶id
- 中文姓名
- 身份證號
- 座機號
- 手機號
- 地址
- 電子郵件
- 密碼
- 中國大陸車牌,包含普通車輛、新能源車輛
- 銀行卡
四、實戰(zhàn)整合
1. 導入依賴
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> </dependency>
2. 自定義注解
@JsonSerialize(using = SensitiveInfoSerializer.class)
用于指定在序列化時應該使用哪個自定義序列化器類
需要和下面的注解搭配使用 SensitiveInfoSerializer
我們自定義的序列化器才會生效
@JacksonAnnotationsInside
主要用于標記其他自定義注解,這意味著你可以在一個 Jackson 注解內部使用其他自定義注解,以組合各種注解來實現(xiàn)更復雜的序列化和反序列化邏輯。
/** * @author wangzhenjun * @date 2023/9/11 14:15 */ @JacksonAnnotationsInside @JsonSerialize(using = SensitiveInfoSerializer.class) @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Desensitization { DesensitizationType type() default DesensitizationType.DEFAULT; /** * 前置不需要打碼的長度 */ int prefixLen() default 0; /** * 后置不需要打碼的長度 */ int suffixLen() default 0; /** * 遮罩字符 */ String maskingChar() default "*"; }
3. 支持類型枚舉
/** * @author wangzhenjun * @date 2023/9/11 14:43 */ public enum DesensitizationType { // 自定義規(guī)則 CUSTOMIZE_RULE, // 默認的 DEFAULT, //用戶id USER_ID, //中文名 CHINESE_NAME, //身份證號 ID_CARD, //座機號 FIXED_PHONE, //手機號 MOBILE_PHONE, //地址 ADDRESS, //電子郵件 EMAIL, //密碼 PASSWORD, //中國大陸車牌,包含普通車輛、新能源車輛 CAR_LICENSE, //銀行卡 BANK_CARD }
4. 自定義序列化器
關于自定義的規(guī)則,大家可以根據(jù)自己的需求來寫工具類,我這里簡單使用Hutool的工具來了!
StrUtil.replace(value, prefixLen, suffixLen, maskingChar)
StrUtil.hide(value, prefixLen, suffixLen)
createContextual
方法首先在序列化過程開始時被調用,返回的序列化器實例將用于后續(xù)的序列化過程。
serialize
方法責實際的序列化邏輯,將字段的值轉換為JSON,并可以在其中執(zhí)行自定義的脫敏邏輯。
/** * 數(shù)據(jù)脫敏序列化器 * * @author wangzhenjun * @date 2023/9/11 14:16 */ public class SensitiveInfoSerializer extends JsonSerializer<String> implements ContextualSerializer { private boolean useMasking = false; private DesensitizationType type; private int prefixLen; private int suffixLen; private String maskingChar; @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (useMasking && value != null) { switch (type) { case MOBILE_PHONE: gen.writeString(DesensitizedUtil.mobilePhone(value)); break; case ID_CARD: gen.writeString(DesensitizedUtil.idCardNum(value, prefixLen, suffixLen)); break; case CUSTOMIZE_RULE: // gen.writeString(StrUtil.replace(value, prefixLen, suffixLen, maskingChar)); gen.writeString(StrUtil.hide(value, prefixLen, suffixLen)); break; case CHINESE_NAME: gen.writeString(DesensitizedUtil.chineseName(value)); break; case DEFAULT: gen.writeString(value); default: gen.writeString(value); } } else { gen.writeObject(value); } } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { if (property != null) { Desensitization desensitization = property.getAnnotation(Desensitization.class); if (desensitization != null) { this.type = desensitization.type(); this.prefixLen = desensitization.prefixLen(); this.suffixLen = desensitization.suffixLen(); this.maskingChar = desensitization.maskingChar(); useMasking = true; } } return this; } }
5. 實體類應用
/** * @author wangzhenjun * @date 2023/9/12 9:15 */ @Data public class User { @Desensitization(type = DesensitizationType.ID_CARD,prefixLen = 6,suffixLen = 16) private String cardId; @Desensitization(type = DesensitizationType.CHINESE_NAME) private String name; @Desensitization(type = DesensitizationType.MOBILE_PHONE) private String phone; @Desensitization(type = DesensitizationType.CUSTOMIZE_RULE,prefixLen = 3,suffixLen = 6) private String info; }
6. 測試
@GetMapping("/getUser") public Result getUser(){ User user = new User(); user.setCardId("372911111111111111"); user.setPhone("15822229999"); user.setName("趙飛燕"); user.setInfo("這是機密文件,該打碼打碼"); return Result.success(user); }
完美脫敏,此次應該有掌聲!
五、總結
本文通過Spring Boot與Hutool庫的結合使用自定義注解,提供了一個簡單而強大的方式來實現(xiàn)數(shù)據(jù)脫敏。希望能幫助到你,成功地實現(xiàn)數(shù)據(jù)脫敏功能,并提高應用程序的安全性。
本次例子脫敏選項沒有演示全,大家可以自行補充完成,成為你們需要的數(shù)據(jù)脫敏策略,從而完美的處理用戶數(shù)據(jù)脫敏問題!
可以試著使用AOP來完成脫敏,有興趣的可以試一下哈!
以上就是Springboot+Hutool自定義注解實現(xiàn)數(shù)據(jù)脫敏的詳細內容,更多關于Springboot Hutool數(shù)據(jù)脫敏的資料請關注腳本之家其它相關文章!
- SpringBoot使用自定義注解實現(xiàn)數(shù)據(jù)脫敏過程詳細解析
- SpringBoot實現(xiàn)返回值數(shù)據(jù)脫敏的步驟詳解
- Springboot+Jackson自定義注解數(shù)據(jù)脫敏的項目實踐
- SpringBoot利用自定義注解實現(xiàn)隱私數(shù)據(jù)脫敏(加密顯示)的解決方案
- SpringBoot利用自定義json序列化器實現(xiàn)敏感字段數(shù)據(jù)脫敏詳解
- 淺析如何在SpringBoot中實現(xiàn)數(shù)據(jù)脫敏
- SpringBoot數(shù)據(jù)脫敏的實現(xiàn)示例
- SpringBoot接口返回數(shù)據(jù)脫敏(Mybatis、Jackson)
相關文章
java調用微信接口實現(xiàn)網(wǎng)頁分享小功能
這篇文章主要為大家詳細介紹了java調用微信接口實現(xiàn)網(wǎng)頁分享小功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04Java開發(fā)工具Eclipse使用技巧全局搜索和更替
這篇文章主要介紹了Java開發(fā)工具Eclipse使用技巧全局搜索和更替,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01Spring Jpa多數(shù)據(jù)源工程配置過程解析
這篇文章主要介紹了Spring Jpa多數(shù)據(jù)源工程配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08Java使用get請求接收List集合數(shù)據(jù)(json)并導出報表問題
這篇文章主要介紹了Java使用get請求接收List集合數(shù)據(jù)(json)并導出報表問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11解決Springboot2.1.x配置Activiti7單獨數(shù)據(jù)源問題
這篇文章主要介紹了Springboot2.1.x配置Activiti7單獨數(shù)據(jù)源問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09基于Jenkins搭建.NET Core持續(xù)集成環(huán)境過程圖解
這篇文章主要介紹了基于Jenkins搭建.NET Core持續(xù)集成環(huán)境過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08