0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是数据脱敏?常用的脱敏规则有哪些呢?

OSC开源社区 来源:OSCHINA 社区 2023-08-15 10:04 次阅读

1. 什么是数据脱敏

1.1 数据脱敏的定义

数据脱敏百度百科中是这样定义的: 数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。

这样就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。是数据库安全技术之一。

总的来说,数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。

在数据脱敏过程中,通常会采用不同的算法和技术,以根据不同的需求和场景对数据进行处理。

例如,对于身份证号码,可以使用掩码算法(masking)将前几位数字保留,其他位用 “X” 或 "*" 代替;对于姓名,可以使用伪造(pseudonymization)算法,将真实姓名替换成随机生成的假名。

1.2 常用脱敏规则

替换、重排、加密、截断、掩码

2. Hutool 工具介绍

2.1 引入 Maven 配置

在项目的 pom.xml 的 dependencies 中加入以下内容,这里以 5.8.16 版本为例。


wKgZomTa3VSACysrAAAhfL0Totg737.jpg

注意:Hutool 5.x 支持 JDK8+, 如果你的项目使用 JDK7,请使用 Hutool 4.x 版本。本文使用的数据脱敏工具类只有在 5.6 + 版本以上才提供。

2.2 Hutool 包含的组件

一个 Java 基础工具类,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行封装,组成各种 Util 工具类,同时提供以下组件:

模块 介绍
hutool-aop JDK 动态代理封装,提供非 IOC 下的切面支持
hutool-bloomFilter 布隆过滤,提供一些 Hash 算法的布隆过滤
hutool-cache 简单缓存实现
hutool-core 核心,包括 Bean 操作、日期、各种 Util 等
hutool-cron 定时任务模块,提供类 Crontab 表达式的定时任务
hutool-crypto 加密解密模块,提供对称、非对称和摘要算法封装
hutool-db JDBC 封装后的数据操作,基于 ActiveRecord 思想
hutool-dfa 基于 DFA 模型的多关键字查找
hutool-extra 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
hutool-http 基于 HttpUrlConnection 的 Http 客户端封装
hutool-log 自动识别日志实现的日志门面
hutool-script 脚本执行封装,例如 Javascript
hutool-setting 功能更强大的 Setting 配置文件和 Properties 封装
hutool-system 系统参数调用封装(JVM 信息等)
hutool-json JSON 实现
hutool-captcha 图片验证码实现
hutool-poi 针对 POI 中 Excel 和 Word 的封装
hutool-socket 基于 Java 的 NIO 和 AIO 的 Socket 封装
hutool-jwt JSON Web Token (JWT) 封装实现

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块,本文所使用的数据脱敏工具就是在 hutool.core 模块。

2.3 Hutool 支持的脱敏数据类型

现阶段最新版本的 Hutool 支持的脱敏数据类型如下,基本覆盖了常见的敏感信息。

1.用户 id

2.中文姓名

3.身份证号

4.座机号

5.手机号

6.地址

7.电子邮件

8.密码

9.中国大陆车牌,包含普通车辆、新能源车辆

10.银行卡

3. Hutool 数据脱敏实操

3.1 使用 Hutool 工具类一行代码实现脱敏

Hutool 提供的脱敏方法如下图所示:

e4871c68-3a94-11ee-9e74-dac502259ad0.png 

注意:Hutool 脱敏是通过 * 来代替敏感信息的,具体实现是在 StrUtil.hide 方法中,如果我们想要自定义隐藏符号,则可以把 Hutool 的源码拷出来,重新实现即可。 这里以手机号、银行卡号、身份证号、密码信息的脱敏为例,下面是对应的测试代码。

importcn.hutool.core.util.DesensitizedUtil;
importorg.junit.Test;
importorg.springframework.boot.test.context.SpringBootTest;

/**
 * 
 * @description: Hutool实现数据脱敏
 */
@SpringBootTest
publicclassHuToolDesensitizationTest{

    @Test
    publicvoidtestPhoneDesensitization(){
        String phone="13723231234";
        System.out.println(DesensitizedUtil.mobilePhone(phone));//输出:137****1234
    }
    @Test
    publicvoidtestBankCardDesensitization(){
        String bankCard="6217000130008255666";
        System.out.println(DesensitizedUtil.bankCard(bankCard));//输出:6217 **** **** *** 5666
    }

    @Test
    publicvoidtestIdCardNumDesensitization(){
        String idCardNum="411021199901102321";
        //只显示前4位和后2位
        System.out.println(DesensitizedUtil.idCardNum(idCardNum,4,2));//输出:4110************21
    }
    @Test
    publicvoidtestPasswordDesensitization(){
        String password="www.jd.com_35711";
        System.out.println(DesensitizedUtil.password(password));//输出:****************
    }
}

以上就是使用 Hutool 封装好的工具类实现数据脱敏。

