天天看点

oracle信息加密技术,利用ORACLE加密特性保护HIS系统的敏感数据

1概述

对于ORACLE数据库的联机数据,ORACLE主要采用用户验证、访问控制和审计等技术,提供了多个层次的数据安全保护措施,而且随着数据库版本的更新,这些技术在不断的完善,总体上而言,ORACLE数据库是安全性方面最完备的数据库产品。然而,对于数据库数据文件中的数据和各种数据备份的安全性一直是一个薄弱的环节,窃密者完全可以绕过数据库的安全防护层,不用访问产品数据库,而直接获取数据库文件、数据库逻辑备份或物理备份,利用ORACLE的技术支持工具如dul/aul可以恢复脱机文件中的数据,或利用ORACLE的恢复技术,使用备份可在另外的计算机上恢复整个数据库。例如,下面列出了一些容易被窃取的文件。1.1 数据库的热备份或冷备份。数据库备份是产品库的拷贝,一方面使用这些备份和日志文件可以很容易的恢复数据库;另一方面使用ORACLE的技术支持工具如dul/aul可以恢复脱机文件中的数据。

1.2 ORACLE 导出工具的导出文件。应用该文件能够容易的在数据库之间迁移数据,窃密者可以在自己的数据库中导入这些文件中包含的数据,而且,全库导出包含所有的账户和密码,利用这些帐户和密码可以随意的访问产品库。

1.3 ORACLE联机和归档日志。可以用LOGMINER看到redo logs中存储的数据库的变化,因此也应当保护好日志文件。

2ORACLE数据库表列数据加密方法

2.1 ORACLE数据库加密方法概述

对于军卫一号医院信息系统,其中包含许多敏感信息,如医改系统包含参保人员的基本信息,这些信息都是机密信息;另外还有病人的疾病信息、费用信息、治疗信息、用药信息等也需要保密。面对以上的安全威胁,如何保护好这些机密信息,我对该问题做了一些探讨和测试。为了安全起见,本文不涉及军卫系统中的具体表和信息,所有测试所用的表和数据,都是自己构建的。

ORACLE的解决办法是对表中的敏感数据列进行加密。即使窃密者获得数据库的备份和数据文件,因没有解密密钥,也不可能获得敏感数据列中的数据。在ORACLE9i以及更低版本的数据库中唯一可用的加密方法是程序包DBMS_OBFUSCATION_TOOLKIT (DOTK),DOTK有许多缺点,比如有限的加密算法、实现比较困难。在 10G中,提供了一种更加完善的加密包DBMS_CRYPTO,DBMS_CRYPTO具有容易使用和功能强大的特点,将会取代DOTK,DBMS_CRYPTO可以满足高敏感性数据的加密要求,但是它存在一个致命的问题,就是密钥的管理。其密钥的产生、存储、使用、销毁等都需要应用程序来实现,这样密钥的安全管理存在很大的风险。关于这两个包的使用可以参考ORACLE文档。

随着ORACLE10GR2的推出,提供了一种更加容易使用的加密方法称为透明数据加密技术TDE(Transparent Data Encryption),其最大的特点是密钥的管理完全由数据库管理,不需要人为的干预,而且对列数据加、解密,不必将加密例程嵌套到现有应用程序中,显著降低了加密的成本和复杂性,只需使用几个简单的命令即可对机密应用程序数据进行加密。以下重点介绍TDE的使用。

2.2TDE的工作机制

TDE是一种基于密钥的访问控制方式。列数据以某种密钥加密,在访问时,如果没有解密密钥,则无法获得需要的数据。访问时的解密是自动进行的,对于应用程序完全透明。当一个表中的一个或者多个列被加密时,需要为这个表分配一个密钥(一个表只需要一个密钥)。系统中所有的密钥再经过服务器中的一个主密钥加密后存储在数据字典enc$中,也就是说,密钥本身也是加密存储的。而服务器主密钥则存储在数据库外部,使用外部安全机制来保证主密钥的安全,这个外部安全机制就是ORACLE提供的WALLET机制。TDE支持四种加密算法AES192、AES128、AES256和3DES168,其中aes192是默认的加密算法。TDE还提供一个重要的特性就是SALT与no SALT加密,所谓SALT加密是指,加密列前要在加密的数据中添加一个随机串,这样,即使相同的数据值,加密后的结果也不同,增加了数据的安全性。No SALT加密是指不添加随机串到数据中,相同的数据会产生相同的加密结果。默认情况下,ORACLE使用SALT加密方式。不过,TDE的使用还有一些局限,不支持以下特性:B*Tree索引之外的其他索引类型;索引范围扫描;Sys用户的对象不可加密;直接路径的sql*loader;大对象如BLOB和CLOB;imp/exp工具(但是支持impdp/expdp)。在不能使用TDE的时候,可以使用DBMS_CRYPTO包替代。

