Oracle简单的数据脱敏实现

1,282 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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组件提供数据屏蔽功能,保障数据安全,给测试人员或者开发人员提供了一份“最真实的假数据”。后续有需求可继续研究。