ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle TDE和DBMS_CRYPTO

oracle TDE和DBMS_CRYPTO

原创 Linux操作系统 作者:yanjie512 时间:2012-05-30 11:17:41 0 删除 编辑
oracle提供的两种加密方式TDE和DBMS_CRYPTO包
一、DBMS_CRYPTO包(10g以及更高的版本)
       这种方法,我们可以建构自己的基础架构,对数据进行加密,灵活性强,但是建构和管理相对TDE就比较复杂。
       dbms_crypto代替了9i中的dbms_obfuscation_toolkit,dbms_crypto增加了若干新的加密算法、哈希算法;撤销了对于public的执行权限,默认只有sysdba才能执行,其他任何用户都需要sysdba 的赋权才可执行;支持DES加密、双密钥的3DES加密以及三密钥的3DES加密,采用三个大小不同的AES和RC4加密算法;采用raw和blob存放密文(不采用字符型,因为不同语言版本的oracle数据库转换后的字符类型不同,当一个数据库的密文转到其他语言版本的数据库中将不能被解密,对字符型和其他数据类型加密要用utl_raw.cast_to_raw进行数据类型转换)。
实验测试:
用于生成加密的函数
function encrypt(scr in raw,-------需要加密的内容,但需转成raw类型
                                typ  in pls_integer,-----加密类型,由dbms_crypto定义
                                key in raw,------即加密密钥,可用固定字符生成密钥,解密时需要
                                 iv   in raw,default null)
测试加密/解密函数:
加密函数:
SQL> create or replace function t_to_password(string_in in varchar2) return raw is
  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
解密函数:
SQL> create or replace function t_to_back(raw_in in raw) return varchar2 is
  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
SQL> select * from test1;
 
        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>
测试成功过!
 
二、TDE-----透明数据加密(10gR2或更高的版本)
        TDE---数据仅以加密的方式存储,使用这种加密方法,不需要建构基础架构,只需定义加密的列。由于数据是加密存储的,所有后续的组建例如归档、备份,都是加密的格式。数据库为每个包含加密列的表创建一个私密的安全加密密钥,然后采用指定的加密算法加密指定的明文数据。master密钥对表密钥加密,master密钥保存在一个“钱夹(wallet)”的安全地方,钱夹可以是数据库服务器上的一个文件,加密的表密钥保存在数据字典中。
        当用户插入数据到需要加密的列中是,数据库首先从wallet中获取master密钥,用master密钥解密数据字典中的表密钥,然后用解密的表密钥加密输入的明文数据,再将加密后的数据保存在数据库。
        当用户查询加密列的时候,将加密的表密钥从数据字典取出,然后从wallet中取出master密钥,解密表密钥,再用解密的表密钥解密磁盘上的加密数据。
2.1、安装wallet
2.1.1、创建wallet文件夹并且在sqlnet.ora中添加encryption_wallet_location参数:
ENCRYPRION_WALLET_LOCATION=
        (SOURCE=(METHOD=FILE)
                (METHOD_DATA=
                  (DIRECTORY=/u01/admin/db/wallet)))
创建master key,指定wallet密码
使用sys用户登入系统,建立密码文件
alter system set [encryption] key identified by "aisi301504";
其中,"aisi301504"相当于设置一个wallet密码。Oracle Wallet是一个可以打开关闭的功能组件,设置密码之后,只有通过密码口令可以启用wallet功能。
开启和关闭wallet
SQL> alter system set encryption wallet open identified by "remnant";
System altered.
SQL> alter system set encryption wallet close identified by "remnant";
System altered.
SQL>
2.1.2、测试试验
对数据列加密是TDE一个常用的功能。我们常常需要对数据库中某个表的某个敏感数据进行加密处理,防止信息的外泄。
首先,在定义数据表中的数据列(或者修改数据列)的时候,使用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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-04-30

  • 博文量
    14
  • 访问量
    23800