数据脱敏的处理方法及查询

时间:2024-02-25 21:20:14

原文链接:http://c.raqsoft.com.cn/article/1542086931552?r=alice

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

2)、本文介绍的脱敏数据报表查询将利用润乾集算器编写 SPL 脚本,对敏感信息字段 (如: 姓名、证件号、银行账户、住址、电话号码、企业名称、工商注册号、纳税人识别号) 等通过预定义的脱敏规则进行数据脱敏、变形,实现敏感隐私数据的保护。

3)、润乾集算器能使脱敏工作变得的简单易行,同时可以减少大量重复性工作。通过集算器 SPL 脚本实现的脱敏数据,可直接作为报表数据集进行查询分析,也可以作为开发、测试和其它非生产环境或外包环境下的真实数据集使用。

数据脱敏的处理方法及查询

1.1  数据脱敏介绍

根据百度词条的解释,数据脱敏是“指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。是数据库安全技术之一,数据库安全技术主要包括:数据库漏扫、数据库加密数据库防火墙数据脱敏数据库安全审计系统。”

随着信息时代的发展,我们对数据信息的安全要求越来越重视,比如对非生产环境下的敏感数据的脱敏保护。在金融、运营商、*、能源等部门,非生产环境下数据脱敏已列入监管部门的法规要求。非生产环境数据多用于开发、测试、培训以及第三方数据分析、挖掘,如果不能有效实施敏感数据保护,极易造成敏感数据的泄露。所以,保证非生产数据的安全已经成为一个重要的课题,要求我们能够通过对敏感信息进行脱敏、变形,实现有效的数据保护。

1.2  对数据脱敏工具的要求

数据脱敏工具应该具有对多种异构数据源的支持,从而将一个脱敏规则应用于不同的数据源,比如针对“客户名称”字段的修改,脱敏规则基本一致,所以应该可以在 Excel、TXT、Oracle、MS SQLServer、MySQL、Hadoop 等数据源上直接引用。另外,工具还应支持将脱敏数据完全不落地分发,提供文件到文件、文件到数据库、数据库到数据库、数据库到文件等方式,并且不需要在生产系统或本地安装任何客户端。

本文介绍的脱敏数据报表查询将利用润乾集算器编写 SPL 脚本,对敏感信息字段 ( 如: 姓名、证件号、银行账户、住址、电话号码、企业名称、工商注册号、纳税人识别号) 等通过预定义的脱敏规则进行数据脱敏、变形,实现敏感隐私数据的保护。

润乾集算器能使脱敏工作变得的简单易行,同时可以减少大量重复性工作。通过集算器 SPL 脚本实现的脱敏数据,可直接作为报表数据集进行查询分析,也可以作为开发、测试和其它非生产环境或外包环境下的真实数据集使用。

1.3  脱敏数据的特征

数据脱敏不仅要执行数据漂白,抹去数据中的敏感内容,同时也需要保持原有的数据特征、业务规则和数据关联性,保证开发、测试、培训以及大数据类业务不会受到脱敏的影响,达成脱敏前后的数据一致性和有效性:

保持原有数据特征

数据脱敏前后必须保证数据特征的保持,例如:身份证号码由十七位数字本体码和一位校验码组成,分别为区域地址码(6 位)、出生日期(8 位)、顺序码(3 位)和校验码(1 位)。那么身份证号码的脱敏规就需要保证脱敏后依旧保持这些特征信息。

保持数据之间的一致性

在不同业务中,数据和数据之间具有一定的关联性。例如:出生年月或年龄和出生日期之间的关系。同样,身份证信息脱敏后仍需要保证出生年月字段和身份证中包含的出生日期之间的一致性。

保持业务规则的关联性

保持数据业务规则的关联性是指数据脱敏时数据关联性以及业务语义等保持不变,其中数据关联性包括:主、外键关联性、关联字段的业务语义关联性等。特别是高度敏感的账户类主体数据往往会贯穿主体的所有关系和行为信息,因此需要特别注意保证所有相关主体信息的一致性。

多次脱敏之间的数据一致性

相同的数据进行多次脱敏,或者在不同的测试系统进行脱敏,需要确保每次脱敏的数据始终保持一致性,只有这样才能保障业务系统数据变更的持续一致性以及广义业务的持续一致性。

