什麼資料需要進行脫敏處理
2021-06-27由 駭客馬拉松 發表于 畜牧業
什麼資料需要進行脫敏處理
百度百科是這樣描述的:
資料脫敏是指對某些敏感資訊透過脫敏規則進行資料的變形,實現敏感隱私資料的可靠保護。在涉及客戶安全資料或者一些商業性敏感資料的情況下,在不違反系統規則條件下,對真實資料進行改造並提供測試使用,如身份證號、手機號、卡號、客戶姓名、客戶地址、等個人敏感資訊都需要透過脫敏規則進行資料的變形,實現敏感隱私資料的可靠保護。這樣就可以在開發、測試和其他非生產環境以及外包環境中可以安全的使用脫敏後的真實資料集。
生活中的常見例子
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
* @return
*/
public static String idCardNum(String id) {
if (StringUtils。isBlank(id)) {
return “”;
}
String num = StringUtils。right(id, 4);
return StringUtils。leftPad(num, StringUtils。length(id), “*”);
}
/**
* 【固定電話】 顯示後四位,其他隱藏,比如:*******3241
*
* @param num
* @return
*/
public static String fixedPhone(String num) {
if (StringUtils。isBlank(num)) {
return “”;
}
return StringUtils。leftPad(StringUtils。right(num, 4), StringUtils。length(num), “*”);
}
/**
* 【手機號碼】前三位,後四位,其他隱藏,比如:135****6810
*
* @param num
* @return
*/
public static String mobilePhone(String num) {
if (StringUtils。isBlank(num)) {
return “”;
}
return StringUtils。left(num, 3)。concat(StringUtils。removeStart(StringUtils。leftPad(StringUtils。right(num, 4), StringUtils。length(num), “*”), “***”));
}
/**
* 【地址】只顯示到地區,不顯示詳細地址,比如:上海徐彙區漕河涇開發區***
*
* @param address
* @param sensitiveSize 敏感資訊長度
* @return
*/
public static String address(String address, int sensitiveSize) {
if (StringUtils。isBlank(address)) {
return “”;
}
int length = StringUtils。length(address);
return StringUtils。rightPad(StringUtils。left(address, length - sensitiveSize), length, “*”);
}
/**
* 【電子郵箱】 郵箱字首僅顯示第一個字母,字首其他隱藏,用星號代替,@及後面的地址顯示,比如:d**@126。com
*
* @param email
* @return
*/
public static String email(String email) {
if (StringUtils。isBlank(email)) {
return “”;
}
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
* @return
*/
public static String bankCard(String cardNum) {
if (StringUtils。isBlank(cardNum)) {
return “”;
}
return StringUtils。left(cardNum, 6)。concat(StringUtils。removeStart(StringUtils。leftPad(StringUtils。right(cardNum, 4), StringUtils。length(cardNum), “*”), “******”));
}
/**
* 【密碼】密碼的全部字元都用*代替,比如:******
*
* @param password
* @return
*/
public static String password(String password) {
if (StringUtils。isBlank(password)) {
return “”;
}
String pwd = StringUtils。left(password, 0);
return StringUtils。rightPad(pwd, StringUtils。length(password), “*”);
}
}
原PO主:54tianzhisheng