数据脱敏之由手机号生成虚拟手机号


名词解释(来自百度百科)

数据脱敏:数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。

一、需求描述

  随着社会的发展公司对于客户隐私保护越来越重视,最近接到一个数据脱敏的需求,需要将现有数据库中的真实手机号进行脱敏,保证满足以下要求:1.生成的虚拟手机号不重复;2.前三位和后四位尾号与原手机号保持一致用于客服确认客户身份;4.与原手机号长度保持一致;5.虚拟号与手机号有一对一对应关系。

二、需求分析

  基于上述需求,至少需要一张表存手机号与虚拟号的映射关系,一般公司都会有会员号,会员详情接口可以查到真实手机号,如果没有会员号再存真实手机号,既然是脱敏肯定不能明文存真实手机号,要用加密算法加密存密文,最好用公司统一加解密不要本地保存秘钥,这样连你自己都不知道这个密文怎么解密就不用担心数据泄露了。所以数据库可以设计为虚拟号、会员号、手机号这么三个主要字段的表,会员号与手机号只要有一个字段有值就行,有会员号的存会员号明文,没有会员号的存手机号密文。

  假设原手机号为:13012345678

  前三位的130用2代替首位1变成230,完成简单映射

  中间四位自增0000,0001...9999

  后四位保持不变5678

  我们需要生成的虚拟号为:23000005678

三、算法实现

  自增有很多方式实现,为了满足高并发情况下自增不重复,巧妙利用mysql数据库自增的特性,实现一个发号器,表结构很简单,就一个id字段设置为自增长主键,一个stub(存根)字段用来执行插入sql,类型简单设置为char即可。sql如下:replace into table(stub) values('a')select LAST_INSERT_ID()注意:保证两个sql语句在一个事务下执行。不了解replace into用法的童鞋我简单解释一下,插入之前先判断表是否有记录,如果有则不插入,如果没有则插入,还不清楚的同学请自行百度吧。

  如果数据库是分库分表的,那么需要注意设置数据库的自增长步长。

四、异常处理

  上述算法理论上前三位相同,后四位相同的手机号超过一万个就有可能会重复了,因为只有中间四位在自增,0-9999最多也就一万个不重复,后续如果重复了怎么办呢?虚拟号与手机号必须有一个共同的特性,唯一性,所以在建表的时候虚拟号字段需要加上唯一键约束,那么如果生成的虚拟号重复,在插入表的时候数据库会抛出唯一键异常DuplicateKeyException,我们只需要catch DuplicateKeyException然后递归调用生成虚拟号的代码即可(也就是中间四位继续往下递增,直到虚拟号不重复插入表成功为止)。

五、历史数据清理

  查询出所有的需要脱敏的真实手机号插入到一张ClearDataTemp的临时表,可以存明文手机号与明文的虚拟号,然后跑生成虚拟号的程序生成虚拟号插入ClearDataTemp,然后根据这张表去做联表更新,如果是生产库建议先做备份,出问题可以随时回滚,然后用加虚拟号字段的方式试运行一段时间,没问题再将原字段删除,加的字段rename为原字段即可,这样可保万无一失。

六、总结

  这套生成虚拟号的算法应该满足大多数数据脱敏的场景,如身份证号、手机号、卡号、客户号,可根据使用场景自行扩展。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM