开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-数据脱敏-需求及实现思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11647
数据预处理-数据脱敏-需求及实现思路
目标:数据脱敏模块的目标就是为了实现数据当中含有身份证和手机号码等敏感信息,为了防止数据泄露,需要将数据进行脱敏工作,或者是进行加密。也就是说数据当中有明文手机号码和身份号,然后把进行加密,让看不出来就行了,这是需求,也是项目的目标。
需求:由于 cookie 信息当中可能带有敏感信息,用户的手机号身份证号,然后对于这些敏感信息,需要对进行加密、脱敏的操作,为了防止数据丢失或者说泄露数据,这个就是需求,使用的算法就是 MD5对手机号码以及身份证号码进行加密。
设计:设计思路就是先引入算法,然后对手机号码去查询出纯手机号码的数据进行加密,然后再计算出纯身份证号码的数据进行加密,下面就来实现这个功能:
在实现这个工能之前,前面的工作是数据的清洗,现在数据清洗已经做完了,也就是说在数据清洗之前,有很多数据经过清洗以后变成了很少的数据,没用的数据都过滤掉了,而脱敏工作也一定要在清洗以后的数据进行脱敏的。
所以脱敏工作一定要建立在数据清洗的数据的基础之上,所以拿到清洗后的数据调用,然后调用用 map 的方法,因为map 里面是有返回值的,map 有返回值,因为第三步是脱敏,而第四步第五步第六步里面有好多的步骤都是需要用到前面的数据的,所以这里面就要用 map,需要有个返回,而返回里面 map 调用的是辨认出的是每一条数据,每一条数据拿到以后,然后在程序里面要做的是数据的脱敏工作,而这里面包括身份证号透明和手机号码透明两种。
先把数据脱敏工作放在清洗后的数据的 map 里面:
第3步数据脱敏一直到第8步数据结构化,实际上都要放在这里面来,只不过现在先放这一个,后面再给一个个补充过来。
加进来以后得做一个接收,用一个 object 的名称叫 dataprocess,数据预处理。接下来进行的是数据预处理,在这个基础上数据预处理。
然后接收过来数据以后,因为是 map,所以就得触发一下,就加上.foreach,然后 println 来做一个输出。
实现数据的手机号码脱敏的方法,具体这个方法名字叫做加密数据,加密手机号。将然后把数据 Message 传递过来,没写过这个代码,所以要把这个方法 object 创建一下,在业务处理 business process 里面,右键新建一个object,确定以后这个代码是用于实现数据脱敏的代码,手机号和身份证号,们的脱敏都放在这里面。然后接下来再来引一下, business process 里面自己创建的,object 有了但是方法还没有。创建方法:里面做一个接收,用于实现手机号码的脱敏。
这个就是手机号码的脱敏,实际上就是加密手机号,不报错之后就进入了程序,进来以后接下来就开始实现手机号码的脱敏。
第一步读取 kafka 里的数据到程序中已,
第二步读取身份证号和手机号码正则表达式,实际上这里身份证号就先不读就读手机号码。
第三步使用正则表达式匹配出有可能是手机号码的数据。数据当中,message 里可能是有很多数据,而这么多数据里面有可能有手机号,也有可能没有手机号,而不是手机号的,因为是个正责,也有可能匹配上一些数据,只不过这些数据有可能不是手机号。所以要做一个判断,也就是说这里面匹配出有可能是手机号的正则,再往后找出有可能是的,也有可能不是的。
第四步判断出在这些有可能不是当中判断出一定是手机号的代码,一定是手机号的数据。判断一定是手机号,有两种情况,一种情况就是手机号码的前一位不是数字,后一位也不是数字,那一定是手机号码。另一种情况是手机号码的前一位不是数字,手机号码是一条数据中的最后一个数据,也一定是手机号码。然后这是两种一定是手机号的判断。
第五步确定出手机号码以后将手机号进行加密,再用加密后的数据替换原始加密以前的数据,就实现了手机号码的脱敏工作。
这个就是实现手机号码加密的流程,总结如下:
首先得有手机的正则,然后使用正则去数据里面匹配,而数据里面有可能什么样的格式都有,直接拿原始数据去匹配,可能会出现有可能是的,也有可能不是的,有多种情况,判断出一定是手机号的数据,判断出一定是手机号的数据以后,将手机号加密,还要一个引入 MD5,这是总的大的流程。MD5加密完了以后去用加密后的数据替换原始数据,这样就把加密做完了。怎么判断数据一定是手机号?举例如下:abcdef 中加入18611577667变成abc18611577667def,加入了手机号码以后,判断出正则表达式肯定是一个数字,以1开头的,一共11位有可能是数字,匹配的时候一定是手机号码给匹配出来这个结果。前一个位置是字母,后一个位置也是字母,那么这种情况一定是手机号码。还有一种情况叫做 abcdef 后面又加入了1861157667变成 abcdef1861157667。假如说这就到数据的最后一行了,最后一个数据了,这个数据就长成这个样子。那也就是说 abcdef 后面是18611577667,这是个手机号码,这个手机号码一定是这个数值匹配出来以后,也满足手机号的正则1开头一共有11个。现在来看也一定是手机号,因为后面已经没有数据了,这个数据的手机号码已经到了数据的最后一位,一定是手机号。这两种情况一定是手机号。
也有不是手机号的情况,举例如下:
12345,然后18611577667,然后后面又加了一堆字符串,变成12341861157766726这有可能是一些二维码,还有一些商品的一些串号或者手机串号等等。数据里面去匹配,正则表达式18611577667是手机号码,虽然现在看好像是手机号,但是就这一整条数据来看,不是手机号码,可能是用数据当中的一部分。这是一个18位的数字,有可能是身份证号码,身份证号码当中有可能匹配上了数据,18611577667,这个也不是手机号码。
总的来说如果确定是不是手机号码,在前一位一定不能是数字类型,后面也不是数字,匹配了正则有可能就是手机号码了。
如果前面不是数字,后面假设说再来个123,变成 w18611577667d23,这个数据虽然前面也能匹配上手机的正则,但是也不是手机号码。因为一整条数据7后面还有123。
两种情况:手机号码前一位不是数字,并且手机号码是这一条数据当中最后一个数据;
手机号码前一位不是数字,并且后一位也不是数字,那么就表示是手机号码
这就是实现手机号码脱敏的实现过程,实现的思路。