欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

后端實現(xiàn)數(shù)據(jù)脫敏的6種方案詳細介紹

 更新時間:2025年05月19日 10:10:21   作者:蘇三說技術  
這篇文章主要為大家詳細介紹了后端實現(xiàn)數(shù)據(jù)脫敏的6種方案,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下

前言

某次新來的同事,在開發(fā)環(huán)境執(zhí)行了這樣的代碼:

// 反例:直接將生產(chǎn)數(shù)據(jù)同步到測試環(huán)境  
public void syncUserToTest(User user) {  
    testDB.insert(user); // 包含手機號、身份證等敏感字段  
}

直接將生產(chǎn)的數(shù)據(jù),比如:手機號、身份證等敏感字段,同步到了測試環(huán)境。

結(jié)果1天后,受到了公司領導的批評。

這個案例揭示了數(shù)據(jù)脫敏的極端重要性。

這篇文章給大家分享6種常用的數(shù)據(jù)脫敏方案,希望對你會有所幫助。

方案1:字符串替換(青銅級)

技術原理:通過正則表達式對敏感數(shù)據(jù)進行部分字符替換

典型代碼實現(xiàn)

public class StringMasker {  
    // 手機號脫敏:13812345678 → 138****5678  
    public static String maskMobile(String mobile) {  
        return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");  
    }  

    // 身份證脫敏:110101199003077777 → 1101********7777  
    public static String maskIdCard(String idCard) {  
        if (idCard.length() == 18) {  
            return idCard.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2");  
        }  
        return idCard; // 處理15位舊身份證  
    }  
}

使用正則表達式將關鍵字字段替換成了*

適用場景對比

優(yōu)缺點分析

  • ? 優(yōu)點:實現(xiàn)簡單、性能高(時間復雜度O(n))
  • ? 缺點:
    • 無法恢復原始數(shù)據(jù)
    • 正則表達式需考慮多國數(shù)據(jù)格式差異
    • 存在模式被破解風險(如固定位置替換)

方案2:加密算法(白銀級)

加密算法選型

算法類型代表算法特點適用場景
對稱加密AES加解密快,密鑰管理復雜支付信息存儲
非對稱加密RSA速度慢,安全性高密鑰交換
國密算法SM4符合國家標準政府/金融系統(tǒng)

完整實現(xiàn)示例

public class AESEncryptor {  
    private static final String ALGORITHM = "AES/GCM/NoPadding";  
    private static final int TAG_LENGTH = 128; // 認證標簽長度  

    public static String encrypt(String plaintext, SecretKey key) {  
        byte[] iv = new byte[12]; // GCM推薦12字節(jié)IV  
        SecureRandom random = new SecureRandom();  
        random.nextBytes(iv);  

        Cipher cipher = Cipher.getInstance(ALGORITHM);  
        cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(TAG_LENGTH, iv));  

        byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));  
        return Base64.getEncoder().encodeToString(iv) + ":" +  
               Base64.getEncoder().encodeToString(ciphertext);  
    }  

    // 解密方法類似...  
}

密鑰管理方案對比

方案3:數(shù)據(jù)遮蔽(黃金級)

數(shù)據(jù)庫層實現(xiàn)數(shù)據(jù)遮蔽

-- 創(chuàng)建脫敏視圖  
CREATE VIEW masked_customers AS  
SELECT  
    id,  
    CONCAT(SUBSTR(name,1,1), '***') AS name,  
    CONCAT(SUBSTR(mobile,1,3), '****', SUBSTR(mobile,8,4)) AS mobile  
FROM customers;  

-- 使用列級權限控制  
GRANT SELECT (id, name, mobile) ON masked_customers TO test_user;

創(chuàng)建數(shù)據(jù)脫敏視圖,在視圖中將關鍵字段做遮蔽。

然后在后面需要用到這些字段的代碼,需要統(tǒng)一從視圖中查詢數(shù)據(jù)。

代理層實現(xiàn)(ShardingSphere示例)

