1. 程式人生 > >什麽是數據脫敏?

什麽是數據脫敏?

數據脫敏

百度百科是這樣描述的:

數據脫敏是指對某些敏感信息通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。在涉及客戶安全數據或者一些商業性敏感數據的情況下,在不違反系統規則條件下,對真實數據進行改造並提供測試使用,如×××號、手機號、卡號、客戶姓名、客戶地址、等個人敏感信息都需要通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。這樣就可以在開發、測試和其他非生產環境以及外包環境中可以安全的使用脫敏後的真實數據集。

生活中的常見例子

1、火車票:

2、淘寶網頁上的收獲地址信息:

技術分享圖片

敏感數據梳理

在進行數據脫敏之前我們應該要確定公司的哪些數據(哪些表、哪些字段)要作為脫敏的目標,下面從用戶、公司、賣家反面分析:

1、用戶:名字、手機號碼、×××號碼、固定電話、收貨地址、電子郵箱、銀行卡號、密碼等

2、賣家:名字、手機號碼、×××號碼、固定電話等

3、公司:交易金額、優惠券碼、充值碼等

確定脫敏規則

確定好了公司的哪些數據要作為脫敏目標後,我們就需要制定脫敏的規則(具體的實施方法)。

常見方法:

1、替換:如統一將女性用戶名替換為F,這種方法更像“障眼法”,對內部人員可以完全保持信息完整性,但易破解。

2、重排:序號12345 重排為 54321,按照一定的順序進行打亂,很像“替換”, 可以在需要時方便還原信息,但同樣易破解。

3、加密:編號 12345 加密為 23456,安全程度取決於采用哪種加密算法,一般根據實際情況而定。

4、截斷:13811001111 截斷為 138,舍棄必要信息來保證數據的模糊性,是比較常用的脫敏方法,但往往對生產不夠友好。(丟失字段的長度)

5、掩碼: 123456 -> 1xxxx6,保留了部分信息,並且保證了信息的長度不變性,對信息持有者更易辨別, 如火車票上得身份信息。(常用方法)

6、日期偏移取整:20130520 12:30:45 -> 20130520 12:00:00,舍棄精度來保證原始數據的安全性,一般此種方法可以保護數據的時間分布密度。

目前我的脫敏規則想法是:

1、【中文姓名】只顯示第一個漢字,其他隱藏為2個星號,比如:李**

2、【×××號】顯示最後四位,其他隱藏。共計18位或者15位,比如:*************1234

3、【固定電話】 顯示後四位,其他隱藏,比如:*******3241

4、【手機號碼】前三位,後四位,其他隱藏,比如:135****6810

5、【地址】只顯示到地區,不顯示詳細地址,比如:上海徐匯區漕河涇開發區***

6、【電子郵箱】 郵箱前綴僅顯示第一個字母,前綴其他隱藏,用星號代替,@及後面的地址顯示,比如:d**@126.com

7、【銀行卡號】前六位,後四位,其他用星號隱藏每位1個星號,比如:6222600**********1234

8、【密碼】密碼的全部字符都用代替,比如:*

根據以上規則進行數據脫敏!

具體思路目前是這樣的:

從原數據源查詢到的生產數據 ——> 數據脫敏 ——> 更新到目標數據源。

原數據源、目標數據源、需要脫敏的表、字段等都放在配置文件中,做到可擴展性!

脫敏工具代碼

根據以上規則已經寫好了一份簡單的脫敏規則工具類。

/**

* 數據脫敏工具類

* Created by zhisheng_tian on 2017/10/25.

*/

public class DesensitizedUtils {

* 【中文姓名】只顯示第一個漢字,其他隱藏為2個星號,比如:李**

*

* @param fullName

* @return

public static String chineseName(String fullName) {

if (StringUtils.isBlank(fullName)) {

return "";

}

String name = StringUtils.left(fullName, 1);

return StringUtils.rightPad(name, StringUtils.length(fullName), "*");

* 【×××號】顯示最後四位,其他隱藏。共計18位或者15位,比如:*************1234

* @param id

public static String idCardNum(String id) {

if (StringUtils.isBlank(id)) {

String num = StringUtils.right(id, 4);

return StringUtils.leftPad(num, StringUtils.length(id), "*");

* 【固定電話】 顯示後四位,其他隱藏,比如:*******3241

* @param num

public static String fixedPhone(String num) {

if (StringUtils.isBlank(num)) {

return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");

* 【手機號碼】前三位,後四位,其他隱藏,比如:135****6810

public static String mobilePhone(String num) {

return StringUtils.left(num, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));

* 【地址】只顯示到地區,不顯示詳細地址,比如:上海徐匯區漕河涇開發區***

* @param address

* @param sensitiveSize 敏感信息長度

public static String address(String address, int sensitiveSize) {

if (StringUtils.isBlank(address)) {

int length = StringUtils.length(address);

return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");

* 【電子郵箱】 郵箱前綴僅顯示第一個字母,前綴其他隱藏,用星號代替,@及後面的地址顯示,比如:d**@126.com

* @param email

public static String email(String email) {

if (StringUtils.isBlank(email)) {

int index = StringUtils.indexOf(email, "@");

if (index <= 1)

return email;

else

return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));

* 【銀行卡號】前六位,後四位,其他用星號隱藏每位1個星號,比如:6222600**********1234

* @param cardNum

public static String bankCard(String cardNum) {

if (StringUtils.isBlank(cardNum)) {

return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));

* 【密碼】密碼的全部字符都用*代替,比如:******

* @param password

public static String password(String password) {

if (StringUtils.isBlank(password)) {

String pwd = StringUtils.left(password, 0);

return StringUtils.rightPad(pwd, StringUtils.length(password), "*");

什麽是數據脫敏?