身份證、手機號加密存儲的一些思路

這兩年國家愈來愈重要我的敏感信息的存儲、傳輸與交換。在獲取敏感我的信息時,例如,手機號、身份證,都須要主體的主動受權。算法

0x01:敏感信息泄露有哪些途徑

  • 明文存儲,好比直接把手機號、身份證存儲到數據庫。若是數據的用戶和密碼被一些不該該的人員看到,獲取;就很容易形成泄漏
  • 明文傳輸,好比沒有對敏感信息進行RSA或者AES加密,就在網絡中進行傳輸
  • 集團子公司或者與第三方系統進行系統對接時,交換敏感數據。就是把我方系統的一些敏感信息,沒經受權就發生給了第三方公司

0x02:解決敏感信息泄漏的最佳途徑

  • 明文存儲

對數據敏感信息加密後,再進行存儲。有這樣一個場景:有個用戶表除了其餘字段外,還有手機號 mobile_no 和身份證 identity_card ,這兩個敏感信息存儲字段。若是直接儲存mobile_no和identity_card明文,就很容易泄漏。數據庫

能夠對這兩個字段進行對稱加密或者非對稱加密存儲,分別定義兩個加密字段 mobile_no_encrypted 和 identity_card_encrypted。可是進行加密存儲到數據庫必然致使如下兩個問題:安全

如何進行精準查詢匹配網絡

  • 如何進行模糊查詢匹配
  • 如何進行精準查詢匹配?

爲了解決這個問題,還得多加一個字段,對於手機號添加 mobile_no_sha 字段,身份證添加 identity_card_sha 字段。這兩個字段分別存儲手機號和身份證的SHA-1的散列碼(也可使用md5算法)。這樣的話,若是精準查詢就直接比對SHA-1散列碼就行。ide

select * from t_user where mobile_no_sha = sha-1(mobile_no)
如何進行模糊查詢匹配?函數

對應模糊查詢就有點麻煩了!!!大數據

一般數據庫自帶有加解密函數,如MySQL的PASSWORD ,MD5,AES_ENCRYPT等等。對於密碼等信息能夠採用單向加密,驗證的時候用一樣的方式加密匹配便可。而對於須要比對原內容的模糊查詢,則須要使用雙向加密,也便可以解密,在MySQL可使用自帶的AES加密。完成存儲加密,讀取解密後,就能夠實現模糊搜索了:加密

select * 
from t_user 
where AES_DECRYPT(UNHEX(mobile_no_sha ),'key') 
like 'xxx%';

使用函數還原原始內容而後使用like關鍵字匹配便可實現模糊搜索。spa

MySQL使用AES_ENCRYPT()/AES_DECRYPT()加解密的正確姿式.net

http://blog.itpub.net/29773961/viewspace-2142305/
  • 明文傳輸

對於明文傳輸,首先的摒棄http傳輸協議,採用https傳輸協議。若是還想增強安全級別的話,就本身在定義一種加密方式,對敏感信息進行額外加密。好比採用對稱加密AES或者非對稱加密RSA進行自定義加密。

  • 集團子公司或者與第三方系統進行系統對接時,交換敏感數據

這種狀況比較比較麻煩,分爲集團內部子公司數據交換與第三方公司之間數據交換

集團內部子公司數據交換

集團公司之間是利益共同體,好比存在這樣的場景,A集團公司有一個保險公司和一個To C的商城系統,那是否是存在這樣的可能呢?保險公司須要收集大量我的的信息,而後大數據分析這些我的的狀況看看哪一個人的錢比較多,而後給他合理的推送保險,恰好商城作得好不錯,挺多人註冊,經過商城就能拿到不少我的的手機號之類的。

第三方公司之間數據交換

對於第三方公司系統之間,進行數據交換。也有可能存在接口調用時,傳輸敏感的信息。記得前兩年,順豐物流和菜鳥物流發生過這樣的事,就是菜鳥物流要求順豐物流必須上傳全部物流信息,後來順豐直接斷了這兩個系統的交互。

對於這兩種狀況,我認爲都須要在明顯的地方,給出相關的用戶協議,當主體贊成受權時,才能進行數據交換。可是這兩種狀況,幾乎尚未任何公司按照這種渠道來作的,都是偷偷的就把數據進行了交換。

相關文章
相關標籤/搜索