Oracle 11g数据脱敏

前言

最近开发人员有个需求,导一份生产库的数据到测试库。

由于生产数据安全需要,需要并允许对导出的数据进行加密脱敏处理。

关于加密和脱敏

个人理解,

加密是通过一系列规则对数据进行处理,可以通过规则解密出原有的数据甚至被破解。

而脱敏则是按照一定规律对数据进行处理,属于不可逆行为,会丢失原有数据内容。

加密的数据一定是已经脱敏,但是脱敏的数据不等同于加密。

此篇文章讨论脱敏。

环境构造

SYS@zkm> drop table scott.test purge;

Table dropped.

SYS@zkm> create table scott.test as select level id from dual connect by level<=15;

Table created.

SYS@zkm> desc scott.test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER SYS@zkm> drop table zkm.test purge; Table dropped. SYS@zkm> create table zkm.test as select * from scott.test where 1=2; Table created. SYS@zkm> desc zkm.test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER SYS@zkm>

基本需求是scott.test表的数据脱敏导出后导入zkm.test表。

方法1

使用md5算法创建函数。

create or replace function fn_md5(input_string VARCHAR2) return varchar2
IS
raw_input RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
decrypted_raw RAW(2048);
error_in_input_buffer_length EXCEPTION;
BEGIN
sys.dbms_obfuscation_toolkit.MD5(input => raw_input,checksum => decrypted_raw);
return rawtohex(decrypted_raw);
END;
/
SYS@zkm> select id,fn_md5(id) string from scott.test;

        ID STRING
---------- --------------------------------------------------
1 C4CA4238A0B923820DCC509A6F75849B
2 C81E728D9D4C2F636F067F89CC14862C
3 ECCBC87E4B5CE2FE28308FD9F2A7BAF3
4 A87FF679A2F3E71D9181A67B7542122C
5 E4DA3B7FBBCE2345D7772B0674A318D5
6 1679091C5A880FAF6FB5E6087EB1B2DC
7 8F14E45FCEEA167A5A36DEDD4BEA2543
8 C9F0F895FB98AB9159F51FD0297E236D
9 45C48CCE2E2D7FBDEA1AFC51C7C6AD26
10 D3D9446802A44259755D38E6D163E820
11 6512BD43D9CAA6E02C990B0A82652DCA ID STRING
---------- --------------------------------------------------
12 C20AD4D76FE97759AA27A0C99BFF6710
13 C51CE410C124A10E0DB5E4B97FC2AF39
14 AAB3238922BCC25A6F606EB525FFDC56
15 9BF31C7FF062936A96D3C8BD1F8F2FF3 15 rows selected.

缺点很明显,长度变长了,并且类型不再是number类型。

后续创建新表(也是一个缺点)存储转换后的数据,再通过数据泵导出即可。

(但是zkm.test表的id字段不能是number类型,不然是导不进去的)因此此方法对于存在字段是非字符串类型的几乎不可行。

方法2

使用内部函数translate。

SYS@zkm> select id,translate(id,'','abcdefghijk') string from scott.test;

        ID STRING
---------- --------------------------------------------------
1 b
2 c
3 d
4 e
5 f
6 g
7 h
8 i
9 j
10 ba
11 bb ID STRING
---------- --------------------------------------------------
12 bc
13 bd
14 be
15 bf 15 rows selected.

后续创建新表(缺点)存储转换后的数据,再通过数据泵导出即可。

如果数字类型转换为字符类型,则存在和方法1一样的问题。因此数字还是转换为数字类型即可,比如。

SYS@zkm> select id,translate(id,'','') string,to_number(translate(id,'','')) string2 from scott.test;

        ID STRING             STRING2
---------- --------------- ----------
1 5 5
2 6 6
3 4 4
4 7 7
5 1 1
6 9 9
7 8 8
8 7 7
9 4 4
10 51 51
11 55 55 ID STRING STRING2
---------- --------------- ----------
12 56 56
13 54 54
14 57 57
15 51 51 15 rows selected.

注意,translate之后返回的类型还是字符串型的,需要to_number转换一下。

方法3

使用expdp的REMAP_DATA参数。

具体用法说明见官方文档:REMAP_DATA

该方法相对于方法1和方法2稍微复杂点,但是由于数据量比较大,因此用该方法最为方便。

构造一个含有中文行的字段。

SYS@zkm> create table scott.test2 (name varchar2(20));

