后端實現(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萬 | 120 | 145 | 20.8% |
100萬 | 980 | 1150 | 17.3% |
1000萬 | 10500 | 12200 | 16.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應用創(chuàng)建Docker鏡像的3種方式總結(jié)
Docker的使用可以將應用程序做成鏡像,這樣可以將鏡像發(fā)布到私有或者公有倉庫中,在其他主機上也可以pull鏡像,并且運行容器,運行程,下面這篇文章主要給大家總結(jié)介紹了關于為Java應用創(chuàng)建Docker鏡像的3種方式,需要的朋友可以參考下2023-06-06springboot使用RedisRepository操作數(shù)據(jù)的實現(xiàn)
本文主要介紹了springboot使用RedisRepository操作數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05SpringMVC之DispatcherServlet配置文件應該放在哪里呢
這篇文章主要介紹了SpringMVC之DispatcherServlet配置文件應該放在哪里的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11如何使用SpringBoot進行優(yōu)雅的數(shù)據(jù)驗證
這篇文章主要介紹了如何使用SpringBoot進行優(yōu)雅的數(shù)據(jù)驗證,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11