Oracle ----加密解密
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:
SYS AS SYSDBA on 2008-03-05 15:58:26 at ORCL>create table users(
2 userid varchar2(50) primary key,
3 password varchar2(64),
4 encrypted varchar2(64)
5 );
已建立表格.
SYS AS SYSDBA on 2008-03-05 16:00:20 at ORCL>insert into users values('user1','user1234',null);
已建立 1 個資料列.
SYS AS SYSDBA on 2008-03-05 16:00:25 at ORCL>insert into users values('user2','abcd1234',null);
已建立 1 個資料列.
SYS AS SYSDBA on 2008-03-05 16:00:42 at ORCL>insert into users values('user3','oracle12',null)
已建立 1 個資料列.
commit;
3. 建立包PG_ENCRYPT_DECRYPT
SYS AS SYSDBA on 2008-03-05 16:01:43 at ORCL>create or replace package pg_encrypt_decrypt is
2 ikey varchar2(8):='oracle9i';
3 function gen_raw_key(ikey in varchar2) return raw;
4 function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return varchar2;
5 function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw;
6 end;
7 /
已建立套裝程式.
SYS AS SYSDBA on 2008-03-05 16:29:39 at ORCL>create or replace package body pg_encrypt_decrypt
is
2 function gen_raw_key(ikey in varchar2) return raw as
3 rawkey raw(240):='';
4 begin
5 for i in 1..length(ikey) loop
6 rawkey:=rawkey||hextoraw(to_char(ascii(substr(ikey,i,1))));
7 end loop;
8 return rawkey;
9 end;
10
11 function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return varchar2 as
12 vdecrypted varchar2(4000);
13 rawkey raw(240):='';
14 begin
15 rawkey:=gen_raw_key(ikey);
16 vdecrypted:=dbms_obfuscation_toolkit.des3decrypt(
17 utl_raw.cast_to_varchar2(ivalue),key_string=>rawkey,which=>imode);
18 return vdecrypted;
19 end;
20
21 function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw
22 is
23 vencrypted varchar2(4000);
24 vencryptedraw raw(2048);
25 rawkey raw(240):='';
26 begin
27 rawkey:=gen_raw_key(ikey);
28 vencrypted:=dbms_obfuscation_toolkit.des3encrypt(ivalue,key_string=>rawkey,which=>imode)
;
29 vencryptedraw:=utl_raw.cast_to_raw(vencrypted);
30 return vencryptedraw;
31 end;
32 end;
33
34 /
已建立套裝程式主體.
SYS AS SYSDBA on 2008-03-05 16:29:39 at ORCL>create or replace package body pg_encrypt_decrypt
is
2 function gen_raw_key(ikey in varchar2) return raw as
3 rawkey raw(240):='';
4 begin
5 for i in 1..length(ikey) loop
6 rawkey:=rawkey||hextoraw(to_char(ascii(substr(ikey,i,1))));
7 end loop;
8 return rawkey;
9 end;
10
11 function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return varchar2 as
12 vdecrypted varchar2(4000);
13 rawkey raw(240):='';
14 begin
15 rawkey:=gen_raw_key(ikey);
16 vdecrypted:=dbms_obfuscation_toolkit.des3decrypt(
17 utl_raw.cast_to_varchar2(ivalue),key_string=>rawkey,which=>imode);
18 return vdecrypted;
19 end;
20
21 function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw
22 is
23 vencrypted varchar2(4000);
24 vencryptedraw raw(2048);
25 rawkey raw(240):='';
26 begin
27 rawkey:=gen_raw_key(ikey);
28 vencrypted:=dbms_obfuscation_toolkit.des3encrypt(ivalue,key_string=>rawkey,which=>imode)
;
29 vencryptedraw:=utl_raw.cast_to_raw(vencrypted);
30 return vencryptedraw;
31 end;
32 end;
33
34 /
已建立套裝程式主體.
SYS AS SYSDBA on 2008-03-05 16:29:57 at ORCL>update users set encrypted=pg_encrypt_decrypt.enc
rypt_3key_mode(password,1);
已更新 3 個資料列.
SYS AS SYSDBA on 2008-03-05 16:32:37 at ORCL>commit;
確認完成.
SYS AS SYSDBA on 2008-03-05 16:34:35 at ORCL>column encrypted format a20
SYS AS SYSDBA on 2008-03-05 16:34:41 at ORCL>/
USERID PASSWORD ENCRYPTED
---------- ---------- --------------------
user1 user1234 69EF3A211A0F2C32
user2 abcd1234 CF7562203F6CEDE5
user3 oracle12 65D71D7148FA001D
SYS AS SYSDBA on 2008-03-05 16:34:42 at ORCL>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
6. 金鑰的儲存
不管我們用什麼樣的加密演算法,有一點非常重要的是: 金鑰的儲存.
金鑰就是一把鑰匙,因為加密演算法是公開的,所以你無論如何加密,
只要我知道你的金鑰,我就可以解密,那麼你的加密就沒有效果.
在本文中, 我們的金鑰是這樣定義的:-
iKey varchar2(8):='oracle9i';
oracle9i就是我們的金鑰.
所以,如果只是簡單地把以上程式在oracle上執行一下就使用,那麼任何有許可權登陸
的人看到這個程式,就可以知道金鑰. 所以簡單的做法是利用Oracle提供的WRAP
把整個程式加密,用加密後的文字建立程式. 這樣別人就看不到你的原始碼了.
把程式儲存為source.sql,在Dos命令下輸入:-
Wrap iname=source.sql name=target.sql
就可以了,然後SQL Plus執行target.sql.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/701141/viewspace-200397/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 加密解密加密解密
- PHP加密解密PHP加密解密
- js加密解密JS加密解密
- AES加密解密加密解密
- AES 加密&解密加密解密
- php mcrypt 加密 解密PHP加密解密
- Javascript 加密解密方法JavaScript加密解密
- AES CBC 加密解密加密解密
- RSA加密與解密加密解密
- Java加密解密瞭解Java加密解密
- android加密解密完美教程Android加密解密
- 線上加密/解密工具加密解密
- 影像的加密與解密加密解密
- oracle unwrap解密工具Oracle解密
- PHP Base64 加密 & 解密PHP加密解密
- php rsa長文加密解密PHP加密解密
- utf8 加密與解密加密解密
- Python AES 加密和解密(qbit)Python加密解密
- golang AES-CBC 加密解密Golang加密解密
- python AES-CBC 加密解密Python加密解密
- golang securecookie加密解密cookie值GolangCookie加密解密
- RSA 非對稱加密&解密加密解密
- 文字加密:常見的密碼加密解密方法加密密碼解密
- php如何openssl_encrypt加密解密PHP加密解密
- 前端加密解密之Crypto.js前端加密解密JS
- Base64工具類(加密、解密)加密解密
- C# MD5 加密,解密C#加密解密
- 序列密碼的加密與解密密碼加密解密
- RSA加密解密示例程式碼加密解密
- Java 常用加密解密演算法Java加密解密演算法
- 加密解密演算法系列加密解密演算法
- Flutter 的加密和解密資料Flutter加密解密
- Java AES加密和解密教程 - BaeldungJava加密解密
- dbms_obfuscation_toolkit(資料加密解密)加密解密
- 後臺對Json資料加密、解密JSON加密解密
- Go 加密解密演算法總結Go加密解密演算法
- AES位元組陣列加密解密流程陣列加密解密
- 加密和解密的另個應用加密解密
- delphi加密C#解密(AES-256)加密C#解密