1.4  数据脱敏应用场景

一般常见的数据脱敏场景,是将生产数据或是生产数据文件按照脱敏规则,将数据不落地脱敏至测试数据库或是测试数据文件中,具体如下所示:

使用集算器的 SPL 可以按照业务场景要求自行定义和编写脱敏规则,比如针对上面的人员信息:姓名、身份证号、地址、电话号码、卡号等进行不落地脱敏,满足数据脱敏需要。

集算器是一个无框架,可快速部署开发的数据计算中间件工具,能够直接运行编写好的 SPL 数据脱敏脚本即时进行数据脱敏,支持各种常见的数据脱敏的处理方式,包括数据替换、无效化、随机化、偏移和取整、掩码屏蔽、灵活编码等,本文介绍的数据脱敏方法都可以在实际应用中混合替换使用。

本文中应用场景的数据脱敏都是基于下表数据内容进行的,数据存储在“数据脱敏验证表.txt”文件中。

1.4.1 数据替换

数据脱敏要求:用设置的固定虚构值替换真值。例如将手机号码统一替换为 13800013800。

使用集算器 SPL 编码实现的脚本,如下:

  A B C
1 =file("数据脱敏验证表.txt")[email protected]() /导入文本数据  
2 =A1.run(mobile=13800013800) /电话号码数据替换  

A1:导入“数据脱敏验证表”的文本数据。手机号码脱敏前的显示值如下:

A2:将手机号码统一数据替换。直接使用run()函数对 mobile 手机号码字段数据进行赋值替换为13800013800。数据替换后,手机号码脱敏后的显示值如下:

1.4.2 无效化

数据脱敏要求:通过对数据值得截断、加密、隐藏等方式使敏感数据脱敏,使其不再具有利用价值,例如将地址以 ****** 代替真值。数据无效化与数据替换所达成的效果基本类似。

使用集算器 SPL 编码实现的脚本,如下:

  A B C
1 =file("数据脱敏验证表.txt")[email protected]() /导入文本数据  
2 =A1.run(address="******") /地址隐藏式无效化  
3 =A1.run(address=left(address,3)+"******") /地址截断无效化  

A1:导入“数据脱敏验证表”的文本数据。地址脱敏前显示值如下:

A2:将地址进行数据隐藏式的无效化脱敏。直接使用run()函数对 address 地址字段数据进行无效化的 ****** 处理。数据无效化后,地址脱敏后的显示值如下:

A3:将地址进行数据截断式的无效化脱敏。使用left()函数对 address 地址源字符串的左边三位字串加上 ****** 的截断无效化处理。截断无效化的地址脱敏后显示值如下:

1.4.3 随机化

数据脱敏要求:采用随机数据代替真值,保持替换值的随机性以模拟样本的真实性。例如用随机生成的姓和名代替真值。

使用集算器 SPL 编码实现的脚本,如下:

  A B C
1 =file("姓氏.txt")[email protected]() =file("名字.txt")[email protected]() /引入外部姓名字典表,用于随机生成姓名信息
2 =file("数据脱敏验证表.txt")[email protected]() /导入文本数据
3 =A2.run(name=A1(rand(A1.len())+1)+B1(rand(B1.len())+1)) /姓名随机化

A1:导入外部姓名字典表,用于随机化替换姓名真值。此处需特别注意一下,由于“姓氏”和“名字”文本数据都是单列数据表,在使用import()函数时需要增加 @i 选项,@i 表示文本数据只有1列时返回成序列,在单元格 A3 中可以直接位置获取随机值。

A2:导入“数据脱敏验证表”的文本数据。姓名脱敏前显示值如下:

A3:将姓名进行随机化脱敏。直接使用run()函数对 name 姓名进行随机化,使用rand()函数从“姓氏.txt”和“名字.txt”外部字典表随机化组合生成姓名。随机化后姓名的显示值如下:

【注意】这个例子中我们针对数据脱敏引入了外部字典表,实际情况中可以根据数据脱敏要求,随时引入任意外部字典表,通过数据的随机化组合,实现替换真值数据的脱敏处理。

1.4.4 偏移和取整