3.2 配合 JackSon 通过注解方式实现脱敏

现在有了数据脱敏工具类,如果前端需要显示数据数据的地方比较多,我们不可能在每个地方都调用一个工具类,这样就显得代码太冗余了,那我们如何通过注解的方式优雅的完成数据脱敏呢? 如果项目是基于 springboot 的 web 项目,则可以利用 springboot 自带的 jackson 自定义序列化实现。它的实现原来其实就是在 json 进行序列化渲染给前端时,进行脱敏。

第一步:脱敏策略的枚举。

/**
 * @author
 * @description:脱敏策略枚举
 */
publicenumDesensitizationTypeEnum{
    //自定义
    MY_RULE,
    //用户id
    USER_ID,
    //中文名
    CHINESE_NAME,
    //身份证号
    ID_CARD,
    //座机号
    FIXED_PHONE,
    //手机号
    MOBILE_PHONE,
    //地址
    ADDRESS,
    //电子邮件
    EMAIL,
    //密码
    PASSWORD,
    //中国大陆车牌,包含普通车辆、新能源车辆
    CAR_LICENSE,
    //银行卡
    BANK_CARD
}
上面表示支持的脱敏类型。

第二步:定义一个用于脱敏的 Desensitization 注解。

@Retention (RetentionPolicy.RUNTIME):运行时生效。

@Target (ElementType.FIELD):可用在字段上。

@JacksonAnnotationsInside:此注解可以点进去看一下是一个元注解,主要是用户打包其他注解一起使用。

@JsonSerialize:上面说到过,该注解的作用就是可自定义序列化,可以用在注解上,方法上,字段上,类上,运行时生效等等,根据提供的序列化类里面的重写方法实现自定义序列化。

/**
 * @author 
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using =DesensitizationSerialize.class)
public@interface Desensitization{
    /**
     * 脱敏数据类型,在MY_RULE的时候,startInclude和endExclude生效
     */
    DesensitizationTypeEnumtype()defaultDesensitizationTypeEnum.MY_RULE;

    /**
     * 脱敏开始位置(包含)
     */
    intstartInclude()default0;

    /**
     * 脱敏结束位置(不包含)
     */
    intendExclude()default0;
}
注:只有使用了自定义的脱敏枚举 MY_RULE 的时候,开始位置和结束位置才生效。

第三步:创建自定的序列化类 这一步是我们实现数据脱敏的关键。自定义序列化类继承 JsonSerializer,实现 ContextualSerializer 接口,并重写两个方法。
/**
 * @author 
 * @description: 自定义序列化类
 */
