ITPub博客

首页 > Linux操作系统 > Linux操作系统 > dbms_obfuscation_toolkit 11g

dbms_obfuscation_toolkit 11g

原创 Linux操作系统 作者:tom_xieym 时间:2012-02-27 15:59:15 0 删除 编辑

为了保护敏感数据,oracle从8i开始提供一个数据加密包:dbms_obfuscation_toolkit.利用这个包,我们可以对数据进行DES,Triple DES或者MD5加密.

11G操作記錄

1. dbms_obfuscation_toolkit简介

dbms_obfuscation_toolkit主要有一下几个存储过程:-

DESGETKEY -- 产生密钥,用于DES算法
DES3GETKEY -- 产生密钥,用于Triple DES算法
DESENCRYPT -- 用DES算法加密数据
DESDECRYPT -- 用DES算法解密数据
DES3ENCRYPT -- 用Triple DES算法加密数据
DES3DECRYPT -- 用DES算法解密数据
MD5 -- 用MD5算法加密数据

2. 准备数据表

在开始前,我们先创建表HR.HRM_EMPDEPCODE_XIEXIE;


CREATE TABLE HR.HRM_EMPDEPCODE_XIEXIE
(
  WORKNO     VARCHAR2(10 BYTE),
  password varchar2(64), --密码原文
  encrypted varchar2(64) --加密后的密码
)
TABLESPACE TESTXIE
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          20M
            NEXT             50M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL

insert into users values ('11','oracle12',null);
commit;


3. 创建包PG_ENCRYPT_DECRYPT

create or replace package HR.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 HR.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 HR.HRM_EMPDEPCODE_XIEXIE SET ENCRYPTED = PG_ENCRYPT_DECRYPT.ENCRYPT_3KEY_MODE(PASSWORD,1);
SQL > commit;


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

SQL > select * from HR.HRM_EMPDEPCODE_XIEXIE;

USERID PASSWORD ENCRYPTED
------ --------- ----------------
11 oracle12 69EF3A211A0F2C32

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

SQL > SELECT PASSWORD,PG_ENCRYPT_DECRYPT.DECRYPT_3KEY_MODE(ENCRYPTED,1) DECRYPTED FROM HR.HRM_EMPDEPCODE_XIEXIE;

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

5. 进一步思考

我们再看一下表
还有我们插入的数据:-
以及加密输出结果:-


不知细心的朋友注意到没有? 在表中,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 name=target.sql

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

当然了, 这里讲的密钥保存还是很简单的. 并不是百分百保险. 大家可以自己想想如何更安全地保持你的密钥.

轉載9i上面文檔,在11G上測試了下

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

上一篇: 开发DBA和产品DBA
下一篇: 重建控制文件--
请登录后发表评论 登录
全部评论

注册时间:2011-05-20

  • 博文量
    77
  • 访问量
    92125