您当前的位置:首页 > 互联网百科 > 大数据

Hutool:如何使用一行代码实现数据脱敏?

时间:2023-08-11 12:40:07  来源:  作者:京东云开发者

1. 什么是数据脱敏

 

1.1 数据脱敏的定义

数据脱敏百度百科中是这样定义的:

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

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

在数据脱敏过程中,通常会采用不同的算法和技术,以根据不同的需求和场景对数据进行处理。例如,对于身份证号码,可以使用掩码算法(masking)将前几位数字保留,其他位用 “X” 或 "*" 代替;对于姓名,可以使用伪造(pseudonymization)算法,将真实姓名替换成随机生成的假名。

1.2 常用脱敏规则

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

2. Hutool 工具介绍

2.1 引入 Maven 配置

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

<dependency>

<groupId>cn.hutool</groupId>

<artifactId>hutool-all</artifactId>

<version>5.8.16</version>

</dependency>

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

2.2 Hutool 包含的组件

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

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

Hutool:如何使用一行代码实现数据脱敏?

注意:Hutool 脱敏是通过 * 来代替敏感信息的,具体实现是在 StrUtil.hide 方法中,如果我们想要自定义隐藏符号,则可以把 Hutool 的源码拷出来,重新实现即可。

这里以手机号、银行卡号、身份证号、密码信息的脱敏为例,下面是对应的测试代码。

import cn.hutool.core.util.DesensitizedUtil;

import org.junit.Test;

import org.springframework.boot.test.context.SpringBootTest;

/**

* @description: Hutool实现数据脱敏

*/

@SpringBootTest

public class HuToolDesensitizationTest {

@Test

public void testPhoneDesensitization(){

String phone="13723231234";

System.out.println(DesensitizedUtil.mobilePhone(phone)); //输出:137****1234

}

@Test

public void testBankCardDesensitization(){

String bankCard="6217000130008255666";

System.out.println(DesensitizedUtil.bankCard(bankCard)); //输出:6217 **** **** *** 5666

}

@Test

public void testIdCardNumDesensitization(){

String idCardNum="411021199901102321";

//只显示前4位和后2位

System.out.println(DesensitizedUtil.idCardNum(idCardNum,4,2)); //输出:4110************21

}

@Test

public void testPasswordDesensitization(){

String password="www.jd.com_35711";

System.out.println(DesensitizedUtil.password(password)); //输出:****************

}

}

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

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

现在有了数据脱敏工具类,如果前端需要显示数据数据的地方比较多,我们不可能在每个地方都调用一个工具类,这样就显得代码太冗余了,那我们如何通过注解的方式优雅的完成数据脱敏呢?

如果项目是基于 springboot 的 web 项目,则可以利用 springboot 自带的 jackson 自定义序列化实现。它的实现原来其实就是在 json 进行序列化渲染给前端时,进行脱敏。

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

/**

* @author

* @description:脱敏策略枚举

*/

public enum DesensitizationTypeEnum {

//自定义

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生效

*/

DesensitizationTypeEnum type() default DesensitizationTypeEnum.MY_RULE;

/**

* 脱敏开始位置(包含)

*/

int startInclude() default 0;

/**

* 脱敏结束位置(不包含)

*/

int endExclude() default 0;

}

注:只有使用了自定义的脱敏枚举 MY_RULE 的时候,开始位置和结束位置才生效。

第三步:创建自定的序列化类

这一步是我们实现数据脱敏的关键。自定义序列化类继承 JsonSerializer,实现 ContextualSerializer 接口,并重写两个方法。

/**

* @author

* @description: 自定义序列化类

*/

@AllArgsConstructor

@NoArgsConstructor

public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer {

private DesensitizationTypeEnum type;

private Integer startInclude;

private Integer endExclude;

@Override

public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

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

public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMAppingException {

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,开始位置,结束位置。

return new DesensitizationSerialize(desensitization.type(), desensitization.startInclude(),

desensitization.endExclude());

}

}

return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);

}

return serializerProvider.findNullValueSerializer(null);

}

}

经过上述三步,已经完成了通过注解实现数据脱敏了,下面我们来测试一下。

