摘要
Transparent Data Encryption透明机密技术是Oracle在10g版本之后推出的数据层加密技术。核心概念是借助外置于数据库的加密文件,对数据表列乃至表空间等多层次进行加密。这种技术对存储在数据库中的敏感信息,提供了简单可靠的安全防护解决方案。
透明加密技术概要
简单的说,Transparent Data Encryption(以下简称为TDE)是一种基于加密键key的访问控制系统。加密过的数据直接放置在数据库中,如果没有解密授权,从数据库中搜索出的数据都是不可读的非明文。只有指定的用户ID进行读取时,才进行自动的解密操作。
TDE的加密组件机制中包括主加密key(Master Encryption Key)和数据列加密key(Column Encryption Keys)。主加密key是保存在数据库外,通常是建立在一个安全目录的文件,受到系统级别安全管理。而数据列加密key是建立在数据库的数据字典中。在数据库外保存的主加密key也称为Oracle Wallet。
在工作的时候,Oracle是不需要利用如触发器等组件的协助实现TDE功能。只需要指定进行加密处理的对象(数据列、表空间等),Oracle自己进行数据的加密和解密操作。进行加密和解密的时候,Oracle首先使用主加密key对数据字典里的数据列key进行加解密,之后解密过的数据列key就可以数据列进行加解密操作。相当于将加解密的key分割在数据库内部和数据库外部两部分。
使用TDE有一些独特的优点:
1、 加密密钥分割保存,使得在存储媒体或者数据文件丢失的时候,保证敏感数据的安全;
2、 实现数据库层次的加密,使得应用系统符合如PCI DSS标准在内的安全性规范要求;
3、 对数据使用用户而言,加密解密的操作完全是透明的;
4、 过去一些不支持数据加解密的应用,可以直接进行无缝的移植。实现数据加密的要求;
同时,使用TDE的时候,还要注意一些限制,比如在外键约束列上不能使用。还有一些特殊的索引类型和数据类型,在使用TDE的时候受到限制。
安装配置TDE
1、 确定你的版本信息
TDE是Oracle10gR2中推出的一个新功能,所以在规划使用TDE的时候,要保证你的Oracle版本是在10gR2或者以上。
下面是笔者测试
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
2、创建一个新目录,并指定为Wallet目录
使用TDE的一个重要过程就是对于主加密key的创建管理,数据库文件外的key是存放在称作wallet的目录中。对key的使用,oracle支持多个数据库组件使用相同的wallet,但是Oracle推荐使用单独的wallet来存放主加密key。
设置wallet目录的方法很简单,在参数文件sqlnet.ora中,按照下面的格式加入信息:
ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=D:\oracle\product\10.2.0\admin\orcl\ORA_WALLET)))
ENCRYPTION_WALLET_LOCATION参数的作用就是告知Wallet的实现方式和物理位置。在上面的实例代码中,我们制定了一个目录路径,作为主加密Key的存放位置。
3、创建master key文件,指定wallet密码
使用SYS用户登入系统,建立加密文件。通过命令:
ALTER SYSTEM SET [ENCRYPTION] KEY IDENTIFIED BY password
其中,password相当于设置一个wallet密码。Oracle Wallet是一个可以打开关闭的功能组件,设置密码之后,只有通过密码口令可以启用wallet功能。
SQL> alter system set encryption key identified by "password";
System altered
注意,在这里,我们还可以选取一些更强壮的加密方法,来定义master key。如下:
ALTER SYSTEM SET ENCRYPTION KEY "j23lm781098dhb345sm" IDENTIFIED BY "p3812dH9E";
上述代码定义了PKI加密方法。
此时,我们可以发现在设置的目录下,多出一个Personal Information Exchange类型的文件,笔者机器上名称为:ewallet.p12。相当于我们生成的master key文件。
4、启动、关闭Wallet
Wallet是一种功能,在实际中可以通过命令启动或者关闭Wallet功能。
//尝试开启wallet功能,“”中包括的是指定的开启密码;
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password";
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password"
//因为当前是打开的状态,所以提示错误
ORA-28354: wallet 已经打开
//关闭Wallet
SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
System altered
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password";
System altered
到此,我们成功配置了Wallet,创建了master key。下面我们看如何使用TDE进行数据加密。
加密数据列
对数据列加密是TDE一个常用的功能。我们常常需要对数据库中某个表的某个敏感数据进行加密处理,方式信息的外泄。
首先,在定义数据表中的数据列(或者修改数据列)的时候,使用ENCRYPT进行标注。表示这个字段是使用加密保护的重要字典。
SQL> create table t
2 ( id number primary key,
3 name varchar2(10) ENCRYPT);
Table created
上面的name列,使用了ENCRYPT进行标志,表明需要对这个字段进行加密处理,采用默认的加密配置。
注意:在默认不指定的情况下,Oracle在加密之前,对明文都要进行salt处理。所谓salt处理是一种强化加密数据的方法。通过在加密前明文中掺入一个随机字符串,来强化加密层级,防止进行字典攻击和其他类型的破解操作。如果不需要进行salt处理,就是用No Salt在ENCRYPT后面。
使用salt是有一些限制的,如果列加密使用了salt,在对该列进行索引的时候,会报错。
在加密算法方面,Oracle也提供了一些非默认加密算法,使用的时候,使用using关键字配合使用。加密方法如下:
l 3DES168
l AES128
l AES192 (default)
l AES256
下面是一个使用No Salt和指定加密算法的例子。
SQL> create table t_test
2 (id number primary key,
3 age number encrypt no salt,
4 name varchar2(10) encrypt using '3DES168');
Table created
如果要对一个已经加密处理的数据列,解除加密,使用alter table…和DECRYPT关键字就可以实现,这里不加以累述。
使用数据加密列
我们先向数据表t中插入一批数据
declare
i number;
begin
for i in 1..10 loop
insert into t
values (i,'Names : '||i);
end loop;
commit;
end ;
/
成功插入数据,并可以实现查询。
SQL> select * from t;
ID NAME
---------- ----------
1 Names : 1
2 Names : 2
……
10 rows selected
似乎和一般的没有差别,但是如果我们关闭了解密Wallet会如何?
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
//关闭Wallet
SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
System altered
//重新连回scott
SQL> conn scott/tiger@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
//报错
SQL> select * from t;
select * from t
ORA-28365: Wallet 未打开
//能够查找到数目
SQL> select count(*) from t;
COUNT(*)
----------
10
//非加密字段没有问题
SQL> select id from t;
ID
----------
1
2
……
10 rows selected
//加密字段
SQL> select name from t;
select name from t
ORA-28365: Wallet 未打开
从上面的例子看,TDE的作用就是最大限度的保护加密字段,防止非法被访问。
最后我们看看salt对索引的影响。
SQL> desc t_test;
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID NUMBER
AGE NUMBER Y //no salt
NAME VARCHAR2(10) Y //salt
SQL> create index ind_t_test_name on t_test(name);
create index ind_t_test_name on t_test(name)
ORA-28338: 无法使用 salt 值加密索引列
SQL> create index ind_t_test_name on t_test(age);
Index created
相关的数据视图
对于TDE而言,牵扯到的数据字典相对较少,而且容易理解。
l dba_encrypted_columns:记录所有的加密字段;
l all_encrypted_columns:记录当前用户所能访问到的所有加密字段;
l user_encrypted_columns:记录当前用户自身Schema所有的加密字段;
那么,加密过程中,对性能的影响是如何?对master key的管理有什么注意之处?我们下次继续研究。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10583980/viewspace-682007/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10583980/viewspace-682007/