写点什么

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

  • 2025-05-20
    福建
  • 本文字数:2650 字

    阅读完需:约 9 分钟

前言


某次新来的同事,在开发环境执行了这样的代码:


// 反例:直接将生产数据同步到测试环境  public void syncUserToTest(User user) {      testDB.insert(user); // 包含手机号、身份证等敏感字段  }
复制代码


直接将生产的数据,比如:手机号、身份证等敏感字段,同步到了测试环境。

结果 1 天后,受到了公司领导的批评。

这个案例揭示了数据脱敏的极端重要性。

这篇文章给大家分享 6 种常用的数据脱敏方案,希望对你会有所帮助。


方案 1:字符串替换(青铜级)


技术原理:通过正则表达式对敏感数据进行部分字符替换


典型代码实现


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位旧身份证 } }
复制代码


使用正则表达式将关键字字段替换成了*

适用场景对比



优缺点分析

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

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


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


加密算法选型



完整实现示例


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字节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:数据遮蔽(黄金级)


数据库层实现数据遮蔽


-- 创建脱敏视图  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;
复制代码


创建数据脱敏视图,在视图中将关键字段做遮蔽。

然后在后面需要用到这些字段的代码,需要统一从视图中查询数据。

代理层实现(ShardingSphere 示例)


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


性能影响测试数据



方案 4:数据替换(铂金级)


将原始数据和脱敏的数据保存到 cache 中,方便后面快速的做转换。


映射表设计


// 使用Guava Cache实现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:动态脱敏(钻石级)


应用层实现(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; } }
复制代码


在需要做数据脱敏的字段上技术 RequiresMasking 注解,然后在 Spring 的 AOP 拦截器中,通过工具类动态实现数据的脱敏。


数据库代理层架构



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


1. 通俗原理解释


假设医院发布就诊数据:



当 K=3 时,攻击者无法确定具体某人的疾病,因为 3 人都具有相同特征(25 岁男性)。

2. 实现步骤



医疗数据泛化示例


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 方法中,通过一定的算法,将年龄的精确值,泛化成一个区间范围。

输入年龄 28,返回 20-29。

K 值选择原则



总结



下面是某电商平台各方案的使用占比:



3 个核心建议

  1. 数据分类分级:不同级别数据采用不同脱敏策略

  2. 定期审计:使用自动化工具扫描敏感数据泄露

  3. 最小化原则:能不收集的敏感数据坚决不收集


灵魂拷问:当黑客攻破你的数据库时,里面的数据是否像诺基亚功能机一样"防摔"?


安全大礼包

  • 敏感数据扫描工具

  • 脱敏策略检查表

  • 数据安全架构白皮书


文章转载自:苏三说技术

原文链接:https://www.cnblogs.com/12lisu/p/18883200

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2025-04-01 加入

还未添加个人简介

评论

发布
暂无评论
数据脱敏的这6种方案,真香!_Java_电子尖叫食人鱼_InfoQ写作社区