dbms_obfuscation_toolkit 11g
為了保護敏感資料,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- dbms_obfuscation_toolkit(資料加密解密)加密解密
- 利用dbms_obfuscation_toolkit保護資料(轉)
- zt_ 使用DBMS_OBFUSCATION_TOOLKIT對內容加密加密
- 採用Oracle的dbms_obfuscation_toolkit的加密和解密詳解Oracle加密解密
- 【11g】11g 中警告日誌的位置
- oracle 11gOracle
- 11g auto maintenanceAINaN
- oracle 11g acfsOracle
- oracle 11g dataguardOracle
- WebServices in Oracle 11gWebOracle
- 11g新特性--Oracle 11g 閃回資料歸檔Oracle
- Oracle之11g DataGuardOracle
- 11g rac 日誌
- New 11g Default Jobs
- Interval Partition table 11G
- Oracle 11G EM建立Oracle
- Oracle 11G Virtual ColumnsOracle
- 11G DATAGUARD的理解
- Oracle 11G Duplicate DatabaseOracleDatabase
- oracle 11G dataguard配置Oracle
- oracle 11g 磁碟操作Oracle
- oracle 11g em recreateOracle
- ORACLE DG 11G 搭建Oracle
- oracle 11g 柱狀Oracle
- oracle 11g 角色口令Oracle
- oracle 11g dataguard 建立Oracle
- ORACLE 11G OCM PASSOracle
- 11g Active DataGuard初探
- Oracle 11g tablespace usageOracle
- Oracle 11g Active DataguardOracle
- Oracle 11g 新特性Oracle
- Oracle 11g Data GuardOracle
- BIEE 11g遷移
- FLASH CACHE IN ORACLE 11GOracle
- Oracle 11g釋出Oracle
- as 5安裝11g
- oracle 11g 建立 jobOracle
- There are five editions in oracle 11gOracle