Table created.

SYS@zkm> insert into scott.test2 values('数据库');

1 row created.

SYS@zkm> insert into scott.test2 values('绑定变量');

1 row created.

SYS@zkm> insert into scott.test2 values('执行计划');

1 row created.

SYS@zkm> commit;

Commit complete.

SYS@zkm> select * from scott.test2;

NAME
------------------------------------------------------------
数据库
绑定变量
执行计划 SYS@zkm> create table zkm.test2 as select * from scott.test2 where 1=2; Table created.

使用方法1,方法2的验证结果。

SYS@zkm> select name,fn_md5(name) string from scott.test2;

NAME       STRING
---------- -----------------------------------------------------------------
数据库 8B2F1D29A87AB8968601C2AB7D9084B9
绑定变量 FCE81E294017C008C111B61164728CFA
执行计划 A394306DB20856B8BF68FA197DC5DAD4 SYS@zkm> col name for a15
SYS@zkm> set line 500
SYS@zkm> col string for a50
SYS@zkm> select name,translate(name,'数据库定变量执行计划绑','之后返回的类型还是字符') string from scott.test2; NAME STRING
--------------- --------------------------------------------------
数据库 之后返
绑定变量 符回的类
执行计划 型还是字 SYS@zkm> select name,translate(name,'数据库定变量执行计划绑','哈哈哈哈哈哈哈哈哈哈嗝') string from scott.test2; NAME STRING
--------------- --------------------------------------------------
数据库 哈哈哈
绑定变量 嗝哈哈哈
执行计划 哈哈哈哈 SYS@zkm>

由于remap_data的使用需要创建包和包体来调用,主要考虑两种情况,

  1. 字符串类型脱敏(无论是否中文)
  2. 数字类型

在考虑一下两种情况,

  1. 类型不变
  2. 字符串的长度不变

创建包和包体内容如下:

create or replace package scott.pkg_remap
is
function fn_numeral(input_string number) return number;
function f_remap_varchar(p_varchar varchar2) return varchar2;
end;
/ create or replace package body scott.pkg_remap
is
function fn_numeral(input_string number) return number as
begin
return floor(dbms_random.value(1, 100000));
end;
function f_remap_varchar(p_varchar varchar2) return varchar2 as
begin
return translate(p_varchar,'数据库定变量执行计划绑','之后返回的类型还是字符');
end;
end;
/

模板复制

SYS@zkm> create or replace package scott.pkg_remap
2 is
3 function fn_numeral(input_string number) return number;
4 function f_remap_varchar(p_varchar varchar2) return varchar2;
5 end;
6 / Package created. SYS@zkm>
SYS@zkm>
SYS@zkm> create or replace package body scott.pkg_remap
2 is
3 function fn_numeral(input_string number) return number as
4 begin
5 return floor(dbms_random.value(1, 100000));
6 end;
7 function f_remap_varchar(p_varchar varchar2) return varchar2 as
8 begin
9 return translate(p_varchar,'数据库定变量执行计划绑','之后返回的类型还是字符');
10 end;
11 end;
12 / Package body created.

导出并导入。

其中,由于表scott.test的id字段是number类型,因此调用的是pkg_remap.fn_numeral

[oracle@oracle ~]$ expdp \'/ as sysdba\' directory=dirtmp dumpfile=test.dmp logfile=test.log cluster=n tables=scott.test remap_data=scott.test.id:scott.pkg_remap.fn_numeral reuse_dumpfiles=y

Export: Release 11.2.0.4. - Production on Mon May  :: 

