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

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

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

前言

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

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

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

結(jié)果1天后,受到了公司領(lǐng)導(dǎo)的批評(píng)。

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

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

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

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

典型代碼實(shí)現(xiàn)

public class StringMasker {  
    // 手機(jī)號(hào)脫敏: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位舊身份證  
    }  
}

使用正則表達(dá)式將關(guān)鍵字字段替換成了*

適用場景對(duì)比

優(yōu)缺點(diǎn)分析

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

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

加密算法選型

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

完整實(shí)現(xiàn)示例

public class AESEncryptor {  
    private static final String ALGORITHM = "AES/GCM/NoPadding";  
    private static final int TAG_LENGTH = 128; // 認(rèn)證標(biāo)簽長度  

    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);  
    }  

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

密鑰管理方案對(duì)比

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

數(shù)據(jù)庫層實(shí)現(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;  

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

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

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

代理層實(shí)現(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ù)替換(鉑金級(jí))

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

映射表設(shè)計(jì)

// 使用Guava Cache實(shí)現(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:動(dòng)態(tài)脫敏(鉆石級(jí))

應(yīng)用層實(shí)現(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ù)脫敏的字段上技術(shù)RequiresMasking注解,然后在Spring的AOP攔截器中,通過工具類動(dòng)態(tài)實(shí)現(xiàn)數(shù)據(jù)的脫敏。

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

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

1. 通俗原理解釋

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

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

當(dāng)K=3時(shí),攻擊者無法確定具體某人的疾 病,因?yàn)?人都具有相同特征(25歲男性)。

2. 實(shí)現(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;  
    }  
}

假設(shè)range是K值,等于10。

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

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

K值選擇原則

總結(jié)

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

下面是某電商平臺(tái)各方案的使用占比:

蘇三的3個(gè)核心建議

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

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

安全大禮包

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

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

相關(guān)文章

  • java中for和forEach的速度比較實(shí)例Demo

    java中for和forEach的速度比較實(shí)例Demo

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

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

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

    詳解JVM虛擬機(jī)的類加載機(jī)制

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

    解決idea無法導(dǎo)入識(shí)別本地類的問題

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

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

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

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

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

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

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

    springboot使用過濾器詳解

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

    SpringMVC之DispatcherServlet配置文件應(yīng)該放在哪里呢

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

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

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

最新評(píng)論