上個月公司另一個團隊做的新專案上線後大體上執行穩定,但包括研發負責人在內的兩個人在專案上線後立馬就跳槽了,然後又交接給了我這個「垃圾回收人員」。
本週甲方另一個廠家的監控平臺掃描到我們這個專案某些介面的一些敏感資訊沒有做加密,要求我們立馬處理。
檢查了一下發現還真是這樣,手機、身份證號什麼的都沒脫敏,心裡頓時一萬頭神獸在奔騰。
還好,我有長期應對這類突發事情的經驗,直接寫了一個自定義註解,然後在需要加解密的介面上加上,和前端一聯調,歐克搞定,之後臉上保持沉重,但內心淡定摸魚,好不瀟灑。
趁著摸魚的空閒,我把實現方法簡化後用最易懂的方式分享出來,大家可以收藏一下,哪天用得上可以撈出來瞅瞅,節省點思考的時間。
我們定義兩個實體類,一個是模擬查詢使用者資訊時介面響應返回的物件UserInfo。
一個是儲存使用者時的請求物件UserInfoReq
這樣,我們就可以分別來測試一下查詢介面返回物件敏感屬性加密的情況,和儲存介面請求物件敏感屬性解密的情況了。
這裡,我們主要加上金鑰的自定義設定,便於靈活修改。
這裡,我們給註解定義了兩個引數,分別是請求時要給哪些屬性解密,以及響應時要給哪些屬性加密,並分別給了預設值。
加解密工具類我們使用了Hutool提供的AES加解密工具
這裡注意兩點:
1)、工具類中獲取yml設定,要加上@component註解,然後給變數設定static,但set方法去掉static,@Value獲取放在set方法上即可,否則不會生效;
2)、構建AES工具要放在@PostConstruct註解中,表示Spring容器初始化這個Bean之後載入的內容,不這樣處理直接構建的話會丟擲空指標異常。
這裡是自定義註解的AOP切面類,也是具體實現,核心思想還是利用Java的反射機制,其中的一些寫法大體都是固定的,可以適當理解,不建議過分領悟,以免造成困擾。
首先,我們來測試一下查詢介面,針對返回物件的部分敏感屬性進行加密。
這裡,我們設定reqPropsName={},表示不對請求引數做加解密操作,設定respPropsName={"phone"、"idCard"、"name"},表示對返回物件中的手機號、身份證號、姓名進行加密返回。
其次,我們來測試一下儲存介面,針對請求物件的部分已加密屬性進行解密。
這裡,我們設定reqPropsName={"phone"、"idCard"、"name"},表示對請求引數中的手機號、身份證號、姓名做解密操作,設定respPropsName={},表示對返回物件不做加密操作。
儲存介面執行後我們直接返回這個物件就行,看看是不是已經解密了。
查詢介面返回物件加密效果
儲存介面請求物件解密效果
自定義註解可以實現的功能很多,比如之前給大家寫過的一篇防重複提交註解,重點是AOP的思想,寫法大體上都是固定的。
這裡的加解密註解依然有侷限性:
1)、只支援有明確公共返回物件的介面,比如這裡的Result;
2)、只支援@RequestBody請求物件,其他諸如多個param引數、Map等形式都不支援,可以自行擴充套件;
雖然不完美,但大體上已經夠用,因為大部分SpringBoot專案都是遵循規範的,都會定義公共的返回物件,絕大部分請求介面也都是@RequesetBody來接收的。
AOP切面的實現中,針對請求物件的型別也留下了口子,感興趣的小夥伴可以下載原始碼自行擴充套件,拿來練習都是不錯的選擇。
原始碼會在評論區中給出來哦~
原創文章純手打,覺得有一滴滴幫助就請舉手之勞點個推薦吧~
持續分享工作中的真實經驗和心得體會,喜歡的話就點個關注吧~