ITPub博客

首页 > 数据库 > 数据库开发技术 > 利用dbms_obfuscation_toolkit保护数据(转)

利用dbms_obfuscation_toolkit保护数据(转)

原创 数据库开发技术 作者:zhanghjgnu 时间:2008-06-12 07:59:09 0 删除 编辑

为了保护敏感数据,oracle从8i开始提供一个数据加密包:dbms_obfuscation_toolkit.利用这个包,我们可以对数据进行DES,Triple DES或者MD5加密.本文就此讲解如何使用以及使用过程需要注意的问题.

1. dbms_obfuscation_toolkit简介
dbms_obfuscation_toolkit
主要有一下几个存储过程:-

DESGETKEY --
产生密钥,用于DES算法

DES3GETKEY --
产生密钥,用于Triple DES算法

DESENCRYPT --
用DES算法加密数据

DESDECRYPT --
用DES算法解密数据
DES3ENCRYPT --
用Triple DES算法加密数据
DES3DECRYPT --
用DES算法解密数据
MD5 --
用MD5算法加密数据

2.准备数据表在开始前,我们先创建表users:

SYS AS SYSDBA on 2008-03-05 15:58:26 at ORCL>create table users(

2 userid varchar2(50) primary key,

3 password varchar2(64),

4 encrypted varchar2(64)

5 );

已建立表格.

SYS AS SYSDBA on 2008-03-05 16:00:20 at ORCL>insert into users values('user1','user1234',null);

已建立1個資料列.

SYS AS SYSDBA on 2008-03-05 16:00:25 at ORCL>insert into users values('user2','abcd1234',null);

已建立1個資料列.

SYS AS SYSDBA on 2008-03-05 16:00:42 at ORCL>insert into users values('user3','oracle12',null)

已建立1個資料列.

commit;

3.创建包PG_ENCRYPT_DECRYPT

SYS AS SYSDBA on 2008-03-05 16:01:43 at ORCL>create or replace package pg_encrypt_decrypt is

2 ikey varchar2(8):='oracle9i';

3 function gen_raw_key(ikey in varchar2) return raw;

4 function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return varchar2;

5 function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw;

6 end;

7 /

已建立套裝程式.

SYS AS SYSDBA on 2008-03-05 16:29:39 at ORCL>create or replace package body pg_encrypt_decrypt

is

2 function gen_raw_key(ikey in varchar2) return raw as

3 rawkey raw(240):='';

4 begin

5 for i in 1..length(ikey) loop

6 rawkey:=rawkey||hextoraw(to_char(ascii(substr(ikey,i,1))));

7 end loop;

8 return rawkey;

9 end;

10

11 function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return varchar2 as

12 vdecrypted varchar2(4000);

13 rawkey raw(240):='';

14 begin

15 rawkey:=gen_raw_key(ikey);

16 vdecrypted:=dbms_obfuscation_toolkit.des3decrypt(

17 utl_raw.cast_to_varchar2(ivalue),key_string=>rawkey,which=>imode);

18 return vdecrypted;

19 end;

20

21 function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw

22 is

23 vencrypted varchar2(4000);

24 vencryptedraw raw(2048);

25 rawkey raw(240):='';

26 begin

27 rawkey:=gen_raw_key(ikey);

28 vencrypted:=dbms_obfuscation_toolkit.des3encrypt(ivalue,key_string=>rawkey,which=>imode)

;

29 vencryptedraw:=utl_raw.cast_to_raw(vencrypted);

30 return vencryptedraw;

31 end;

32 end;

33

34 /

已建立套裝程式主體.

SYS AS SYSDBA on 2008-03-05 16:29:39 at ORCL>create or replace package body pg_encrypt_decrypt

is

2 function gen_raw_key(ikey in varchar2) return raw as

3 rawkey raw(240):='';

4 begin

5 for i in 1..length(ikey) loop

6 rawkey:=rawkey||hextoraw(to_char(ascii(substr(ikey,i,1))));

7 end loop;

8 return rawkey;

9 end;

10

11 function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return varchar2 as

12 vdecrypted varchar2(4000);

13 rawkey raw(240):='';

14 begin

15 rawkey:=gen_raw_key(ikey);

16 vdecrypted:=dbms_obfuscation_toolkit.des3decrypt(

17 utl_raw.cast_to_varchar2(ivalue),key_string=>rawkey,which=>imode);

18 return vdecrypted;

19 end;

20

21 function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw

22 is

23 vencrypted varchar2(4000);

24 vencryptedraw raw(2048);

25 rawkey raw(240):='';

26 begin

27 rawkey:=gen_raw_key(ikey);

28 vencrypted:=dbms_obfuscation_toolkit.des3encrypt(ivalue,key_string=>rawkey,which=>imode)

;

29 vencryptedraw:=utl_raw.cast_to_raw(vencrypted);

30 return vencryptedraw;

31 end;

32 end;

33

34 /

已建立套裝程式主體.

SYS AS SYSDBA on 2008-03-05 16:29:57 at ORCL>update users set encrypted=pg_encrypt_decrypt.enc

rypt_3key_mode(password,1);

已更新3個資料列.

SYS AS SYSDBA on 2008-03-05 16:32:37 at ORCL>commit;

確認完成.

SYS AS SYSDBA on 2008-03-05 16:34:35 at ORCL>column encrypted format a20

SYS AS SYSDBA on 2008-03-05 16:34:41 at ORCL>/

USERID PASSWORD ENCRYPTED

---------- ---------- --------------------

user1 user1234 69EF3A211A0F2C32

user2 abcd1234 CF7562203F6CEDE5

user3 oracle12 65D71D7148FA001D

SYS AS SYSDBA on 2008-03-05 16:34:42 at ORCL>select userid,password,pg_encrypt_decrypt.decrypt_3key_mode(encrypted,1) decrypted from users;

USERID PASSWORD

---------- ----------

DECRYPTED

--------------------------------------------------------------------------------

user1 user1234

user1234

user2 abcd1234

abcd1234

user3 oracle12

oracle12

6.密钥的保存不管我们用什么样的加密算法,有一点非常重要的是:密钥的保存.密钥就是一把钥匙,因为加密算法是公开的,所以你无论如何加密,只要我知道你的密钥,我就可以解密,那么你的加密就没有效果.在本文中,我们的密钥是这样定义的:-

iKey varchar2(8):='oracle9i';


oracle9i
就是我们的密钥.所以,如果只是简单地把以上程序在oracle上运行一下就使用,那么任何有权限登陆的人看到这个程序,就可以知道密钥.所以简单的做法是利用Oracle提供的WRAP把整个程序加密,用加密后的文本创建程序.这样别人就看不到你的源代码了.把程序保存为source.sql,在Dos命令下输入:-

wrap iname=f_get_rowid.sql oname=f_get_rowid.plb

就可以了,然后SQL Plus运行f_get_rowid.plb
@f_get_rowid.plb.

[@more@]

create or replace package PG_ENCRYPT_DECRYPT is
iKey varchar2(8):='12345678';
function GEN_RAW_KEY ( iKey in varchar2) return raw;
function DECRYPT_3KEY_MODE(iValue in raw,iMode in pls_integer)return varchar2;
function ENCRYPT_3KEY_MODE(iValue in varchar2,iMode in pls_integer)
return raw;
end;

create or replace package body PG_ENCRYPT_DECRYPT is
function GEN_RAW_KEY ( iKey in varchar2) return raw
as
rawkey raw(240) := '';
begin
for i in 1..length(iKey) loop
rawkey := rawkey||hextoraw(to_char(ascii(substr(iKey, i, 1))));
end loop;
return rawkey;
end;
/* Creating function DECRYPT_3KEY_MODE*/
FUNCTION DECRYPT_3KEY_MODE ( iValue in raw, iMode in pls_integer)return varchar2
as
vDecrypted varchar2(4000);
rawkey raw(240) := '';
begin
rawkey := GEN_RAW_KEY(iKey);-- decrypt input string
vDecrypted := dbms_obfuscation_toolkit.des3decrypt (UTL_RAW.CAST_TO_VARCHAR2(iValue), key_string => rawkey, which => iMode);
return vDecrypted;
end;
/*Creating function ENCRYPT_3KEY_MODE*/
FUNCTION ENCRYPT_3KEY_MODE ( iValue in varchar2, iMode in pls_integer)return raw
as
vEncrypted varchar2(4000);
vEncryptedRaw Raw(2048);
rawkey raw(240) := '';
begin
rawkey := GEN_RAW_KEY(iKey);-- encrypt input string
vEncrypted := dbms_obfuscation_toolkit.des3encrypt (iValue, key_string => rawkey, which => iMode);-- convert to raw as out
vEncryptedRaw := UTL_RAW.CAST_TO_RAW(vEncrypted);
return vEncryptedRaw;
end;
end;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11754099/viewspace-1005558/ ,如需转载,请注明出处,否则将追究法律责任。

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

注册时间:2008-09-04

  • 博文量
    11
  • 访问量
    70473