Oracle Transparent Data Encryption

 

Oracle Transparent Data Encryption 透明加密(一)

Transparent Data Encryption透明机密技术Oracle10g版本之后推出的数据层加密技术。核心概念是借助外置于数据库的加密文件,对数据表列乃至表空间等多层次进行加密。这种技术对存储在数据库中的敏感信息,提供了简单可靠的安全防护解决方案。 

透明加密技术概要

 

简单的说,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所有的加密字段;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值