Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2088514
  • 博文数量: 1647
  • 博客积分: 80000
  • 博客等级: 元帅
  • 技术积分: 9980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 15:15
文章分类

全部博文(1647)

文章存档

2011年(1)

2008年(1646)

我的朋友

分类:

2008-10-28 17:45:46

    在10g之前,虽然提供了类似帐号认证,授权以及审计等机制来保证数据库中的数据性,但是这些机制都是Oracle运行状态下提供的。对于最终保存在数据文件中的数据,基本上等于是明文保存的,虽然不同的数据类型在到数据文件中的格式有区别,但实际上这些格式已经广为人知,也有一些工具能够直接从数据文件中读取数据,比如官方的DUL和网友d.c.b.a开发的AUL等。

一、什么是TDE

    10gR2引入的透明数据加密(TDE)特性,允许在不影响应用的情况下,加密最终存储到数据文件中的数据,以防止未经授权的直接读取数据文件获得数据的行为。为防止未经授权的解密访问,TDE将加密密钥存储在数据库外部.

    TDE允许对列中的数据存储进行加密处理,并且不需要由最终用户或者应用来管理或者使用密钥来获得解密数据。
TDE特性属于Advanced Security组件。
目前,TDE还不支持以下特性:
B*Tree索引之外的其他索引类型
索引范围扫描
大对象如BLOB和CLOB
imp/exp工具(但是支持impdp/expdp)
使用其他直接读取数据文件的工具如DUL/AUL
在不能使用TDE的时候,可以考虑使用DBMS_CRYPTO包替代,该包能实现数据的加密后存放,但不能对应用透明,应用在查询加密数据前必须显式解密。
需要注意的是,加密一个已经存在数据的表中的列,会导致全表更新,对于大表进行该操作前需严格的规划和。

二、TDE的工作机制

    TDE是一种基于密钥的访问控制方式。数据以某种密钥加密存储,在访问时,如果没有解密密钥,则无法获得需要的数据。访问时的解密是自动进行的,对于应用程序完全透明。
当一个表中的一个或者多个列被加密时,需要为这个表分配一个密钥(一个表只需要一个密钥)。系统中所有的密钥在经过中的一个主密钥加密后存储在数据字典中,也就是说,密钥本身也是加密存储的。
而主密钥则存储在数据库外部,使用外部机制来保证主密钥的安全控制。这个外部安全机制就是oracle提供的wallet机制。


三、如何使用TDE


    要使用透明数据加密特性,用户需要有alter system系统权限,并且拥有有效的oracle wallet密码。如果还没有wallet存在,则下面的SQL语句创建一个,其密码就是指定的password:

alter system set encryption key identitified by password

    执行该语句之前,必须保证$ORACLE_HOME/admin/$ORACLE_SID下已经有名叫wallet的目录,否则将出现错误:

system set encryption key identified by test;
alter system set encryption key identified by test
*
ERROR at line 1:
ORA-28368: cannot auto-create wallet

    以上路径是默认的wallet存放路径,也可以通过在sqlnet.ora文件中设置如下属性更改wallet的路径:

ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=D:wallet)))

    该语句执行后,会打开已经存在的wallet或者新生成一个wallet并打开然后创建主密钥执行成功后就可以创建包含加密列的table了

table test(id int, name varchar2(100) encrypt);
create table test(id int, name varchar2(100) encrypt)
*
ERROR at line 1:
ORA-28336: cannot encrypt SYS owned objects

    可以看到,sys的对象不能使用加密列

ning/ning
Connected.

table test(id int, name varchar2(100) encrypt);
Table created.

    这样,就创建了一个table,关键字encrypt表示其第二个列为加密列。

into test values(1,'a');
1 row created.
* from test;
ID NAME
---------- ----------------------------------------
1 a

[1]   

【责编:Youping】

--------------------next---------------------

阅读(155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~