最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

后端實(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ù)同步到測(cè)試環(huán)境  
public void syncUserToTest(User user) {  
    testDB.insert(user); // 包含手機(jī)號(hào)、身份證等敏感字段  
}

直接將生產(chǎn)的數(shù)據(jù),比如:手機(jī)號(hào)、身份證等敏感字段,同步到了測(cè)試環(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)鍵字字段替換成了*

適用場(chǎng)景對(duì)比

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

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

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

加密算法選型

算法類型代表算法特點(diǎn)適用場(chǎng)景
對(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)簽長(zhǎng)度  

    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

性能影響測(cè)試數(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ǎng)景
字符串替換★★★★★★不可逆日志/展示
加密算法★★★★★★可逆支付信息存儲(chǔ)
數(shù)據(jù)遮蔽★★★★★★部分可逆數(shù)據(jù)庫查詢
數(shù)據(jù)替換★★★★★★可逆測(cè)試數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章教你用Java使用JVM工具檢測(cè)問題

    一篇文章教你用Java使用JVM工具檢測(cè)問題

    這篇文章主要介紹了深入理解Java使用JVM工具檢測(cè)問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • SpringBoot 整合 Avro 與 Kafka的詳細(xì)過程

    SpringBoot 整合 Avro 與 Kafka的詳細(xì)過程

    本文介紹了如何在Spring Boot中使用Avro和Kafka進(jìn)行數(shù)據(jù)的序列化和反序列化,并通過MyBatisPlus將數(shù)據(jù)存入數(shù)據(jù)庫,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • java并發(fā)編程中實(shí)現(xiàn)可見性的四種可行方案解析

    java并發(fā)編程中實(shí)現(xiàn)可見性的四種可行方案解析

    這篇文章主要介紹了java并發(fā)編程中實(shí)現(xiàn)可見性的四種可行方案解析,使用關(guān)鍵字volatile和使用鎖(如synchronized關(guān)鍵字或者java.util.concurrent包中的鎖)來確保對(duì)共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下
    2023-08-08
  • 多個(gè)JDK版本(Java 8、Java 17、Java 21)下載和切換

    多個(gè)JDK版本(Java 8、Java 17、Java 21)下載和切換

    為了在實(shí)際中可以任意選擇所需的JDK版本,需要將多個(gè)JDK版本進(jìn)行切換,本文主要介紹了多個(gè)JDK版本(Java 8、Java 17、Java 21)下載和切換,感興趣的可以了解一下
    2025-04-04
  • Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解

    Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解

    AOP是面向切面編程的技術(shù),AOP基于IoC基礎(chǔ),是對(duì)OOP的有益補(bǔ)充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關(guān)于Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • JAVA后端MultipartFile實(shí)現(xiàn)文件上傳實(shí)例

    JAVA后端MultipartFile實(shí)現(xiàn)文件上傳實(shí)例

    本文詳細(xì)介紹了文件存儲(chǔ)的方法,包括創(chuàng)建存儲(chǔ)路徑、使用UUID生成文件名、創(chuàng)建文件夾及將文件寫入磁盤,并提供了個(gè)人經(jīng)驗(yàn)供參考
    2026-05-05
  • java身份證合法性校驗(yàn)工具類實(shí)例代碼

    java身份證合法性校驗(yàn)工具類實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于java身份證合法性校驗(yàn)工具類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 利用Stream聚合函數(shù)如何對(duì)BigDecimal求和

    利用Stream聚合函數(shù)如何對(duì)BigDecimal求和

    這篇文章主要介紹了利用Stream聚合函數(shù)如何對(duì)BigDecimal求和問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java?使用readLine()?亂碼的解決

    java?使用readLine()?亂碼的解決

    這篇文章主要介紹了java使用readLine()亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析

    SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析

    這篇文章主要介紹了SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

长顺县| 伊金霍洛旗| 博白县| 浙江省| 阳原县| 辽阳市| 顺平县| 昌都县| 翁源县| 和林格尔县| 柏乡县| 镇原县| 衡东县| 营口市| 唐河县| 东乌| 南充市| 乡城县| 承德县| 武隆县| 桐城市| 武山县| 安化县| 霍城县| 吉林市| 蒙城县| 织金县| 托里县| 万荣县| 浮山县| 高平市| 满洲里市| 蒙阴县| 漯河市| 太康县| 子长县| 周至县| 阿拉善盟| 北票市| 紫阳县| 永新县|