数据脱敏要求:通过随机移位改变数字数据,例如日期 2018-01-02 8:12:25 变为 2018-01-02 8:00:00,偏移取整在保持了数据的安全性的同时保证了范围的大致真实性,此项功能在大数据利用环境中具有重大价值。

使用集算器 SPL 编码实现的脚本,如下:

  A B C
1 =file("数据脱敏验证表.txt")[email protected]() /导入文本数据
2 =A1.run(operatetime=string(operatetime,"yyyy-MM-dd   HH:00:00")) /日期的偏移和取整

A1:导入“数据脱敏验证表”的文本数据。操作日期脱敏前显示值如下:

A2:将操作日期进行时间的偏移和取整脱敏。使用使用string()函数按照偏移和取整规则格式化成“yyyy-MM-dd HH:00:00”格式,操作时间脱敏后的显示值如下:

【注意】脱敏后的日期时间保持了原有的数据特征,方便脱敏数据的后续使用。

1.4.5 掩码屏蔽

数据脱敏要求:掩码屏蔽是针对账户类数据的部分信息进行脱敏时的有力工具,比如银行卡号或是身份证号的脱敏。

使用集算器 SPL 编码实现的脚本,如下:

  A B C
1 =file("数据脱敏验证表.txt")[email protected]() /导入文本数据
2 =A1.run(idnumber=left(string(idnumber),6)+"********"+right(string(idnumber),4)) /身份证号掩码屏蔽

A1:导入“数据脱敏验证表”的文本数据。身份证号脱敏前显示值如下:

A2:将身份证号的出生日期进行掩码屏蔽脱敏。使用left()函数截取身份证号的左边 6 位 + 字符串 ********+right()函数截取身份证号右边 4 位替换源身份证字符串,身份证号码脱敏后的显示值如下:

1.4.6 灵活编码

数据脱敏要求:在需要特殊脱敏规则时,可执行灵活编码以满足各种可能的脱敏规则。比如用固定字母和固定位数的数字替代合同编号真值。

使用集算器 SPL 编码实现的脚本,如下:

  A B C
