日期:2014-05-16  浏览次数:20561 次

oracle10gR2新特性--透明加密(TDE)

从10gR2开始,oracle推出了透明数据加密技术(Transparent Data Encryption,TDE)。有效的保护数据的安全。 使用透明加密的时候有可能遇到ORA-28353和ORA-28368错误。
下面是有关实验。
SQL>create table test (id number,name varchar2(16) ENCRYPT NO SALT);
第 1 行出现错误:
ORA-28353: 无法打开 wallet

SQL> alter system set encryption key identified by "super5281";
alter system set encryption key identified by "super5281"
*
第 1 行出现错误:
ORA-28368: 无法自动创建 wallet
原因:$ORACLE_HOME/admin/$ORACLE_SID/wallet是存放密钥的默认目录,如果没有在sqlnet.ora文件中指定密钥存放的路径,没有此目录会报ORA-28368: 无法自动创建 wallet错误。
网上有很多关于此错误的文档,总的来说解决方法有两种
1.?创建密钥的默认存放目录
$ORACLE_HOME/admin/$ORACLE_SID/wallet
2.?在sqlnet.ora文件中指定密钥的存放目录
网上很多资料都说在sqlnet.ora文件中加入以下内容
ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=D:\oracle\product\11.2.0\dbhome_1\admin\stream\wallets))
)
但是我建立了默认路径,也在sqlnet.ora文件中制定了路径(也是默认路径)仍然无法创建wallet,而且监听已经起不开,正确的方法是在sqlnet.ora文件中加入
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
?ENCRYPTION_WALLET_LOCATION=
??(SOURCE=(METHOD=FILE)(METHOD_DATA=
?(DIRECTORY=D:\oracle\product\11.2.0\dbhome_1\admin\stream\wallets))
?)

SQL> alter system set encryption key identified by "super5281";
系统已更改。

SQL> create table test (id number,name varchar2(16) ENCRYPT NO SALT);
表已创建。
SQL> insert into test values(1,'zhangsan');
已创建 1 行。
SQL> insert into test values(2,'lisi');
已创建 1 行。
SQL> commit;
提交完成。

SQL> select * from test;
ID????? NAME
---------- ----------------
1?zhangsan
2?lisi
如果此时关闭wallet,name字段将不能查询。
重启数据库,wallet默认关闭状态。
SQL> conn / as sysdba
已连接。
QL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area? 313860096 bytes
Fixed Size????????????????? 1374304 bytes
Variable Size???????????? 176162720 bytes
Database Buffers????????? 130023424 bytes
Redo Buffers??????????????? 6299648 bytes
数据库装载完毕。
数据库已经打开。
Wallet关闭,加密的字段已不能查询。
SQL> conn stream/stream
已连接。
SQL> select * from test;
select * from test
????????????? *
第 1 行出现错误:
ORA-28365: Wallet 未打开
未被加密的字段可以查询。
SQL> select id from test;
??? ID
----------
1
2
打开wallet之后,加密的字段可以被查询。
SQL> alter system set encryption wallet open identified by "super5281";
系统已更改。
SQL> select * from test;
ID???? NAME
---------- ----------------
1?zhangsan
2?lisi
除了encrypt,加密列还有另外一个属性salt,默认情况下是salt,可以通过alter table table_name modiry (column_name column_type encrypt no salt)命令修改成no salt,只有no salt的加密列上才能创建索引
SQL> create index index_name on test(name);
索引已创建。
SQL> drop index index_name;
索引已删除。
SQL> alter table test modify(name varchar2(16) encrypt);
表已更改。
SQL> create index index_name on test(name);
create index index_name on test(name)
??????????????????????????????? *
第 1 行出现错误:
ORA-28338: 不能同时使用 salt 值索引和加密列
Sys拥有的对象不能使用透明加密。
SYS拥有的对象不能被加密。
SQL> conn / as sysdba
已连接。
SQL> create table test (id number,name varchar2(16) ENCRYPT NO SALT);
create table test (id number,name varchar2(16) ENCRYPT NO SALT)
???????????????????????????? *
第 1 行出现错误:
ORA-28336: 不能加密 SYS 所拥有的对象

?