1、需要更新sqlnet.ora文件以包含一个ENCRYPTED_WALLET_LOCATION条目
Windows下的位置:
# sqlnet.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
将以下条目添加到文件末尾并保存:
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=D:/oracle/product/10.2.0/admin/TEST/wallet)))
2、打开钱夹并创建万能加密密钥
SQL> conn / as sysdba;
已连接。
SQL> alter system set key identified by "dgpki";
系统已更改。
此命令的作用为:
如果指定的目录中不存在加密钱夹,则将创建加密钱夹(ewallet.p12)、打开此钱夹并创建/重新创建TDE的万能密钥。
如果指定目录中存在加密钱夹,则将打开此钱夹并创建/重新创建TDE的万能密钥。
3、创建测试表
SQL> conn dgyd/dgyd@test;
已连接。
SQL> create table test(id number,credit_card_number varchar2(16) ENCRYPT NO SALT);
表已创建。
SQL> insert into test values(1,'9974586');
已创建 1 行。
SQL> insert into test values(2,'9974587');
已创建 1 行。
SQL> insert into test values(3,'9974588');
已创建 1 行。
SQL> commit;
提交完成。
4、测试
SQL> select * from dgyd.test;
ID CREDIT_CARD_NUMB
---------- ----------------
1 9974586
2 9974587
3 9974588
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 96469672 bytes
Database Buffers 188743680 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
(1)系统重启后没有打开加密钱夹,查询到加密列会出错
SQL> select * from dgyd.test;
select * from test
*
第 1 行出现错误:
ORA-28365: Wallet 未打开
(2)非加密列可以正常查询
SQL> select id from test;
ID
----------
1
2
3
(3)打开加密钱夹后可以正常查询所有列
SQL> alter system set key identified by "dgpki";
系统已更改。
SQL> select * from dgyd.test;
ID CREDIT_CARD_NUMB
---------- ----------------
1 9974586
2 9974587
3 9974588
5、说明
(1)如果用户想打开钱夹,必须具有alter system权限;
(2)sys用户的表不能被加密;
(3)丢失ewallet加密钱夹的话,是不能再解密数据的。
可见:Oracle TDE是在数据层面上对表里的数据加密,而且不会影响数据库现有的权限控制策略。
salt实际上就是在加密过程中引入一个随机性,同样的明文产生不同样的密文。
no salt的话,自然就是相同的明文会产生相同的密文了。对于索引来说,要求no salt也就可以理解了。