@AllArgsConstructor
@NoArgsConstructor
publicclassDesensitizationSerializeextendsJsonSerializer implementsContextualSerializer{
    privateDesensitizationTypeEnum type;

    privateInteger startInclude;

    privateInteger endExclude;

    @Override
    publicvoidserialize(String str,JsonGenerator jsonGenerator,SerializerProvider serializerProvider)throwsIOException{
        switch(type){
            // 自定义类型脱敏
            case MY_RULE:
                jsonGenerator.writeString(CharSequenceUtil.hide(str, startInclude, endExclude));
                break;
            // userId脱敏
            case USER_ID:
                jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId()));
                break;
            // 中文姓名脱敏
            case CHINESE_NAME:
                jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str)));
                break;
            // 身份证脱敏
            case ID_CARD:
                jsonGenerator.writeString(DesensitizedUtil.idCardNum(String.valueOf(str),1,2));
                break;
            // 固定电话脱敏
            case FIXED_PHONE:
                jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str)));
                break;
            // 手机号脱敏
            case MOBILE_PHONE:
                jsonGenerator.writeString(DesensitizedUtil.mobilePhone(String.valueOf(str)));
                break;
            // 地址脱敏
            case ADDRESS:
                jsonGenerator.writeString(DesensitizedUtil.address(String.valueOf(str),8));
                break;
            // 邮箱脱敏
            case EMAIL:
                jsonGenerator.writeString(DesensitizedUtil.email(String.valueOf(str)));
                break;
            // 密码脱敏
            case PASSWORD:
                jsonGenerator.writeString(DesensitizedUtil.password(String.valueOf(str)));
                break;
            // 中国车牌脱敏
            case CAR_LICENSE:
                jsonGenerator.writeString(DesensitizedUtil.carLicense(String.valueOf(str)));
                break;
            // 银行卡脱敏
            case BANK_CARD:
                jsonGenerator.writeString(DesensitizedUtil.bankCard(String.valueOf(str)));
                break;
            default:
        }

    }

    @Override
    publicJsonSerializer createContextual(SerializerProvider serializerProvider,BeanProperty beanProperty)throwsJsonMappingException{
        if(beanProperty !=null){
            // 判断数据类型是否为String类型
            if(Objects.equals(beanProperty.getType().getRawClass(),String.class)){
                // 获取定义的注解
                Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class);
                // 为null
                if(desensitization ==null){
                    desensitization = beanProperty.getContextAnnotation(Desensitization.class);
                }
                // 不为null
                if(desensitization !=null){
                    // 创建定义的序列化类的实例并且返回,入参为注解定义的type,开始位置,结束位置。
                    returnnewDesensitizationSerialize(desensitization.type(), desensitization.startInclude(),
                            desensitization.endExclude());
                }
            }

            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
        }
        return serializerProvider.findNullValueSerializer(null);
    }
}
经过上述三步,已经完成了通过注解实现数据脱敏了,下面我们来测试一下。 首先定义一个要测试的 pojo,对应的字段加入要脱敏的策略。
/**
 *
 * @description:
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassTestPojo{

    privateString userName;

    @Desensitization(type =DesensitizationTypeEnum.MOBILE_PHONE)
    privateString phone;

    @Desensitization(type =DesensitizationTypeEnum.PASSWORD)
    privateString password;

    @Desensitization(type =DesensitizationTypeEnum.MY_RULE, startInclude =0, endExclude =2)
    privateString address;
}

接下来写一个测试的 controller

@RestController
publicclassTestController{

    @RequestMapping("/test")
    publicTestPojotestDesensitization(){
        TestPojo testPojo =newTestPojo();
        testPojo.setUserName("我是用户名");
        testPojo.setAddress("地球中国-北京市通州区京东总部2号楼");
        testPojo.setPhone("13782946666");
        testPojo.setPassword("sunyangwei123123123.");
        System.out.println(testPojo);
        return testPojo;
    }

}
e4a60722-3a94-11ee-9e74-dac502259ad0.png 

可以看到我们成功实现了数据脱敏。

4. 其他常见的数据脱敏工具推荐

除了本文介绍的 Hutool 工具之外,还有一些其他的数据脱敏工具,常见脱敏方法或工具如下所示:

4.1 Apache ShardingSphere

Apache ShardingSphere 下面存在一个数据脱敏模块,此模块集成的常用的数据脱敏的功能。其基本原理是对用户输入的 SQL 进行解析拦截,并依靠用户的脱敏配置进行 SQL 的改写,从而实现对原文字段的加密及加密字段的解密。最终实现对用户无感的加解密存储、查询。

4.2 FastJSON

平时开发 Web 项目的时候,除了默认的 Spring 自带的序列化工具,FastJson 也是一个很常用的 Spring web Restful 接口序列化的工具。 FastJSON 实现数据脱敏的方式主要有两种:

基于注解 @JSONField 实现:需要自定义一个用于脱敏的序列化的类,然后在需要脱敏的字段上通过 @JSONField 中的 serializeUsing 指定为我们自定义的序列化类型即可。

基于序列化过滤器:需要实现 ValueFilter 接口,重写 process 方法完成自定义脱敏,然后在 JSON 转换时使用自定义的转换策略。具体实现可参考这篇文章:https://juejin.cn/post/7067916686141161479

4.3 Mybatis-mate

mybatisplus 也提供了数据脱敏模块,mybatis-mate,不过在使用之前需要配置授权码。 配置内容如下所示:

# Mybatis Mate 配置
mybatis-mate:
  cert:
    grant: jxftsdfggggx
    license: GKXP9r4MCJhGID/DTGigcBcLmZjb1YZGjE4GXaAoxbtGsPC20sxpEtiUr2F7Nb1ANTUekvF6Syo6DzraA4M4oacwoLVTglzfvaEfadfsd232485eLJK1QsskrSJmreMnEaNh9lsV7Lpbxy9JeGCeM0HPEbRvq8Y+8dUt5bQYLklsa3ZIBexir+4XykZY15uqn1pYIp4pEK0+aINTa57xjJNoWuBIqm7BdFIb4l1TAcPYMTsMXhF5hfMmKD2h391HxWTshJ6jbt4YqdKD167AgeoM+B+DE1jxlLjcpskY+kFs9piOS7RCcmKBBUOgX2BD/JxhR2gQ==

5. 总结

本文主要介绍了数据脱敏的相关内容,首先介绍了数据脱敏的概念,在此基础上介绍了常用的数据脱敏规则;随后介绍了本文的重点 Hutool 工具及其使用方法,在此基础上进行了实操,分别演示了使用 DesensitizedUtil 工具类、配合 Jackson 通过注解的方式完成数据脱敏.




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    738

    浏览量

    43466
  • FTP
    FTP
    +关注

    关注

    0

    文章

    99

    浏览量

    40280
  • JVM
    JVM
    +关注

    关注

    0

    文章

    152

    浏览量

    12129
  • 过滤器
    +关注

    关注

    1

    文章

    407

    浏览量

    19002
  • JSON
    +关注

    关注

    0

    文章

    111

    浏览量

    6819

原文标题:Hutool:一行代码搞定数据脱敏

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    高速PCB设计规则有哪些

    `请问高速PCB设计规则有哪些?`
    发表于 02-25 16:07

    PD3.0的电源规则有哪些

    PD3.0的电源规则有哪些?source端电源规则有哪些?
    发表于 10-15 06:37

    STM32系列产品的命名规则有哪些

    STM32系列产品的命名规则有哪些?求大神指教
    发表于 10-21 08:06

    SQL/JAVA/mybatisplus数据脱敏实现原理

    MYSQL(电话号码,身份证)数据脱敏的实现
    的头像 发表于 06-14 17:09 3131次阅读

    数据脱敏具体指的是什么?又是如何进行数据脱敏

    一般来说,数据脱敏技术指的是在对敏感数据进行处理的过程中,通过数据变形(将数据变成模型想要的结构,如1234->1**4)的方式来降低
    发表于 11-09 09:14 1.1w次阅读

    数据脱敏技术定义及实施过程解析

    数据脱敏数据安全领域落地场景较为成熟的技术手段,在数据深层次、大范围的共享开放的今天,数据脱敏
    的头像 发表于 11-16 10:26 2116次阅读

    如何实现SpringBoot项目中的隐私数据脱敏

    数据脱敏:把系统里的一些敏感数据进行加密处理后再返回,达到保护隐私作用
    的头像 发表于 01-08 10:25 1386次阅读

    SpringBoot日志脱敏的方式介绍

    一个项目在书写了很多打印日志的代码,但是后面有了脱敏需求,如果我们去手动改动代码,会花费大量时间。如果引入本组件,完成配置即可轻松完成脱敏。(仅需三步可轻松配置)
    的头像 发表于 01-09 10:49 2020次阅读

    如何实现一个注解进行数据脱敏

      什么是数据脱敏 开胃菜 使用 Hutool 工具类实现数据掩码 使用 Jackson 进行数据序列化脱敏 注解实现
    的头像 发表于 06-14 09:37 673次阅读
    如何实现一个注解进行<b class='flag-5'>数据</b><b class='flag-5'>脱敏</b>

    SpringBoot采用JsonSerializer和Aop实现可控制的数据脱敏

    的确实现了数据脱敏,但是有个问题现在的脱敏针对的是 只要对该实体类进行了使用返回的接口,中的数据都会进行脱敏,在有些场景下是不需要的,所以说
    的头像 发表于 11-06 16:15 434次阅读
    SpringBoot采用JsonSerializer和Aop实现可控制的<b class='flag-5'>数据</b><b class='flag-5'>脱敏</b>

    盘点一下PostgreSQL的几种常用脱敏方式

    PostgreSQL Anonymizer 实现动态脱敏的方式是通过将定义某个角色为 "MASKED" 以及脱敏规则。被授予 "MASKED" 角色的用户将无法访问原始数据,而其他角色
    的头像 发表于 12-05 09:59 232次阅读
    盘点一下PostgreSQL的几种<b class='flag-5'>常用</b><b class='flag-5'>脱敏</b>方式

    SNP干货分享:SAP数据脱敏的具体实施步骤

    为什么谈SAP数据脱敏? SAP进入中国市场超过30年,作为一个典型的德国思维的产品,我们很难找到另一个市值这么大的软件,在过去的几十年中,一直活的这么滋润,没有太多的挑战,而且软件本身的变化肉眼
    的头像 发表于 01-29 23:41 156次阅读
    SNP干货分享:SAP<b class='flag-5'>数据</b><b class='flag-5'>脱敏</b>的具体实施步骤

    企业如何遵守数据安全法规进行SAP数据脱敏处理?

    规体系,以确保国家利益、企业发展和公民权益不受侵害。本文将结合中国数据安全法规,探讨SNP TDO工具在数据脱敏方面的应用价值。  近年来,我国数据安全法规不断完善,相关法律法规包括《
    的头像 发表于 01-29 23:42 111次阅读

    数据脱敏的3种常见方案,好用到爆!

    数据脱敏插件,目前支持地址脱敏、银行卡号脱敏、中文姓名脱敏、固话脱敏、身份证号
    的头像 发表于 02-25 16:14 369次阅读
    <b class='flag-5'>数据</b><b class='flag-5'>脱敏</b>的3种常见方案,好用到爆!

    车载图像如何脱敏?路畅科技给出解决方案

    随着汽车数智化进程不断加速,推动着传统汽车由交通工具向可移动的“智慧新物种”转变,车内外各种智能传感设备采集的图像等数据信息在车联网的加持下源源不断地向外传输,如何对这些数据脱敏以保护个人隐私,近日
    的头像 发表于 03-08 11:04 210次阅读