rules:  
- !MASK  
  tables:  
    user:  
      columns:  
        phone:  
          maskAlgorithm: phone_mask  
  maskAlgorithms:  
    phone_mask:  
      type: MD5  
      props:  
        salt: abcdefg123456

性能影響測試數(shù)據(jù)

數(shù)據(jù)量原始查詢(ms)遮蔽查詢(ms)性能損耗
10萬12014520.8%
100萬980115017.3%
1000萬105001220016.2%

方案4:數(shù)據(jù)替換(鉑金級)

將原始數(shù)據(jù)和脫敏的數(shù)據(jù)保存到cache中,方便后面快速的做轉(zhuǎn)換。

映射表設計

// 使用Guava Cache實現(xiàn)LRU緩存  
LoadingCache<String, String> dataMapping = CacheBuilder.newBuilder()  
    .maximumSize(100000)  
    .expireAfterAccess(30, TimeUnit.MINUTES)  
    .build(new CacheLoader<String, String>() {  
        public String load(String key) {  
            return UUID.randomUUID().toString().replace("-", "");  
        }  
    });  

public String replaceData(String original) {  
    return dataMapping.get(original);  
}

替換流程

方案5:動態(tài)脫敏(鉆石級)

應用層實現(xiàn)(Spring AOP示例)

@Aspect  
@Component  
public class DataMaskAspect {  

    @Around("@annotation(requiresMasking)")  
    public Object maskData(ProceedingJoinPoint joinPoint, RequiresMasking requiresMasking) throws Throwable {  
        Object result = joinPoint.proceed();  
        return mask(result, requiresMasking.type());  
    }  

    private Object mask(Object data, MaskType type) {  
        if (data instanceof User) {  
            User user = (User) data;  
            switch(type) {  
                case MOBILE:  
                    user.setMobile(MaskUtil.maskMobile(user.getMobile()));  
                    break;  
                case ID_CARD:  
                    user.setIdCard(MaskUtil.maskIdCard(user.getIdCard()));  
                    break;  
            }  
        }  
        return data;  
    }  
}

在需要做數(shù)據(jù)脫敏的字段上技術RequiresMasking注解,然后在Spring的AOP攔截器中,通過工具類動態(tài)實現(xiàn)數(shù)據(jù)的脫敏。

數(shù)據(jù)庫代理層架構

方案6:K匿名化(王者級)

1. 通俗原理解釋

假設醫(yī)院發(fā)布就診數(shù)據(jù):

年齡性別疾 病
25感 冒
25發(fā) 燒
25骨 折

當K=3時,攻擊者無法確定具體某人的疾 病,因為3人都具有相同特征(25歲男性)。

2. 實現(xiàn)步驟

醫(yī)療數(shù)據(jù)泛化示例

public class KAnonymity {  

    // 年齡泛化:精確值→范圍  
    public static String generalizeAge(int age) {  
        int range = 10; // K=10  
        int lower = (age / range) * range;  
        int upper = lower + range - 1;  
        return lower + "-" + upper;  
    }  
}

假設range是K值,等于10。

generalizeAge方法中,通過一定的算法,將年齡的精確值,泛化成一個區(qū)間范圍。

輸入年齡28,返回20-29。

K值選擇原則

總結(jié)

方案安全性性能可逆性適用場景
字符串替換★★★★★★不可逆日志/展示
加密算法★★★★★★可逆支付信息存儲
數(shù)據(jù)遮蔽★★★★★★部分可逆數(shù)據(jù)庫查詢
數(shù)據(jù)替換★★★★★★可逆測試數(shù)據(jù)生成
動態(tài)脫敏★★★★★★★動態(tài)可控生產(chǎn)環(huán)境查詢
K匿名化★★★★★不可逆醫(yī)療/位置數(shù)據(jù)

下面是某電商平臺各方案的使用占比:

蘇三的3個核心建議

  • 數(shù)據(jù)分類分級:不同級別數(shù)據(jù)采用不同脫敏策略
  • 定期審計:使用自動化工具掃描敏感數(shù)據(jù)泄露
  • 最小化原則:能不收集的敏感數(shù)據(jù)堅決不收集