Copyright (c) , , Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYS"."SYS_EXPORT_TABLE_01": "/******** AS SYSDBA" directory=dirtmp dumpfile=test.dmp logfile=test.log cluster=n tables=scott.test remap_data=scott.test.id:scott.pkg_remap.fn_numeral reuse_dumpfiles=y
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: KB
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "SCOTT"."TEST" 5.125 KB rows
Master table "SYS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_TABLE_01 is:
/home/oracle/test.dmp
Job "SYS"."SYS_EXPORT_TABLE_01" successfully completed at Mon May :: elapsed :: [oracle@oracle ~]$ impdp \'/ as sysdba\' directory=dirtmp dumpfile=test.dmp logfile=imptest.log cluster=n remap_schema=scott:zkm TABLE_EXISTS_ACTION=truncate Import: Release 11.2.0.4. - Production on Mon May :: Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_FULL_01": "/******** AS SYSDBA" directory=dirtmp dumpfile=test.dmp logfile=imptest.log cluster=n remap_schema=scott:zkm TABLE_EXISTS_ACTION=truncate
Processing object type TABLE_EXPORT/TABLE/TABLE
Table "ZKM"."TEST" exists and has been truncated. Data will be loaded but all dependent metadata will be skipped due to table_exists_action of truncate
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "ZKM"."TEST" 5.125 KB rows
Job "SYS"."SYS_IMPORT_FULL_01" successfully completed at Mon May :: elapsed ::

查询zkm.test结果如下:

SYS@zkm> select * from zkm.test;

        ID
----------
87848
3399
49478
86510
85267
82478
19478
80623
2317
93170
89452 ID
----------
571
90558
86931
68415 15 rows selected.

可以看到,数据已经脱敏成功。

导出并导入。

其中,由于表scott.test2的name字段是varchar2类型,因此调用的是pkg_remap.f_remap_varchar

[oracle@oracle ~]$ expdp \'/ as sysdba\' directory=dirtmp dumpfile=test.dmp logfile=test.log cluster=n tables=scott.test2 remap_data=scott.test2.name:scott.pkg_remap.f_remap_varchar reuse_dumpfiles=y

Export: Release 11.2.0.4. - Production on Mon May  :: 

Copyright (c) , , Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYS"."SYS_EXPORT_TABLE_01": "/******** AS SYSDBA" directory=dirtmp dumpfile=test.dmp logfile=test.log cluster=n tables=scott.test2 remap_data=scott.test2.name:scott.pkg_remap.f_remap_varchar reuse_dumpfiles=y
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: KB
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "SCOTT"."TEST2" 5.039 KB rows
Master table "SYS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_TABLE_01 is:
/home/oracle/test.dmp
Job "SYS"."SYS_EXPORT_TABLE_01" successfully completed at Mon May :: elapsed :: [oracle@oracle ~]$ impdp \'/ as sysdba\' directory=dirtmp dumpfile=test.dmp logfile=imptest.log cluster=n remap_schema=scott:zkm TABLE_EXISTS_ACTION=truncate Import: Release 11.2.0.4. - Production on Mon May :: Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_FULL_01": "/******** AS SYSDBA" directory=dirtmp dumpfile=test.dmp logfile=imptest.log cluster=n remap_schema=scott:zkm TABLE_EXISTS_ACTION=truncate
Processing object type TABLE_EXPORT/TABLE/TABLE
Table "ZKM"."TEST2" exists and has been truncated. Data will be loaded but all dependent metadata will be skipped due to table_exists_action of truncate
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "ZKM"."TEST2" 5.039 KB rows
Job "SYS"."SYS_IMPORT_FULL_01" successfully completed at Mon May :: elapsed ::

查询zkm.test2结果如下:

SYS@zkm> select * from zkm.test2;

NAME
------------------------------------------------------------
之后返
符回的类
型还是字

可以看到,数据已经脱敏成功。

方法4

oracle12c中em集成了一个功能 data masking(数据脱敏)。

由于没有12c生产环境,因此此方法不做讨论。

参考链接

https://blog.csdn.net/enmotech/article/details/81713790

DES加解密

http://blog.itpub.net/28539951/viewspace-2063896/

https://www.anbob.com/archives/1016.html

Oracle之DBMS_RANDOM包详解

Oracle 11g数据脱敏的更多相关文章

  1. 记一次oracle 11g数据导入

    1.ORACLE数据库数据导入到测试库环境 172.15.1.51 root  kic@test 172.15.1.52 root 一般先将数据导入52的环境(配置比较低),再将数据导入51的环境(本 ...

  2. Oracle ebs 数据脱敏

    https://blog.csdn.net/pan_tian/article/details/16120351Data Masking可对数据进行不可逆的去身份化后,再用于非生产环境,同时自动保留引用 ...

  3. visual studio 2013连接Oracle 11g并获取数据:(一:环境搭建)

    C# WinForm案例: 目标: visual studio 中点击按钮,就可获取到Oracle中数据表的内容 1.安装Visual Studio 2013 ,推荐如下网址,下载ISO镜像,一路ne ...

  4. Oracle汉字用户名数据脱敏长度不变,rpad函数使用

    信息安全考虑,有时需要对用户名称进行数据脱敏. 针对Oracle数据库,进行取数数据脱敏处理 脱敏规则: 长度小于9个字符,只保留前3个汉字与后3个汉字,中间全部由*填充. 长度9个字及以上及奇数,隐 ...

  5. Oracle 11g R2(11.2.0.4) RAC 数据文件路径错误解决--ORA-01157 ORA-01110: 数据文件

    Oracle 11g R2(11.2.0.1) RAC  数据文件路径错误解决--ORA-01157 ORA-01110: 数据文件 oracle 11g R2(11.2.0.4) rac--scan ...

  6. ORACLE 11g 导出数据

    ORACLE 11g 导出 表的时候 不会导出空表 导出空表操作步骤 :(使用PLSQL) 1.打开SQL window 执行下面的 SQL Select 'alter table '||table_ ...

  7. Oracle 11g Rac 用rman实现把本地数据文件迁移到ASM共享存储中

    在Oracle Rac环境中,数据文件都是要存放在ASM共享存储上的,这样两个节点才能同时访问.而当你在某一节点下把数据文件创建在本地磁盘的时候,那么在另一节点上要访问该数据文件的时候就会报错,因为找 ...

  8. Oracle 11g新特性direct path read引发的系统停运故障诊断处理

    黎俊杰 | 2016-07-28 14:37 声明:部分表名为了脱敏而用XX代替 1.故障现象 (1)一个业务系统输入用户名与密码后无法进入首页,表现为一直在运行等待,运行缓慢 (2)整个系统无法正常 ...

  9. Linux平台oracle 11g单实例 安装部署配置 快速参考

    1.重建主机的Oracle用户 组 统一规范 uid gid 以保证共享存储挂接或其他需求的权限规范 userdel -r oracle groupadd -g 7 oinstall groupadd ...

随机推荐

  1. 三分钟搭建websocket实时在线聊天,项目经理也不敢这么写

    我们先看一下下面这张图: 可以看到这是一个简易的聊天室,两个窗口的消息是实时发送与接收的,这个主要就是用我们今天要讲的websocket实现的. websocket是什么? websocket是一种网 ...

  2. 读懂操作系统之缓存原理(cache)(三)

    前言 本节内容计划是讲解TLB与高速缓存的关系,但是在涉及高速缓的前提是我们必须要了解操作系统缓存原理,所以提前先详细了解下缓存原理,我们依然是采取循序渐进的方式来解答缓存原理,若有叙述不当之处,还请 ...

  3. 网络编程-Netty-Reactor模型

    目录 # 摘要 高性能服务器 Reactor模式 Reactor单线程模型设计 Reactor多线程模型设计 主从Reactor多线程模型设计 Netty Reactor模型设计 参考 你的鼓励也是我 ...

  4. DBusConnection for c

    dbus的C API D-Bus 1.13.10 目录 dbus的C API Detailed Description Typedef Documentation ◆ DBusAddTimeoutFu ...

  5. Jquery封装: 地区选择联动插件

    请点击下载百度云链接: 链接: https://pan.baidu.com/s/1plVmdJT2O4fLJokyJDQA2g 密码: aqt2

  6. Java学习之多线程详解

    一.多线程的实现 1.继承Thread类 ​ a.子类继承Thread类具备多线程能力 ​ b.启动线程:子类对象.start() ​ c.不建议使用:避免OOP单继承局限性 package com. ...

  7. Ubuntu18.04美化MacOS(新更grub界面美化)

    写在前面的话: 在美化过程中大多数资源来自境外网站,下载时速度特别慢,写这篇博客一是为了给读者看,也是为了自己保存资源并记录ubuntu18.04的使用,避免你们或是自己以后再花费大量时间去百度方法和 ...

  8. 在CentOS8下利用seafile软件搭建私有云

    一.安装前准备工作 1. 安装EPEL源 EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用 ...

  9. 数据湖&数据仓库,别再傻傻分不清了

    摘要:什么是数据湖?它有什么作用?今天将由华为云技术专家从理论出发,将问题抽丝剥茧,从技术维度娓娓道来. 什么是数据湖 如果需要给数据湖下一个定义,可以定义为这样:数据湖是一个存储企业的各种各样原始数 ...

  10. STL sort的comp函数注意事项

    今天写了个题,结果碰巧re了,我眉头一皱发现事情并不简单. 原来我之前的comp写的都是错的. bool cmp(milkman a,milkman b) { return a.price<=b ...