数据脱敏 – 正则表达式

上节的内容我们说到了使用工具类对要出输出的数据进行掩码处理以达到保护数据的目的,上面的方法在一些简单场景都好使用,但是遇到类似最后提出的json字符串处理起来就 力有不逮 了。这时就需要用到一种新的字符串处理技术 – 没错,它就是正则表达式。
关于正则表达式的基础,前面的花过几节内容做了比较相信的讲解,感兴趣的可以前去考古,重学正则表达式。

怎么用?

正则表达式
对于上一节提到的复杂字符串的匹配,可以使用正则表达式来处理,例如,手机号的正则是这样 (不考虑号段等问题,只认为手机号是一个11位的以 1 开头的数字字符串)

^1\d{2}\d{4}\d{4}$

因为需要对手机号中间部分进行替换,这里需要用到一个分组的概念,因此手机号的正则表达式加入分组以后是这个样子:

(1\d{2})\d{4}(\d{4})

有了分组以后,我们只需要保留第一个分组和第二个分组,把其余部分替换为 * 就可以了,现在,修改下我们上一节的方法:

/*** 手机号掩码处理 15312345567 -->  153****5567** @param mobile 手机号* @return 处理后的手机号*/public static String maskMobile(String mobile) {if (!StringUtils.hasText(mobile)) {return "";}return mobile.replaceAll("(1\\d{2})\\d{4}(\\d{4})","$1****$2");}

测试一下:

public static void main(String[] args) {String phone = "15312345567";String maskMobile = maskMobile(phone);log.info("maskMobile = {}", maskMobile);}
// [com.info.examples.log.controller.MaskUtils:62] maskMobile = 153****5567

我们看到,结果依然是符合预期的,这时我们把刚才说的 json 字符串拿来进行测试:

public static void main(String[] args) {String json = "{\"email\":\"10000@qq.com\",\"idNo\":\"31033219990909432X\",\"mobile\":\"15312345567\",\"name\":\"王语嫣\"}";String maskJson = maskMobile(json);log.info("maskJson = {}", maskJson);}
// [com.info.examples.log.controller.MaskUtils:64] maskJson = {"email":"10000@qq.com","idNo":"3103****990909432X","mobile":"153****5567","name":"王语嫣"}

可以发现,手机号确实是已经被掩码处理了,但是身份证号也被处理了,而且处理的结果和我们预期不符,这是什么原因呢?
这里就是提到正则表达式的匹配机制了,仔细观察我们发现,其实身份证的 10332199909 这一部分数据也是满足我们上面写的手机号的规则的,因此这一部分数据也被匹配到处理了。这时怎么处理呢?我们要精确匹配手机号。通常我们是使用 ^ 表示正则达表示的开始,使用 $ 表示正则表达式的结束,修改正则表达式:

^(1\d{2})\d{4}(\d{4})$

在此测试,我们发现结果如下:

[com.info.examples.log.controller.MaskUtils:64] maskJson = {"email":"10000@qq.com","idNo":"31033219990909432X","mobile":"15312345567","name":"王语嫣"}

怎么越改越不对了呢?这次手机号也没有匹配到!还是回到正则表达式,我们说了 ^ 表示正则达表示的开始,使用 $ 表示正则表达式的结束,因此 ^的前面不能出现任何字符,空格也不可以,$ 的后面也不能出现任何字符。但是在 json 字符串里,手机号的前面还有 " ,结束后也会有 " ,因此我们上面的正则表达式是不满足 json 串中手机号的规则的,在此修改手机号的正则:

\"(1\d{2})\d{4}(\d{4})\"

这个时候再来测试:

[com.info.examples.log.controller.MaskUtils:64] maskJson = {"email":"10000@qq.com","idNo":"31033219990909432X","mobile":153****5567,"name":"王语嫣"}

只有手机号被掩码处理了,这就符合我们的预期了!
对正则表达式不理解的可以考古,重学正则表达式。
照猫画虎,修改其余的几个正则表达式:

@Slf4j
public class MaskUtils {/*** 手机号掩码处理 15312345567 -->  153****5567** @param mobile 手机号* @return 处理后的手机号*/public static String maskMobile(String mobile) {if (!StringUtils.hasText(mobile)) {return "";}return mobile.replaceAll("\"(1\\d{2})\\d{4}(\\d{4})\"", "$1****$2");}/*** 姓名掩码处理  王语嫣  -->  王**** @param name 姓名* @return 处理后的姓名*/public static String maskName(String name) {if (!StringUtils.hasText(name)) {return "";}return name.replaceAll("['\"]([\u4e00-\u9fa5\\s])([\u4e00-\u9fa5.\\s]*)['\"]", "\"$1**\"");}/*** 身份证号掩码处理 31033219990909432X -->  3103**********432X** @param idCardNo 身份证号码* @return 处理后的身份证号码*/public static String maskIdCardNo(String idCardNo) {if (!StringUtils.hasText(idCardNo)) {return "";}// 处理 15 位身份证return idCardNo.replaceAll("['\"]([1-9]\\d{3})(\\d{7})(\\d{4})['\"]", "\"$1**********$3\"").// 处理 18 位身份证replaceAll("['\"]([1-9]\\d{3})(\\d{10}(\\d{3}[Xx]))['\"]", "\"$1**********$3\"");}/*** 电子邮箱掩码处理 10000@qq.com -->  100***@qq.com** @param email 电子邮箱* @return 处理后的电子邮箱*/public static String maskEmail(String email) {if (!StringUtils.hasText(email)) {return "";}return email.replaceAll("['\"]([a-zA-Z0-9_\\-.]{1,3})[a-zA-Z0-9_\\-.]*@([a-zA-Z0-9_\\-.]+)\\.([a-zA-Z]{2,5})['\"]", "\"$1***@$2.$3\"");}
}

再次测试:

public static void main(String[] args) {String json = "{\"email\":\"10000@qq.com\",\"idNo\":\"31033219990909432X\",\"mobile\":\"15312345567\",\"name\":\"王语嫣\"}";String maskJson = maskEmail(maskIdCardNo(maskName(maskMobile(json))));log.info("maskJson = {}", maskJson);}
// [com.info.examples.log.controller.MaskUtils:73] maskJson = {"email":"100***@qq.com","idNo":"3103**********432X","mobile":153****5567,"name":"王**"}

我们发现,所有的敏感信息都按我们的规则进行了掩码处理。这时候我们只需要封装一个处理 json 掩码的方法,打印 json 前调用一下这个方法就可以了。

但是事情真的那么简单吗?

但是现实往往是残酷的,如果是一个新项目,确实可以这么做,但是如果要是对一个老项目进行改造呢?每个打印日志的方法都去改一遍吗?

那么有没有一个更简单的方法呢?
答案是 有!

今天的内容到这里暂告一段落,谢谢各位阅读,如有不妥之处还请指正,感激不尽。
欲知后事如何,且听下回分解。

数据脱敏,你会了吗(二)相关推荐

