oracle10gR2新特性透明加密(TDE)及常见错误ORA-28353和ORA-28368简介
Sep072011
从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:oracleproduct11.2.0dbhome_1adminstreamwallets)) )
但是我建立了默认路径,也在sqlnet.ora文件中制定了路径(也是默认路径)仍然无法创建wallet,而且监听已经起不开,正确的方法是在sqlnet.ora文件中加入
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) ENCRYPTION_WALLET_LOCATION= (SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=D:oracleproduct11.2.0dbhome_1adminstreamwallets)) ) SQL> alter system set encryption key identified by "xxxx"; 系统已更改。 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 已连接。 SQL> 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 数据库装载完毕。 数据库已经打开。 SQL> conn stream/stream 已连接。 SQL> select * from test; select * from test * 第 1 行出现错误: ORA-28365: Wallet 未打开 但是未加密列是可以查询的。 SQL> select id from test; ID ---------- 1 2 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拥有的对象不能使用透明加密。
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 所拥有的对象