1 =file("数据脱敏验证表.txt")[email protected]() /导入文本数据
2 =A1.run(contractno="RAQA"+string(year(now()))+mid(string(contractno),9,4)+string(#,"#000000000")) /合同编号灵活编码

A1:导入“数据脱敏验证表”的文本数据。合同编号脱敏前显示值如下:

A2:将合同编号进行自定义编码脱敏。自定义编码规则:4 位固定码 + 当前年份 + 源目标字符串 4 位号码 +9 位数值组成,使用的函数已有介绍,不再赘述,合同编号脱敏后显示值如下:

1.4.7 脱敏数据的分发

集算器 SPL 支持文件到文件、文件到数据库、数据库到数据库、数据库到文件的脱敏数据分发。下面分别进行具体说明:

1.4.7.1    文本分发到文本

使用集算器 SPL 编码实现的文本分发到文本的脚本如下:

  A B C
1 =file("姓氏.txt")[email protected]() =file("名字.txt")[email protected]() /引入外部姓名字典表,用于随机组合生成姓名信息
2 =file("数据脱敏验证表.txt")[email protected]() /导入大数据量文本数据  
3 =A2.run(contractno="RAQA"+string(year(now()))+mid(string(contractno),9,4)+string(#,"#000000000"),name=A1(rand(A1.len())+1)  +B1(rand(B1.len())+1),address=left(address,3)+"******",mobile=13800013800,idnumber=left(string(idnumber),6)+"********"+right(string(idnumber),4),operatetime=string(operatetime,"yyyy-MM-dd   HH:00:00")) /按照脱敏规则进行数据表脱敏
4 >file("脱敏数据结果表.txt")[email protected](A3) /直接导出到文本文件  

A1-B1:引入外部字典表“姓氏”和“名字”的文本数据,用于随机组合生成姓名信息。

A2:使用游标导入大数据量的“数据脱敏验证表”文本数据。

A3:按照脱敏规则进行数据表脱敏。

A4:直接将脱敏的数据导出到文本文件。使用export()函数导出脱敏数据,其中,其中 @t 指定将第一行记录作为字段名, 如果不使用 @t 选项就会以 _1,_2,…作为字段名,@a表示追加写, 不使用 @a 表示覆盖,分发到文本的脱敏结果如下:

【注意】集算器 SPL 的文件处理能力还支持导入、导出 xls、xlsx、csv 等多种类型文件。

1.4.7.2    文本分发到数据库

使用集算器 SPL 编码实现的文本分发到数据库(以 MySQL 为例)的脚本如下:

  A B C
1 =file("姓氏.txt")[email protected]() =file("名字.txt")[email protected]() /引入外部姓名字典表,用于随机组合生成姓名信息
2 =file("数据脱敏验证表.txt")[email protected]() /导入大数据量文本数据
3 =A2.run(contractno="RAQA"+string(year(now()))+mid(string(contractno),9,4)+string(#,"#000000000"),name=A1(rand(A1.len())+1)  +B1(rand(B1.len())+1),address=left(address,3)+"******",mobile=13800013800,idnumber=left(string(idnumber),6)+"********"+right(string(idnumber),4),operatetime=string(operatetime,"yyyy-MM-dd   HH:00:00")) /按照脱敏规则进行数据表脱敏
4 =connect("MySQL") /连接 MySQL 数据源
5 >A4.update(A3,personinfo,code,contractno,name,address,mobile,idnumber,operatetime;code) /执行 update 更新,直接导出到数据库中
6 >A4.close() /关闭数据库连接

A1-A3:同上。

A4:连接 MySQL 数据源。使用connect()进行 MySQL 数据库的连接。如果用鼠标点击 A4 单元格,可以直接查看 MySQL 数据库的连接信息。具体查看数据库配置教程相关章节文档配置说明。

A5:更新 MySQL 数据库中“personinfo”库表的数据。使用update()将单元格 A3 的游标数据更新到 MySQL 数据库“personinfo”库表中。使用数据库工具查看结果如下

A6:使用close()函数关闭 A4 建立起的 MySQL 数据源连接。

1.4.7.3    数据库分到数据库

使用集算器 SPL 编码实现的数据库分发到数据库的脚本如下(均以 MySQL 为例):

  A B C
1 同上 /引入外部姓名字典表,用于随机组合生成姓名信息
2 =connect("MySQL") /连接 MySQL 数据源
3 =A2.cursor("select *   from personinfo_copy") /游标读取 MySQL 中 personinfo_copy 表待脱敏数据
4 同上 A3 单元格 /按照脱敏规则进行数据表脱敏
5 >A2.update(A4,personinfo_copy_test,code,contractno,name,address,mobile,idnumber,operatetime;code)   /执行 update 更新,直接将脱敏数据导出到数据库的 personinfo_copy_test 表中
6 >A2.close() /关闭数据库连接

A1:同上。

A2:连接 MySQL 数据源。

A3:游标读取 MySQL 中表“personinfo_copy”的待脱敏数据。该表的数据如下:

A4:同上。

A5:更新 MySQL 数据库中“personinfo_copy_test”库表的数据。使用update()将单元格 A3 的游标数据更新到 MySQL 数据库的“personinfo_copy_test”库表中。结果如下:

A6:使用close()函数关闭 A2 建立起的 MySQL 数据源连接。

1.4.7.4    数据库分到文本

使用集算器 SPL 编码实现的数据库(以 MySQL 为例)分发到文本的脚本如下:

  A B C
1 同上 /引入外部姓名字典表,用于随机组合生成姓名信息
2 同上 /连接 MySQL 数据源
3 同上 /游标读取 MySQL 中 personinfo_copy 表待脱敏数据
4 同上 A4 单元格 /按照脱敏规则进行数据表脱敏
5 >file("脱敏数据结果表.txt")[email protected](A4) /直接导出到文本文件
6 >A2.close() /关闭数据库连接

A1-A4:同上。

A5:直接将脱敏的数据库(MySQL)数据分发到文本文件。分发到文本的脱敏结果同上。

A6:使用close()函数关闭 A2 建立起的 MySQL 数据源连接。

1.5  脱敏数据报表查询实例


具体看原文链接:http://c.raqsoft.com.cn/article/1542086931552?r=alice

相关文章