找回密码
 立即注册
首页 业界区 业界 数据脱敏的这6种方案,真香!

数据脱敏的这6种方案,真香!

方方仪 2025-6-3 00:29:21
前言

某次新来的同事,在开发环境执行了这样的代码:
  1. // 反例:直接将生产数据同步到测试环境  
  2. public void syncUserToTest(User user) {  
  3.     testDB.insert(user); // 包含手机号、身份证等敏感字段  
  4. }
复制代码
直接将生产的数据,比如:手机号、身份证等敏感字段,同步到了测试环境。
结果1天后,受到了公司领导的批评。
这个案例揭示了数据脱敏的极端重要性。
这篇文章给大家分享6种常用的数据脱敏方案,希望对你会有所帮助。
方案1:字符串替换(青铜级)

技术原理:通过正则表达式对敏感数据进行部分字符替换
典型代码实现
  1. public class StringMasker {  
  2.     // 手机号脱敏:13812345678 → 138****5678  
  3.     public static String maskMobile(String mobile) {  
  4.         return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");  
  5.     }  
  6.     // 身份证脱敏:110101199003077777 → 1101********7777  
  7.     public static String maskIdCard(String idCard) {  
  8.         if (idCard.length() == 18) {  
  9.             return idCard.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2");  
  10.         }  
  11.         return idCard; // 处理15位旧身份证  
  12.     }  
  13. }
复制代码
使用正则表达式将关键字字段替换成了*
适用场景对比
1.webp

优缺点分析

  • ✅ 优点:实现简单、性能高(时间复杂度O(n))
  • ❌ 缺点:

    • 无法恢复原始数据
    • 正则表达式需考虑多国数据格式差异
    • 存在模式被破解风险(如固定位置替换)

方案2:加密算法(白银级)

加密算法选型
算法类型代表算法特点适用场景对称加密AES加解密快,密钥管理复杂支付信息存储非对称加密RSA速度慢,安全性高密钥交换国密算法SM4符合国家标准政府/金融系统完整实现示例
  1. public class AESEncryptor {  
  2.     private static final String ALGORITHM = "AES/GCM/NoPadding";  
  3.     private static final int TAG_LENGTH = 128; // 认证标签长度  
  4.     public static String encrypt(String plaintext, SecretKey key) {  
  5.         byte[] iv = new byte[12]; // GCM推荐12字节IV  
  6.         SecureRandom random = new SecureRandom();  
  7.         random.nextBytes(iv);  
  8.         Cipher cipher = Cipher.getInstance(ALGORITHM);  
  9.         cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(TAG_LENGTH, iv));  
  10.         byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));  
  11.         return Base64.getEncoder().encodeToString(iv) + ":" +  
  12.                Base64.getEncoder().encodeToString(ciphertext);  
  13.     }  
  14.     // 解密方法类似...  
  15. }
复制代码
密钥管理方案对比
2.webp

方案3:数据遮蔽(黄金级)

数据库层实现数据遮蔽
  1. -- 创建脱敏视图  
  2. CREATE VIEW masked_customers AS  
  3. SELECT  
  4.     id,  
  5.     CONCAT(SUBSTR(name,1,1), '***') AS name,  
  6.     CONCAT(SUBSTR(mobile,1,3), '****', SUBSTR(mobile,8,4)) AS mobile  
  7. FROM customers;  
  8. -- 使用列级权限控制  
  9. GRANT SELECT (id, name, mobile) ON masked_customers TO test_user;
复制代码
创建数据脱敏视图,在视图中将关键字段做遮蔽。
然后在后面需要用到这些字段的代码,需要统一从视图中查询数据。
代理层实现(ShardingSphere示例)
  1. rules:  
  2. - !MASK  
  3.   tables:  
  4.     user:  
  5.       columns:  
  6.         phone:  
  7.           maskAlgorithm: phone_mask  
  8.   maskAlgorithms:  
  9.     phone_mask:  
  10.       type: MD5  
  11.       props:  
  12.         salt: abcdefg123456
