數據脫敏之由手機號生成虛擬手機號


名詞解釋(來自百度百科)

數據脫敏:數據脫敏是指對某些敏感信息通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。在涉及客戶安全數據或者一些商業性敏感數據的情況下,在不違反系統規則條件下,對真實數據進行改造並提供測試使用,如身份證號、手機號、卡號、客戶號等個人信息都需要進行數據脫敏。

一、需求描述

  隨着社會的發展公司對於客戶隱私保護越來越重視,最近接到一個數據脫敏的需求,需要將現有數據庫中的真實手機號進行脫敏,保證滿足以下要求:1.生成的虛擬手機號不重復;2.前三位和后四位尾號與原手機號保持一致用於客服確認客戶身份;4.與原手機號長度保持一致;5.虛擬號與手機號有一對一對應關系。

二、需求分析

  基於上述需求,至少需要一張表存手機號與虛擬號的映射關系,一般公司都會有會員號,會員詳情接口可以查到真實手機號,如果沒有會員號再存真實手機號,既然是脫敏肯定不能明文存真實手機號,要用加密算法加密存密文,最好用公司統一加解密不要本地保存秘鑰,這樣連你自己都不知道這個密文怎么解密就不用擔心數據泄露了。所以數據庫可以設計為虛擬號、會員號、手機號這么三個主要字段的表,會員號與手機號只要有一個字段有值就行,有會員號的存會員號明文,沒有會員號的存手機號密文。

  假設原手機號為:13012345678

  前三位的130用2代替首位1變成230,完成簡單映射

  中間四位自增0000,0001...9999

  后四位保持不變5678

  我們需要生成的虛擬號為:23000005678

三、算法實現

  自增有很多方式實現,為了滿足高並發情況下自增不重復,巧妙利用mysql數據庫自增的特性,實現一個發號器,表結構很簡單,就一個id字段設置為自增長主鍵,一個stub(存根)字段用來執行插入sql,類型簡單設置為char即可。sql如下:replace into table(stub) values('a')select LAST_INSERT_ID()注意:保證兩個sql語句在一個事務下執行。不了解replace into用法的童鞋我簡單解釋一下,插入之前先判斷表是否有記錄,如果有則不插入,如果沒有則插入,還不清楚的同學請自行百度吧。

  如果數據庫是分庫分表的,那么需要注意設置數據庫的自增長步長。

四、異常處理

  上述算法理論上前三位相同,后四位相同的手機號超過一萬個就有可能會重復了,因為只有中間四位在自增,0-9999最多也就一萬個不重復,后續如果重復了怎么辦呢?虛擬號與手機號必須有一個共同的特性,唯一性,所以在建表的時候虛擬號字段需要加上唯一鍵約束,那么如果生成的虛擬號重復,在插入表的時候數據庫會拋出唯一鍵異常DuplicateKeyException,我們只需要catch DuplicateKeyException然后遞歸調用生成虛擬號的代碼即可(也就是中間四位繼續往下遞增,直到虛擬號不重復插入表成功為止)。

五、歷史數據清理

  查詢出所有的需要脫敏的真實手機號插入到一張ClearDataTemp的臨時表,可以存明文手機號與明文的虛擬號,然后跑生成虛擬號的程序生成虛擬號插入ClearDataTemp,然后根據這張表去做聯表更新,如果是生產庫建議先做備份,出問題可以隨時回滾,然后用加虛擬號字段的方式試運行一段時間,沒問題再將原字段刪除,加的字段rename為原字段即可,這樣可保萬無一失。

六、總結

  這套生成虛擬號的算法應該滿足大多數數據脫敏的場景,如身份證號、手機號、卡號、客戶號,可根據使用場景自行擴展。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM