背景
在開發過程中,很容易將使用者敏感資訊,例如手機號碼、身份證等,列印在日誌平臺。為了保護使用者資料,又不影響日誌的列印,需要將日誌中的敏感資訊進行脫敏。
效果
沒看明白,強烈建議 pull專案,執行一下專案中
SensitiveUtils#main
方法。
特性
- 支援多層級【Json】/【物件】欄位脫敏
- 支援一次多欄位脫敏
- 支援除【連續陣列層次(下面會舉例)】脫敏
使用
-
輸入為字串/物件及單Json路徑
// 傳入物件 User user = new User(); user.setName("xiaoming"); user.setPhone("13455556666"); String strResult4 = SensitiveUtils.desMobilePhone(user, "phone"); System.out.println(strResult4); // {"phone":"134****6666","name":"xiaoming"} // 傳入json字串 String str1 = "{\"name\":\"xiaoming\",\"phone\":\"13455556666\"}"; String strResult5 = SensitiveUtils.desMobilePhone(str1, "phone"); System.out.println(strResult5); // {"phone":"134****6666","name":"xiaoming"}
-
輸入為字串/物件及多Json路徑
上圖中,如果要脫敏全部手機號,路徑則為 :
phone
,parent#phone
String str8 = "[{\"name\":\"xiaoliu\",\"phone\":\"13522222222\",\"parent\":[{\"name\":\"oldliu\",\"phone\":\"13533333333\"}]},{\"name\":\"xiaowang\",\"phone\":\"13500000000\",\"parent\":[{\"name\":\"oldwang\",\"phone\":\"13511111111\"},{\"name\":\"oldzhang\",\"phone\":\"13555555555\"}]}]"; String strResult8 = SensitiveUtils.desMobilePhone(str8, new HashSet<>(Arrays.asList("phone", "parent#phone"))); System.out.println(strResult8); // [{"parent":[{"phone":"135****3333","name":"oldliu"}],"phone":"135****2222","name":"xiaoliu"},{"parent":[{"phone":"135****1111","name":"oldwang"},{"phone":"135****5555","name":"oldzhang"}],"phone":"135****0000","name":"xiaowang"}]
上圖中,如果要脫敏全部手機號,路徑則為 :
phone
,parent#phone
String str9 = "{\"name\":\"xiaowang\",\"phone\":\"13500000000\",\"parent\":{\"name\":\"oldwang\",\"phone\":\"13511111111\"}}"; String strResult9 = SensitiveUtils.desMobilePhone(str9, new HashSet<>(Arrays.asList("phone", "parent#phone"))); System.out.println(strResult9);
已知缺陷
-
暫不支援連續倆層陣列結構的JSON字串/物件
-
暫不支援對String以外型別脫敏
-
暫不支援字串中【物件JSON字串】脫敏
{ "info": "{\"data\":\"{\\\"phone\\\":\\\"13444444444\\\"}\"}" }
未來最佳化方向
- 增加更多脫敏型別(如身份證號碼)
- 支援一個物件/Json字串多種脫敏型別,例如:一個字串同時脫敏手機號、身份證號
- 連續陣列脫敏(待定)
- 支援非String型別欄位脫敏(待定)
- 字串中【物件JSON字串】脫敏(待定)
Github地址
https://github.com/handsometaoa/SensitiveUtils