掘金 后端 ( ) • 2024-03-06 15:25

theme: scrolls-light

纵死侠骨香,不惭世上英。

1 前言

数据脱敏(Data Masking)是一种数据保护技术,在日常的开发过程中,经常会遇到敏感数据,如个人信息,姓名、手机号、身份证,银行卡,地址等信息。这些数据在返回页面或者日志打印时,为了保护数据的隐私和安全性,同时尽量保持数据的格式,就需要隐藏或者替换部分敏感数据。在本文中,将介绍日志信息脱敏和数据脱敏,前者是为了防止业务日志信息泄露敏感信息,后者是在前端页面避免暴露敏感信息。

2 数据脱敏

对于数据脱敏的实现方式,通常由以下三种:

  • 1 数据替换,将敏感数据替换为符合特定格式的伪造数据,比如姓名手机号替换,金额末几位替换等。
  • 2 数据屏蔽,对敏感数据进行屏蔽,只显示部分信息,比如只显示银行卡、身份证件的前后几位,这也是常用的方式。
  • 3 数据加密,对敏感数据进行加密处理,只有特定用户输入密码或者插入硬件ukey后才能查看真实数据。

数据脱敏的目的和益处:

  • 1 数据保护,通过脱敏技术,可以使得数据在传输、处理、展示过程减少数据泄露和滥用的风险。
  • 2 数据合规,许多行业和法规对敏感数据的保护都有着严格的要求,保护敏感数据不泄露是合规的必须要求。

3 返回值脱敏

在前文中已经介绍了 SpringBoot-开发技巧-加密返回字段, 其实这也是数据脱敏的一种方式,不过在本文中将介绍另外一种实现方式,使用 jackson 序列化的方式实现数据的脱敏。

首先,我们需要自定义一个脱敏的注解,并配置其脱敏的策略: 1708771179084.png

然后,需要配置序列化的处理器,主要是通过字段的注解匹配序列化的方式,实现如下的两个方法:

# jackson 序列化字段以及匹配脱敏的方式
ContextualSerializer.createContextual
JsonSerializer.serialize

1708771608282.png

以下是数据脱敏的正则替换,最终通过正则表达式的方式实现数据的脱敏,通常使用 * 来掩盖部分敏感信息。 1708772254188.png 最终,我们需要通过对需要脱敏的字段加注脱敏的类型即可实现数据返回的脱敏,但是需要注意的是,只能在最终返回时进行数据的转换,否则在业务处理过程中导致业务数据的脱敏,会影响正常的业务流程。

1708772468483.png

如上图所示,通过注解的方式即可实现数据展示的脱敏。

4 hutool 脱敏工具

对于数据的脱敏手段,这里介绍的是 hutool 里面相应的脱敏工具类,通常包含用户名称、身份证号、手机号、地址、邮箱、密码以及银行卡等信息。对于数据的脱敏,通常是替换部分信息或者全部信息、替换中间的部分信息,对于车牌号以及地址等信息,可以替换其中的数字信息。

1708780554960.png

# hutool 数据脱敏
// 姓名脱敏
DesensitizedUtil.chineseName("李成梁");//  "李**"
// 身份证号脱敏,需要指定前后展示的位数
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);//"5***************1X"
// 手机号脱敏
DesensitizedUtil.fixedPhone("09157518479");// "0915*****79"
DesensitizedUtil.mobilePhone("18049531999");// "180****1999"
// 地址信息脱敏,指定脱敏的位数
DesensitizedUtil.address("北京市海淀区马连洼街道289号", 8);// "北京市海淀区马********"
// 邮箱脱敏
DesensitizedUtil.email("[email protected]");// "d*************@gmail.com.cn"
// 密码脱敏
DesensitizedUtil.password("1234567890");// "**********"
// 车牌号脱敏
DesensitizedUtil.carLicense("苏D40000");//"苏D4***0"
// 银行卡号脱敏
DesensitizedUtil.bankCard("11011111222233333256");// "1101 **** **** **** 3256"

5 日志脱敏

在开发实践中,会在项目代码中打印业务日志,业务日志中也会包含着敏感信息,也需要进行日志的脱敏。日志的脱敏,需要继承 MessageConverter,然后重新 convert 方法,通过重写日志的方式来实现信息的脱敏。这里采用了配置的方式,可以通过配置中心的设置,使得脱敏规则的即时生效。脱敏的方式可以使用关键字的方式以及正则匹配的方式。

1708785666135.png

下图是关键字表达式和正则表达式的方式来实现日志的脱敏。 1708786686929.png

在此处,需要按照特定的匹配方式寻找对应字段的处理器,这里使用了模板和策略模式,可以参照 springboot-策略和模板模式的思考与实践 进行处理。 1708787066917.png 最后需要在 resources 中配置相应的日志格式以及 springboot 的自动配置。 1708788150783.png

日志信息脱敏项目 sandbox-desen 可以打成 jar 包集成到其它项目中,加以简单的配置既可以实现日志信息的脱敏。首先需要添加脱敏组件的依赖,在项目中配置脱敏规则,脱敏规则已经有默认配置项,最后在 resources 中配置 logback-spring.xml 文件,加载配置文件即可实现日志中的敏感信息脱敏。

1708788395951.png

6 总结

在本文中介绍了数据脱敏的内容,主要介绍了数据返回值的脱敏和日志信息脱敏,两种脱敏方式都是保护数据的重要组成部分。本文中的数据脱敏实践仅仅是众多实现方式的一种,数据脱敏还可以有其它的方式,对于日志的脱敏还可以更精准的实现,而不需要使用字符串匹配的方式来实现。本文中所涉及的代码已经上传至 github, 欢迎交流学习。项目地址 springboot-auth