一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、住址、手机号、卡号、客户号等个人信息都需要进行数据脱敏。
测试过程中也有需要实际生产环境数据的需求,比如人员信息,其中手机号、身份证号就涉及隐私数据,导出数据时需要对其进行脱敏。
对业务数据做脱敏的要求如下:
(1)可对字段信息进行部分脱敏
(2)保持字段各条记录的数据关系不变
(3)保持加密后的数据长度与原来一致
(4)保持加密后的数据类型与原来一致
基于以上需求,选择简单方便的expdp导出命令remap_data参数结合Oracle的translate函数实现导出数据脱敏功能。
1、translate函数介绍
语法:TRANSLATE(char, from, to)
用法:返回将出现在from中的每个字符替换为to中的相应字符以后的字符串。
若from比to字符串长,那么在from中比to中多出的字符将会被删除。
三个参数中有一个是空,返回值也将是空值。
举例:SQL> select translate('abcdefga','abc','wo') 返回值 from dual;
返回值
-------
wodefgw
2、expdp、impdp命令
3、具体实现方法
目标:
实现police表手机号、身份证号脱敏导出
实现:
包头就相当于java的类里面定义了多个方法,包体就是实现方法里具体的逻辑。
(1)创建包头 --定义手机号和身份证号两个转换方法
create or replace package sensdata is
function switch_phone(xphone varchar2) return varchar2;
function switch_sfzm(idcard varchar2) return varchar2;
end sensdata;
(2)创建包体 --分别实现手机号、身份证号转换具体实现逻辑
create or replace package body sensdata is
function switch_phone(xphone varchar2) return varchar2 as
begin
return(substr(xphone, 1, 3) ||
translate(substr(xphone, 4, 11), '0123456789', '5612783940'));
end switch_phone;
function switch_sfzm(idcard varchar2) return varchar2 as
time_rand varchar2(8);
begin
SELECT to_char(TO_DATE(TRUNC(DBMS_RANDOM.VALUE(TO_NUMBER(TO_CHAR(to_date('19540101', 'yyyymmdd'),
'J')), TO_NUMBER(TO_CHAR(to_date('20000501', 'yyyymmdd'),
'J')))),
'J') + DBMS_RANDOM.VALUE(1, 24) / 1,
'yyyymmdd')
into time_rand
FROM DUAL;
return(substr(idcard, 1, 6) || time_rand || substr(idcard, 15, 4));
end switch_sfzm;
end sensdata;
脱敏规则定义:
手机号:前三位不变,后8位对应数据转换,使用的translate转换函数
身份证号:前6位不变,出生年月日使用时间随机函数,后4位不变
(3)登录数据库所在服务器,使用expdp命令导出表数据
expdp 用户名/密码@实例 directory=data_dir dumpfile=police.dmp logfile=police.log tables=用户名.police(表名) remap_data=用户名.police(表名).phone(字段名):sensdata.switch_phone,用户名.police(表名).idcard(字段名):sensdata.switch_sfzm
(4)将导出的文件复制到要导入的数据库服务器
(5)登录数据库所在服务器,使用impdp命令导入数据库
impdp 用户名/密码@实例 directory=data_dir dumpfile=police.dmp logfile=police1.log remap_schema=hiatmpcs6:hiatmpcs6 TABLE_EXISTS_ACTION=REPLACE
4、说明
(1)expdp 、impdp 具体导出导出命令请参考资料并根据实际情况使用适合的命令
(2)包头、包体定义请结合具体业务的脱敏规则扩展实现
(3)oracle的Data Masking组件提供数据屏蔽功能,保障数据安全,给测试人员或者开发人员提供了一份“最真实的假数据”。后续有需求可继续研究。