首先定义一个要测试的 pojo,对应的字段加入要脱敏的策略。

/**

* @description:

*/

@Data

@NoArgsConstructor

@AllArgsConstructor

public class TestPojo {

private String userName;

@Desensitization(type = DesensitizationTypeEnum.MOBILE_PHONE)

private String phone;

@Desensitization(type = DesensitizationTypeEnum.PASSWORD)

private String password;

@Desensitization(type = DesensitizationTypeEnum.MY_RULE, startInclude = 0, endExclude = 2)

private String address;

}

接下来写一个测试的 controller

@RestController

public class TestController {

@RequestMapping("/test")

public TestPojo testDesensitization(){

TestPojo testPojo = new TestPojo();

testPojo.setUserName("我是用户名");

testPojo.setAddress("地球中国-北京市通州区京东总部2号楼");

testPojo.setPhone("13782946666");

testPojo.setPassword("sunyangwei123123123.");

System.out.println(testPojo);

return testPojo;

}

}

Hutool:如何使用一行代码实现数据脱敏?

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

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

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

4.1 Apache ShardingSphere

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

具体实现方式可参考下面文章: https://jaskey.Github.io/blog/2020/03/18/sharding-sphere-data-desensitization/

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==

具体实现可参考 baomidou 提供的如下代码: https://gitee.com/baomidou/mybatis-mate-examples

5. 总结

本文主要介绍了数据脱敏的相关内容,首先介绍了数据脱敏的概念,在此基础上介绍了常用的数据脱敏规则;随后介绍了本文的重点 Hutool 工具及其使用方法,在此基础上进行了实操,分别演示了使用 DesensitizedUtil 工具类、配合 Jackson 通过注解的方式完成数据脱敏;最后,介绍了一些常见的数据脱敏方法,并附上了对应的教程链接供大家参考,本文内容如有不当之处,还请大家批评指正。

6. 参考内容

Hutool 工具官网: https://hutool.cn/docs/#/?id=%f0%9f%93%9a%e7%ae%80%e4%bb%8b

聊聊如何自定义数据脱敏: https://juejin.cn/post/7046567603971719204

FastJSON 实现数据脱敏: https://juejin.cn/post/7067916686141161479

 

作者:京东科技 孙扬威
来源:京东云开发者社区


