首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > 利用Oracle的dbms_obfuscation_toolkit加密解密数据
【标  题】:利用Oracle的dbms_obfuscation_toolkit加密解密数据
【关键字】:Oracle,dbms_obfuscation_toolkit
【来  源】:http://www.cublog.cn/u/11598/showart.php?id=194428

利用Oracle的dbms_obfuscation_toolkit加密解密数据

利用Oracle的dbms_obfuscation_toolkit加密解密数据

作者:叶枫




版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:叶枫(http://blog.matrix.org.cn/page/叶枫)
原文:[http://www.matrix.org.cn/resource/article/44/44020_Oracle.html]http://www.matrix.org.cn/resource/article/44/44020_Oracle.html[/url]
关键字:Oracle 加密 解密


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

资源:
Oracle社区:
http://www.matrix.org.cn/topic.shtml?forumId=36


Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1062284

 

 

回:简单回复如下:

CREATE OR REPLACE function md5(input_string VARCHAR2return varchar2
IS
raw_input 
RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
decrypted_raw 
RAW(2048);
error_in_input_buffer_length EXCEPTION;
BEGIN
sys.dbms_obfuscation_toolkit.MD5(input 
=> raw_input, checksum => decrypted_raw);
return lower(rawtohex(decrypted_raw));
END;
EXP-00091的解決方法:【上一篇】
通过sql*plus输出excel、html格式文件:【下一篇】
【相关文章】
  • Oracle Listener启动失效
  • Oracle 11g的新特性
  • Oracle 10g CRS 安装管理
  • oracle partition
  • [Fedora Core 6] 安装 Oracle 10g Client For Linux 安装
  • 在ORACLE里用存储过程定期分割表〔转〕
  • Oracle9i的简化SQL语法
  • ODBC的Oracle驱动的关于no_data_found的BUG
  • 今天上传 更新与得到clob的值OracleClob 很爽.公共接口的.只要调用就可以了(原创)
  • Oracle数据库中快照(snapshots)的使用
  • 【随机文章】
  • Javascript里使用Dom操作Xml
  • MFC的进程和线程,非正常终止
  • 信息化感想(一)
  • 明基部落
  • Painter 绘制《机车少年》(1)
  • 信手拈来的虚拟光驱
  • SQLServer一些小技巧
  • 轻轻松松抓图标源代码
  • 清华紫光新ERP系统上线之后
  • TCPDUMP使用 - 转载
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.