oracle解密后台包,利用Oracle的dbms_obfuscation_toolkit加密解密数据

(转)为了保护敏感数据,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:

drop table users;

create table users(

userid varchar2(50) primary key,

password varchar2(64), --密码原文

encrypted varchar2(64) --加密后的密码

);

insert into users values ('user1','user1234',null);

insert into users values ('user2','abcd1234',null);

insert into users values ('user3','oracle12',null);

commit;

3.

创建包PG_ENCRYPT_DECRYPT

create or replace package PG_ENCRYPT_DECRYPT is

iKey varchar2(8):='oracle9i';

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;

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;

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;

4. 测试

在SQL Plus下输入:

SQL > update users set encrypted = PG_ENCRYPT_DECRYPT.ENCRYPT_3KEY_MODE(password,1);

SQL > commit;

执行完以上SQL语句后,encrypted 存储的就是加密后的password字段.我们看一下结果:-

SQL > select * from users;

USERID PASSWORD ENCRYPTED

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

user1 user1234 69EF3A211A0F2C32

user2 abcd1234 CF7562203F6CEDE5

user3 oracle12 65D71D7148FA001D

这个加密结果是否正确? 我们对加密结果解密就知道了,在SQL Plus下输入:

SQL > 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

大家可以看到,解密结果和密码原文完全一模一样.这说明我们的加密解密过程是正确的.

5. 进一步思考

我们再看一下表users:-

create table users(

userid varchar2(50) primary key,

password varchar2(64), --密码原文

encrypted varchar2(64) --加密后的密码

);

还有我们插入的数据:-

insert into users values ('user1','user1234',null);

insert into users values ('user2','abcd1234',null);

insert into users values ('user3','oracle12',null);

以及加密输出结果:-

[/code]

USERID PASSWORD ENCRYPTED

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

user1 user1234 69EF3A211A0F2C32

user2 abcd1234 CF7562203F6CEDE5

user3 oracle12 65D71D7148FA001D

[/code]

不知细心的朋友注意到没有? 在表中,password 和 encrypted 的长度都是64,

都是8的倍数, 再看一下我们的密码原文和加密后的密码也是8的倍数,这不是

巧合,而是DES算法和Triple DES算法的特征之一. 输入长度必须是8的倍数,

而输出也是8的倍数,所以我们的字段长度也是8的倍数. 如果输入不是8的倍数

会怎样? 大家可以把密码原文修改一下试试.

6. 密钥的保存

不管我们用什么样的加密算法,有一点非常重要的是: 密钥的保存.

密钥就是一把钥匙,因为加密算法是公开的,所以你无论如何加密,

只要我知道你的密钥,我就可以解密,那么你的加密就没有效果.

在本文中, 我们的密钥是这样定义的:-

iKey varchar2(8):='oracle9i';

oracle9i就是我们的密钥.

所以,如果只是简单地把以上程序在oracle上运行一下就使用,那么任何有权限登陆

的人看到这个程序,就可以知道密钥. 所以简单的做法是利用Oracle提供的WRAP

把整个程序加密,用加密后的文本创建程序. 这样别人就看不到你的源代码了.

把程序保存为source.sql,在Dos命令下输入:-

Wrap iname=source.sql oname=target.sql

就可以了,然后SQL Plus运行target.sql.

当然了, 这里讲的密钥保存还是很简单的. 并不是百分百保险. 大家可以自己

想想如何更安全地保持你的密钥.

资源:

Oracle社区:

http://www.matrix.org.cn/topic.shtml?forumId=36

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值