Tags:Hutool   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Java优秀开源工具库:Hutool和Jodd有什么区别?
Hutool 和 Jodd 都是 Java 生态中的优秀工具库和框架,它们都为 Java 开发者提供了一系列便捷的功能,但它们的侧重点、设计哲学和提供的组件有所不同。Hutool:主要是一个工具类...【详细内容】
2023-10-31  Search: Hutool  点击:(59)  评论:(0)  加入收藏
Hutool:如何使用一行代码实现数据脱敏?
1. 什么是数据脱敏 1.1 数据脱敏的定义数据脱敏百度百科中是这样定义的:数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样就可以在开发...【详细内容】
2023-08-11  Search: Hutool  点击:(49)  评论:(0)  加入收藏
干掉繁琐的工具类库,国产Java工具类库:Hutool
大家好,我是墨林,今天在开源社区,无意中发现一款开源的宝藏级项目:Hutool,目前在Gitee上已经高达20.2K的Star,Hutool谐音“糊涂”,寓意简洁而又不用关心内部实现。在平常的项目开发...【详细内容】
2023-04-10  Search: Hutool  点击:(340)  评论:(0)  加入收藏
hutool-db实现多数据源配置
我们在日常开发中,经常会用到一个系统需要链接多个数据库来实现业务的需求,比如多个系统之间数据调用、两个数据之间同步等等。今天给大家分享使用Hutool-db实现多数据源配...【详细内容】
2022-12-19  Search: Hutool  点击:(474)  评论:(0)  加入收藏
Hutool 工具类的简单使用入门
Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 一、Hutool 依...【详细内容】
2022-08-18  Search: Hutool  点击:(1035)  评论:(0)  加入收藏
▌简易百科推荐
大数据杀熟何时告别“人人喊打却无可奈何”?
2月7日郑州飞往珠海的航班,不同手机、不同账号搜索该航班显示出不同价格。图源网络有网友近日分享在某平台的购票经历,引发社会广泛关注&mdash;&mdash;用3个账号买同一航班同...【详细内容】
2024-01-30    中国青年网  Tags:大数据杀熟   点击:(32)  评论:(0)  加入收藏
简易百科:到底什么是大数据?
随着互联网的快速发展,大数据已经成为了当今社会最热门的话题之一。那么,到底什么是大数据呢?首先,我们需要明确大数据的定义。大数据是指数据量极大、类型繁多、处理难度高的数...【详细内容】
2024-01-30    简易百科  Tags:大数据   点击:(40)  评论:(0)  加入收藏
数据采集新篇章:AI与大模型的融合应用
开篇在AIGC(人工智能与通用计算)应用中,大型语言模型(LLM)占据着举足轻重的地位。这些模型,如GPT和BERT系列,通过处理和分析庞大的数据集,已经极大地推动了自然语言理解和生成的边界...【详细内容】
2024-01-17  崔皓  51CTO  Tags:数据采集   点击:(50)  评论:(0)  加入收藏
挑战 Spark 和 Flink?大数据技术栈的突围和战争
十年的轮回,正如大数据的发展一般,它既是一个轮回的结束,也是崭新的起点。大数据在过去的二十年中蓬勃发展,从无到有,崛起为最具爆炸性的技术领域之一,逐渐演变成为每个企业不可或...【详细内容】
2024-01-17  InfoQ    Tags:大数据   点击:(40)  评论:(0)  加入收藏
分布式存储系统在大数据处理中扮演着怎样的角色?
如果存储节点本身可以定制,则通常会让其支持部分计算能力,以利用数据的亲和性,将部分计算下推到相关的存储节点上。如果存储是云上的 S3 等对象存储,无法定制,则通常会将数据在计...【详细内容】
2023-12-19  木鸟杂记  微信公众号  Tags:大数据   点击:(48)  评论:(0)  加入收藏
大数据如何实时拯救生命:车联网的数据分析有助预防交通事故
译者 | 李睿审校 | 重楼车联网(IoV)是汽车行业与物联网相结合的产物。预计车联网数据规模将越来越大,尤其是当电动汽车成为汽车市场新的增长引擎。问题是:用户的数据平台准备...【详细内容】
2023-12-19    51CTO  Tags:大数据   点击:(41)  评论:(0)  加入收藏
利用生成对抗网络进行匿名化数据处理
在互联网时代,数据日益成为人们的生产资料。然而,在某些情况下,我们需要分享数据,但又需要保护个人隐私。这时,匿名化技术就显得尤为重要。本文将介绍利用生成对抗网络进行匿名化...【详细内容】
2023-12-18  技巧达人小影    Tags:数据处理   点击:(56)  评论:(0)  加入收藏
盘点那些常见的数据中心类型,你知道几个?
在数字化潮流的浪潮下,数据中心如同企业的神经系统,关系到业务的稳健运转。而在这个巨大的网络中,各种数据中心类型如雨后春笋般崭露头角。从企业级的个性至云数据中心的虚拟化...【详细内容】
2023-12-07  数据中心之家  微信公众号  Tags:数据中心   点击:(65)  评论:(0)  加入收藏
数据中心的七个关键特征
随着信息技术的不断演进,数据中心的可靠性、可扩展性、高效性、安全性、灵活性、管理性和可持续性成为业界探讨的焦点。下面让我们一同深入剖析这些关键特征,了解它们是如何影...【详细内容】
2023-12-06  数据中心之家  微信公众号  Tags:数据   点击:(63)  评论:(0)  加入收藏
什么是数据解析?将数据转化为更好的决策
什么是数据解析?数据解析是一门专注于从数据中获取洞察力的学科。它包含数据分析(data analysis)和管理的流程、工具和技术,包括数据的收集、组织和存储。数据解析的主要目的是...【详细内容】
2023-12-06  计算机世界    Tags:数据解析   点击:(62)  评论:(0)  加入收藏
站内最新
站内热门
站内头条