前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据脱敏的6种方案,真香!

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

作者头像
苏三说技术
发布于 2025-05-18 01:45:43
发布于 2025-05-18 01:45:43
57405
代码可运行
举报
文章被收录于专栏:苏三说技术苏三说技术
运行总次数:5
代码可运行

大家好,我是苏三,又跟大家见面了。

前言

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

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

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

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

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

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

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

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

典型代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:加密算法(白银级)

加密算法选型

算法类型

代表算法

特点

适用场景

对称加密

AES

加解密快,密钥管理复杂

支付信息存储

非对称加密

RSA

速度慢,安全性高

密钥交换

国密算法

SM4

符合国家标准

政府/金融系统

完整实现示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AESEncryptor {  
    privatestaticfinal String ALGORITHM = "AES/GCM/NoPadding";  
    privatestaticfinalint TAG_LENGTH = 128; // 认证标签长度  

    public static String encrypt(String plaintext, SecretKey key) {  
        byte[] iv = newbyte[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:数据遮蔽(黄金级)

数据库层实现数据遮蔽

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建脱敏视图  
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示例)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rules:  
-!MASK
tables:
    user:
      columns:
        phone:
          maskAlgorithm:phone_mask
maskAlgorithms:
    phone_mask:
      type:MD5
      props:
        salt:abcdefg123456

性能影响测试数据

数据量

原始查询(ms)

遮蔽查询(ms)

性能损耗

10万

120

145

20.8%

100万

980

1150

17.3%

1000万

10500

12200

16.2%

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

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

映射表设计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用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示例)

代码语言:javascript
代码运行次数:2
运行
AI代码解释
复制
@Aspect  
@Component
publicclass 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. 通俗原理解释

假设医院发布就诊数据:

年龄

性别

疾病

25

感冒

25

发烧

25

骨折

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

2. 实现步骤

医疗数据泛化示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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值选择原则

总结

方案

安全性

性能

可逆性

适用场景

字符串替换

★★

★★★★

不可逆

日志/展示

加密算法

★★★★

★★

可逆

支付信息存储

数据遮蔽

★★★

★★★

部分可逆

数据库查询

数据替换

★★★★

★★

可逆

测试数据生成

动态脱敏

★★★★

★★★

动态可控

生产环境查询

K匿名化

★★★★★

不可逆

医疗/位置数据

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

苏三的3个核心建议

  1. 数据分类分级:不同级别数据采用不同脱敏策略
  2. 定期审计:使用自动化工具扫描敏感数据泄露
  3. 最小化原则:能不收集的敏感数据坚决不收集

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

安全大礼包

  • 敏感数据扫描工具
  • 脱敏策略检查表
  • 数据安全架构白皮书
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 苏三说技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 数据脱敏?别慌,掩护队已经上线!
大家好!今天我们要聊一聊数据脱敏。这个词听起来像特工电影里的高科技武器,其实它就是给敏感数据穿上“伪装衣”,防止“坏人”偷窥。无论是银行账号、身份证号码、邮箱地址,这些信息都需要时刻保持低调。如何低调?没错——数据脱敏,Java 已准备好为你服务!
繁依Fanyi
2024/09/12
1950
聊聊 Sharding-JDBC 数据脱敏
安全控制一直是治理的重要环节,数据脱敏属于安全控制的范畴。对互联网公司、传统行业来说,数据安全一直是极为重视和敏感的话题。
码猿技术专栏
2023/05/01
1.6K0
聊聊 Sharding-JDBC 数据脱敏
我用注解优雅的实现了数据的脱敏
你平时肯定做过这样的需求。要求展示用户的手机号,但是不能完全展示,需要在中间给手机号打码,如下图:
Lvshen
2022/05/05
2.1K1
我用注解优雅的实现了数据的脱敏
用户敏感信息展示脱敏
技术选型 网上很多教程都是在说,通过 AOP、自定义注解和反射的方式完成字段脱敏功能。但是这种方式有点重量级且性能一般,遇到高并发场景存在性能瓶颈。 我举个循环嵌套的例子:
用户10136162
2023/10/30
8400
超实用,推荐3种常见的数据脱敏方案
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典原文:blog.csdn.net/weixin_61594803 1.SQL数据脱敏实现 MYSQL(电话号码,身份证)数据脱敏的实现 -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用,请看下面具体实现   -- CONCAT(str1,str2,…):返回结果为连接参数产生的字符串 -- LEFT(str,len):返回从字符串str 开始的len 最左字符 -- RIGHT(str,len):从字符串str 开始,返
猿天地
2022/05/25
2.2K0
超实用,推荐3种常见的数据脱敏方案
Java 日志数据脱敏方案,真的很给力
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 来源:blog.csdn.net/blue_driver/article/details/122025368 自定义Layout 编写log4j配置 正则匹配说明 注意事项 脱敏测试 ---- 许多系统为了安全需要对敏感信息(如手机号、邮箱、姓名、身份证号、密码、卡号、住址等)的日志打印要求脱敏后才能输出,本文将结合个人经历及总结分享一种log4j日志脱敏方式。 自定义Layout import org.apache.logging.lo
猿天地
2022/07/04
2.8K0
Java 日志数据脱敏方案,真的很给力
顶级企业如何用数据脱敏保护用户隐私!
ShardingSphere提供数据访问安全性:通过数据脱敏,完成对敏感数据的安全访问。本文介绍ShardingSphere数据脱敏功能。
JavaEdge
2025/06/01
1220
顶级企业如何用数据脱敏保护用户隐私!
如何对数据进行脱敏处理?
实际的业务开发过程中,我们经常需要对用户的隐私数据进行脱敏处理,所谓脱敏处理其实就是将数据进行混淆隐藏,例如下图,将用户的手机号、地址等数据信息,采用*进行隐藏,以免泄露个人隐私信息。
Java极客技术
2022/12/02
3.8K1
如何对数据进行脱敏处理?
一个注解优雅的实现 接口数据脱敏
通常接口返回值中的一些敏感数据也是要脱敏的,比如身份证号、手机号码、地址.....通常的手段就是用*隐藏一部分数据,当然也可以根据自己需求定制。
码猿技术专栏
2023/05/01
6230
一个注解优雅的实现 接口数据脱敏
Go实践|数据脱敏思考和设计
在一些常见的业务场景中可能涉及到用户的手机号,银行卡号等敏感数据,对于这部分的数据经常需要进行数据脱敏处理,就是将此部分数据隐私化,防止数据泄露。但是在生产环境中,数据一般都是实时的,且在进行脱敏操作时不能影响正常的业务使用。
用户6256742
2024/07/09
2590
数据库静态脱敏
本系统能自动运行数据扫描任务,先从数据源中获取少量的样本数据,再与系统内置的敏感数据指纹特征进行比对,快速识别敏感数据类型,并记录敏感数据的存放位置。
数据库保护
2019/07/19
2.8K0
数据库静态脱敏
常用数据脱敏解决方案
基于SQL语句的数据脱敏,需要依赖相应的数据库函数。 如下,以MySQL数据库为例,在查询数据的时候通过函数concat(),left()和right()实现脱敏处理。
编程随笔
2024/04/21
7990
Rpamis-security-基于Mybatis-Plugin的一站式加解密脱敏安全组件
rpamis-security (opens new window)1.0.0是一个基于Mybatis插件开发的安全组件,旨在提供更优于市面上组件的脱敏、加解密落库等企业数据安全解决方案。组件提供注解式编程方式,开发者只需要对需要处理的字段或方法加上对应注解,无需关心安全相关需求,由组件全自动完成脱敏、加解密等功能
benym
2023/11/25
3186
Rpamis-security-基于Mybatis-Plugin的一站式加解密脱敏安全组件
数据脱敏——什么是数据脱敏
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/77689459
DannyHoo
2018/09/13
11.3K0
数据脱敏——什么是数据脱敏
Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)
这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小。
程序员小富
2021/08/03
9720
Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)
这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小。
程序员小富
2021/08/06
7220
Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)
聊聊如何自定义数据脱敏
本示例通过替换的手段实现脱敏,然后配合常用的框架特性,比如mybatis的拦截器机制或者json的序列化来快速实现脱敏
lyb-geek
2021/12/28
1.8K0
聊聊如何自定义数据脱敏
人脸核身“手机号三要素核验”中的KMS加密服务应用
客户在使用人脸核身服务接口时,出于安全考虑,需要对传输的敏感数据进行加密,此场景需求可以使用腾讯云密钥管理系统KMS完成安全保护。
周朋伟
2021/01/31
3K0
人脸核身“手机号三要素核验”中的KMS加密服务应用
Spring Boot实现数据加密脱敏:注解 + 反射 + AOP
随着信息安全的日益重要,对敏感数据进行加密和脱敏已成为业务开发中不可忽视的一环。本文将介绍如何在Spring Boot项目中利用注解、反射和AOP的组合,实现对敏感数据的加密和脱敏,提高数据安全性。
IT_陈寒
2024/01/07
2.7K0
Spring Boot实现数据加密脱敏:注解 + 反射 + AOP
【金猿案例展】某农商行:数据脱敏系统经典实践
在银行企业生产数据库中,储存着大量的敏感信息,例如储户个人身份信息、手机号码、身份证、银行账户信息、资金信息等,这些数据,在银行业很多工作场景中都会得到使用,例如,业务分析、开发测试、审计监管,甚至是一些外包业务等方面,使用的都是真实的业务数据和信息。如果这些数据发生泄露、损坏,不仅会给银行企业带来经济上的损失,更重要的是会大大影响用户对于银行的信任度。
数据猿
2019/12/26
1.1K0
推荐阅读
相关推荐
Java 数据脱敏?别慌,掩护队已经上线!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验