  1. Springboot 日志、配置文件、接口数据脱敏

    核心隐私数据无论对于企业还是用户来说尤其重要,因此要想办法杜绝各种隐私数据的泄漏.下面陈某带大家从以下三个方面讲解一下隐私数据如何脱敏,也是日常开发中需要注意的: 配置文件数据脱敏 接口返回数据脱敏 ...

  2. 互联网金融售前心得数据脱敏分析 | PMCAFF微分享

     本期主题 | 互联网金融售前心得&数据脱敏分析 分享嘉宾 | Gina 文字整理 | Mayi-天享 入群请联系管理员37°C微信号:erhuoyimei Gina 本期嘉 ...

  3. 数据脱敏的 6 种方案

    一.什么是数据脱敏 英文全称:Data Masking . 先来看看什么是数据脱敏?数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如 手机号.银行卡号 等信息,进行转换或者 ...

  4. Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)

    这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号.密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小. 说起这个我是比较有感触的, ...

  5. 数据脱敏和加密_数据脱敏和数据加密的区别--工作需要,对其进行了简单的整理...

    转至:https://blog.csdn.net/zfh_0916/article/details/104688307 通过查阅资料,了解数据脱敏和数据加密是两种截然不同的技术,根据不同的应用目的选用 ...

  6. 数据脱敏 Data Masking

    一. 数据脱敏是什么? 数据脱敏顾名思义就是对敏感数据进行变形处理,其目的是保护隐私数据等信息的安全,例如机构和企业收集的个人身份信息.手机号码.银行卡信息等敏感数据.数据脱敏从技术上可以分为静态数据 ...

  7. 提到图像数据脱敏,看这家公司如何理解

    交流群 | 进"传感器群/滑板底盘群"请加微信号:xsh041388 交流群 | 进"汽车基础软件群"请加微信号:Faye_chloe 备注信息:群名称 + 真 ...

  8. 隐私计算:数据脱敏、匿名化、假名化、差分隐私和同态加密

    ​​​​​随着数据挖掘技术的普遍应用,一些厂商通过发布用户数据集的方式鼓励研究人员进一步深入挖掘数据的内在价值,在数据集发布的过程中,就存在安全隐患,可能导致用户隐私的泄露.2016年欧盟通过< ...

  9. 数据脱敏技术的实践指南

    本文转载自:https://mp.weixin.qq.com/s/LsL7pIb3jEwCq6i0fsXKPA 一.概述 企业在运营过程中开展数据脱敏工作,往往面对的是大规模的数据集,信息化程度越高的 ...

最新文章

  1. Java abstract 关键字
  2. AnjularJS笔记5--ng-repeat跟据ID判断重复性
  3. 函数指针,以及用函数指针的好用之处(回调函数)
  4. EMCA和EMCTL的简单用法
  5. mysql字段名explain_Mysql中explain用法和结果字段的含义介绍
  6. 通讯簿电话号码同步相关问题
  7. 【渝粤教育】广东开放大学 商务翻译实务 形成性考核 (49)
  8. Silverlight学习笔记四BusyIndicator控件(进度条)
  9. cocoapods 总结
  10. Ant十五大最佳实践
  11. 详细船舶信息爬虫教程:船讯网根据MMSI爬取对应船舶属性信息|附python爬虫代码
  12. 制作一个简单HTML传统端午节日网页(HTML+CSS)
  13. 阿里云服务器配置端口安全组完整教程大全
  14. 阿里云API请求签名失败的解决办法
  15. R语言入门——不掉包实现FNN(单层感知机)
  16. 推特(twitter)翻译
  17. 信息系统项目管理师必背核心考点(四十九)合同法
  18. Javascript入门阶段——else if语句
  19. 计算机大数乘法引发的思考
  20. 计算机专业用苹果哪款笔记本,2019笔记本电脑排行榜 苹果笔记本电脑哪款好

热门文章

  1. 了解Cookie是什么
  2. 手机投屏电脑 - 用电脑看手机,爽歪歪!(仅限Win10,Win7/Win8不支持)
  3. MIPI_DSI协议
  4. 〈Android 群英传-神兵利器〉第7章一个的寂寞与一群人的狂欢
  5. Google 搜素技巧分享
  6. DIV display与visibility
  7. HTML字母加圈,终于找到了最详细系列之HTML字符实体
  8. 金堂五月花计算机学校招聘,2019年成都市金堂五月花学校招生简介
  9. linux查看进程线程的方法
  10. 4、OOA 面向对象分析