复制代码
性能影响测试数据
数据量原始查询(ms)遮蔽查询(ms)性能损耗10万12014520.8%100万980115017.3%1000万105001220016.2%方案4:数据替换(铂金级)

将原始数据和脱敏的数据保存到cache中,方便后面快速的做转换。
映射表设计
  1. // 使用Guava Cache实现LRU缓存  
  2. LoadingCache<String, String> dataMapping = CacheBuilder.newBuilder()  
  3.     .maximumSize(100000)  
  4.     .expireAfterAccess(30, TimeUnit.MINUTES)  
  5.     .build(new CacheLoader<String, String>() {  
  6.         public String load(String key) {  
  7.             return UUID.randomUUID().toString().replace("-", "");  
  8.         }  
  9.     });  
  10. public String replaceData(String original) {  
  11.     return dataMapping.get(original);  
  12. }
复制代码
替换流程
3.webp

方案5:动态脱敏(钻石级)

应用层实现(Spring AOP示例)
  1. @Aspect  
  2. @Component  
  3. public class DataMaskAspect {  
  4.     @Around("@annotation(requiresMasking)")  
  5.     public Object maskData(ProceedingJoinPoint joinPoint, RequiresMasking requiresMasking) throws Throwable {  
  6.         Object result = joinPoint.proceed();  
  7.         return mask(result, requiresMasking.type());  
  8.     }  
  9.     private Object mask(Object data, MaskType type) {  
  10.         if (data instanceof User) {  
  11.             User user = (User) data;  
  12.             switch(type) {  
  13.                 case MOBILE:  
  14.                     user.setMobile(MaskUtil.maskMobile(user.getMobile()));  
  15.                     break;  
  16.                 case ID_CARD:  
  17.                     user.setIdCard(MaskUtil.maskIdCard(user.getIdCard()));  
  18.                     break;  
  19.             }  
  20.         }  
  21.         return data;  
  22.     }  
  23. }
复制代码
在需要做数据脱敏的字段上技术RequiresMasking注解,然后在Spring的AOP拦截器中,通过工具类动态实现数据的脱敏。
数据库代理层架构
4.webp

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

1. 通俗原理解释

假设医院发布就诊数据:
年龄性别疾病25男感冒25男发烧25男骨折当K=3时,攻击者无法确定具体某人的疾病,因为3人都具有相同特征(25岁男性)。
2. 实现步骤

5.webp

医疗数据泛化示例
  1. public class KAnonymity {  
  2.     // 年龄泛化:精确值→范围  
  3.     public static String generalizeAge(int age) {  
  4.         int range = 10; // K=10  
  5.         int lower = (age / range) * range;  
  6.         int upper = lower + range - 1;  
  7.         return lower + "-" + upper;  
  8.     }  
  9. }
复制代码
假设range是K值,等于10。
generalizeAge方法中,通过一定的算法,将年龄的精确值,泛化成一个区间范围。
输入年龄28,返回20-29。
K值选择原则
6.webp

总结

方案安全性性能可逆性适用场景字符串替换★★★★★★不可逆日志/展示加密算法★★★★★★可逆支付信息存储数据遮蔽★★★★★★部分可逆数据库查询数据替换★★★★★★可逆测试数据生成动态脱敏★★★★★★★动态可控生产环境查询K匿名化★★★★★★不可逆医疗/位置数据下面是某电商平台各方案的使用占比:
7.webp

苏三的3个核心建议

  • 数据分类分级:不同级别数据采用不同脱敏策略
  • 定期审计:使用自动化工具扫描敏感数据泄露
  • 最小化原则:能不收集的敏感数据坚决不收集
灵魂拷问
当黑客攻破你的数据库时,里面的数据是否像诺基亚功能机一样"防摔"?
安全大礼包

  • 敏感数据扫描工具
  • 脱敏策略检查表
  • 数据安全架构白皮书
最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,我的所有文章都会在公众号上首发,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。
本文收录于我的技术网站:http://www.susan.net.cn

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册