2.3 TDE的使用

1.要使用TDE,必须具有alter system权限和ORACLE WALLET的一个有效密码。

2.使用命令行工具MKWALLET或ORACLE WALLET管理器(owm)在WALLET中为数据库创建并存储一个公钥。

3.创建WALLET后,打开WALLET,接着创建一个主密钥,用来加密列的加密密钥。

4.选择加密的列数据时,一个称为External Security Module(ESM)的外部程序使用主密钥对列加密密钥进行加密或解密操作,ORACLE在数据字典中存储加密列的信息。

2.4 TDE的测试

1.修改 sqlnet.ora、创建加密钱夹(wallet)存放目录。

ENCRYPTION_WALLET_LOCATION=

(SOURCE=(METHOD=FILE)(METHOD_DATA=

(DIRECTORY=d:ORACLEproduct10.2.0db_1)))

2.打开钱夹并创建主密钥。输入以下命令:

alter system set encryption key identified by "liang700824";

执行上面的 alter 命令后,如果指定的目录中不存在加密钱夹,则创建加密钱夹;如果指定的目录中存在加密钱夹,打开此钱夹并重新创建 TDE 的主密钥。

3.创建表空间

CREATE TABLESPACE test

DATAFILE ' F:oradataORCLtest.dbf' SIZE 128k

AUTOEXTEND ON NEXT 64K;

4.创建用户

CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE test;

5.首先证明在os下,可以看到普通列数据。

CONNtest/test

CREATE TABLE test (

idNUMBER(10),

dataVARCHAR2(50)

)

TABLESPACE test;

INSERT INTO test (id, data) VALUES (1, 'This is a secret!');

ALTER SYSTEM FLUSH BUFFER_CACHE;

刷新buffer cache确保数据的修改写入数据文件,在操作系统下,用ultraedit hex编辑器直接打开存放该表的数据文件test.dbf,可以看到明文'This is a secret!'。

2.5列加密后的数据分析

2.5.1加密列数据

1.打开WALLET:

ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY “liang700824”;

2.创建test表,使用ENCRYPT选项加密列data,默认的加密方法是AES192,并插入两条同样的数据:

CONNtest/test

CREATE TABLE test (

idNUMBER(10),

dataVARCHAR2(50) ENCRYPT

);

INSERT INTO test (id, data) VALUES (1, 'This is a secret!');

INSERT INTO test (id, data) VALUES (1, 'This is a secret!');

ALTER SYSTEM FLUSH BUFFER_CACHE;

2.5.2在操作系统下,用ultraedit hex编辑器直接打开存放该表的数据文件test.dbf,只能看到一些乱码,说明数据已经加密了。但是在sqlplus下,用户test查询该表时,数据以明文的形式显示出来,查询的解密操作过程对于用户来说完全透明的。

SELECT * FROM test;

ID DATA

---------- --------------------------------------------------

1 This is a secret!

2.5.3LOGMNR分析

对数据表的DML操作,要在日志文件中记录表的DML操作,TDE是在写入数据之前执行的并且对所有应用程序都是透明的,ORACLE LogMiner可以查看日志文件中包含的内容。以下是对加密列数据DML操作的LOGMNR分析,可以看出LogMiner不支持加密数据,因此data列中的加密值显示为Unsupported Type。

EXECUTE DBMS_LOGMNR.ADD_LOGFILE('D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG', DBMS_LOGMNR.NEW);

EXECUTE DBMS_LOGMNR.START_LOGMNR(options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR

.COMMITTED_DATA_ONLY);

select sql_redo from v$LOGMNR_contents where table_name = 'TEST' and operation='INSERT';

SQL_REDO

------------------------------------------------------------------------------------------insert into "TEST"."TEST"("ID","DATA") values ('1',Unsupported Type);

insert into "TEST"."TEST"("ID","DATA") values ('1',Unsupported Type);

2.5.4表在数据文件中的存储,可以通过数据文件dump的方法察看到,通过dump可以看到加密列的数据显示为加密。

1.确定数据行所在的数据块,执行下列查询可以看到test表中的数据存在于文件号为6的文件的第13块中。

select dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid) from test;

FNO DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)

---------- ------------------------------------

613

613

导出数据文件6的块13

alter session set events '10046 trace name context forever,level 12';

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9599/viewspace-473007/,如需转载,请注明出处,否则将追究法律责任。