靈魂拷問
當黑客攻破你的數(shù)據(jù)庫時,里面的數(shù)據(jù)是否像諾基亞功能機一樣"防摔"?

安全大禮包

  • 敏感數(shù)據(jù)掃描工具
  • 脫敏策略檢查表
  • 數(shù)據(jù)安全架構白皮書

到此這篇關于后端實現(xiàn)數(shù)據(jù)脫敏的6種方案詳細介紹的文章就介紹到這了,更多相關數(shù)據(jù)脫敏實現(xiàn)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java中for和forEach的速度比較實例Demo

    java中for和forEach的速度比較實例Demo

    for循環(huán)中的循環(huán)條件中的變量只求一次值,而foreach語句是java5新增,在遍歷數(shù)組、集合的時候,foreach擁有不錯的性能,這篇文章主要給大家介紹了關于java中for和forEach速度比較的相關資料,需要的朋友可以參考下
    2021-08-08
  • 為Java應用創(chuàng)建Docker鏡像的3種方式總結(jié)

    為Java應用創(chuàng)建Docker鏡像的3種方式總結(jié)

    Docker的使用可以將應用程序做成鏡像,這樣可以將鏡像發(fā)布到私有或者公有倉庫中,在其他主機上也可以pull鏡像,并且運行容器,運行程,下面這篇文章主要給大家總結(jié)介紹了關于為Java應用創(chuàng)建Docker鏡像的3種方式,需要的朋友可以參考下
    2023-06-06
  • 詳解JVM虛擬機的類加載機制

    詳解JVM虛擬機的類加載機制

    這篇文章主要介紹了詳解JVM虛擬機的類加載機制,虛擬機把描述類的數(shù)據(jù)從 Class 文件加載到內(nèi)存,并對數(shù)據(jù)進行校驗、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型,這就是虛擬機的類加載機制,需要的朋友可以參考下
    2023-08-08
  • 解決idea無法導入識別本地類的問題

    解決idea無法導入識別本地類的問題

    今天做實驗不知道按了哪里不能導入識別本地的類,只有jar包的類,百度搜索也沒有找到合理的解決方案,經(jīng)過朋友援助問題根源找到,下面小編把解決方法分享給大家,需要的朋友參考下吧
    2021-08-08
  • springboot使用RedisRepository操作數(shù)據(jù)的實現(xiàn)

    springboot使用RedisRepository操作數(shù)據(jù)的實現(xiàn)

    本文主要介紹了springboot使用RedisRepository操作數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 通過第三方接口發(fā)送短信驗證碼/短信通知(推薦)

    通過第三方接口發(fā)送短信驗證碼/短信通知(推薦)

    這篇文章主要介紹了通過第三方接口發(fā)送短信驗證碼/短信通知(推薦)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Java獲取Class對象的幾種方式小結(jié)

    Java獲取Class對象的幾種方式小結(jié)

    本文給大家分享了Java獲取Class對象的幾種方式,使用類名.class 語法,使用對象的 getClass()方法,使用 Class.forName()方法等多種方法,不同的方式適用于不同的場景,需要的朋友可以參考下
    2023-10-10
  • springboot使用過濾器詳解

    springboot使用過濾器詳解

    本文主要介紹了過濾器的基本概念,過濾器的生命周期,以及如何通過注解方式和非注解方式實現(xiàn)過濾器,過濾器是客戶端與服務器資源文件之間的一道過濾網(wǎng),能夠幫助我們過濾不符合要求的請求,通常用作Session校驗
    2024-10-10
  • SpringMVC之DispatcherServlet配置文件應該放在哪里呢

    SpringMVC之DispatcherServlet配置文件應該放在哪里呢

    這篇文章主要介紹了SpringMVC之DispatcherServlet配置文件應該放在哪里的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 如何使用SpringBoot進行優(yōu)雅的數(shù)據(jù)驗證

    如何使用SpringBoot進行優(yōu)雅的數(shù)據(jù)驗證

    這篇文章主要介紹了如何使用SpringBoot進行優(yōu)雅的數(shù)據(jù)驗證,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論