您好,登錄后才能下訂單哦!
百度百科是這樣描述的:
數據脫敏是指對某些敏感信息通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。在涉及客戶安全數據或者一些商業性敏感數據的情況下,在不違反系統規則條件下,對真實數據進行改造并提供測試使用,如×××號、手機號、卡號、客戶姓名、客戶地址、等個人敏感信息都需要通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。這樣就可以在開發、測試和其他非生產環境以及外包環境中可以安全的使用脫敏后的真實數據集。
生活中的常見例子
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), "*");
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。