2 string_in_raw RAW(128):=UTL_RAW.cAST_TO_RAW(string_in);
3 key_string varchar2(32):='aisi3015aisi3015aisi3015';
4 key_raw RAW(128):=UTL_RAW.CAST_TO_RAW(key_string);
5 encrypted_raw RAW(128);
6 begin
7 encrypted_raw:=dbms_crypto.Encrypt(src=>string_in_raw,typ=>DBMS_CRYPTO.DES_CBC_PKCS5,key=>key_raw);
8 return encrypted_raw;
9 end;
10 /
Function created
2 string_out varchar2(50);
3 key_string varchar2(32):='aisi3015aisi3015aisi3015';
4 key_raw RAW(128):=UTL_RAW.CAST_TO_RAW(key_string);
5 decrypted_raw RAW(128);
6 begin
7 decrypted_raw:=dbms_crypto.Decrypt(src=>raw_in,typ=>DBMS_CRYPTO.DES3_CBC_PKCS5,key=>key_raw);
8 string_out:=UTL_RAW.cast_to_varchar2(decrypted_raw);
9 return string_out;
10 end;
11 /
Function created
ID NAME
---------- --------------------
1 DFAE340460104221
2 7CB16B28E5EC48B6
SQL> insert into test1 values(2,t_to_password('yy741'));
1 row inserted
SQL> insert into test1 values(3,t_to_password('yy852'));
1 row inserted
SQL> commit;
Commit complete
SQL> select * from test1;
ID NAME
---------- --------------------
1 DFAE340460104221
2 7CB16B28E5EC48B6
2 D4EDB84BEE3AAE85
3 45DC1D3B4C166CB9
SQL> select id,t_to_back(name) from test1;
ID T_TO_BACK(NAME)
---------- --------------------------------------------------------------------------------
1 yy456
2 yy123
2 yy741
3 yy852
SQL>
首先,在定义数据表中的数据列(或者修改数据列)的时候,使用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 ;
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所有的加密字段;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26425571/viewspace-731484/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26425571/viewspace-731484/