dbms_obfuscation_toolkit 11g

tom_xieym發表於2012-02-27

為了保護敏感資料,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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章