| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1575 人关注过本帖
标题:利用Oracle的dbms_obfuscation_toolkit加密解密数据
只看楼主 加入收藏
xiuyuan123
Rank: 2
等 级:新手上路
威 望:3
帖 子:140
专家分:0
注 册:2006-4-25
收藏
 问题点数:0 回复次数:1 
利用Oracle的dbms_obfuscation_toolkit加密解密数据

为保护敏感数据,oracle从8i开始提供一个数据加密包:dbms_ obfuscation _toolkit.利用这个包,我们可以对数据进行DES,Triple DES或者MD5加密,本文就此讲解如何使用以及使用过程需要注意的问题:
1dbms_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;
/*
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;

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。
当然了,这里讲的密钥保存还是很简单的。并不是百分百保险。大家可以自己想想如何更安全地保持你的密钥。

搜索更多相关主题的帖子: obfuscation dbms toolkit Oracle DES 
2006-04-25 16:21
hsjljh
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-10-26
收藏
得分:0 
dddddddddddddddddddddddddddd
2006-05-03 12:27
快速回复:利用Oracle的dbms_obfuscation_toolkit加密解密数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028142 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved