我要介紹的是oracle10g的數據加密處理,也就是通常的密碼的加密處理,
要用到DECRYPT方法對數據解密和ENCRYPT方法加密
1.首先通過sys用戶登錄到oracle數據庫,因為我們要通過這個用戶來設置一些高級權限
grant execute on DBMS_crypto to userName;
這句是為了能讓用戶使用dbms這個方法,能夠讓我們sql語句種直接簡單的調用就可以了,否則我們將無法使用加密和解密,數據庫也會報錯,不過我忘了是什麼錯誤了,userName就是你通過程序訪問數據庫時的用戶名,
2.然後要建立一張表,這張表裡就一個字段是用來存放一個key值,這個key值是要在接下來建立的方法種使用到的固定值
CREATE TABLE KEYINFOMTBL(
KEYCODE RAW(32) NOT NULL,
CONSTRAINT KEYINFOMTBL_P PRIMARY KEY (
KEYCODE)
USING INDEX
)
/
INSERT INTO KEYINFOMTBL VALUES ( DBMS_CRYPTO.RANDOMBYTES (32) )
通過這個兩個sql語句建立表, 並給表插入一條數據,注意字段的類型是raw型的,這個也是oracle數據庫種加密要用的字段類型。
3.就是要建立一個方法,要對數據進行加密處理了,這也是關鍵的一個部分,我以前在網上看到很多文章來說明這個過程,但試了很多都不好用,我現在給出的例子完全好用,這也是我現在做的項目中使用的
CREATE OR REPLACE FUNCTION ENCRYPT
(
INPUT_STRING VARCHAR2
)
RETURN RAW
IS
ENCRYPTED_RAW RAW (100);
KEY_BYTES_RAW RAW (32);
ENCRYPTION_TYPE PLS_INTEGER :=
DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
BEGIN
SELECT KEYCODE INTO KEY_BYTES_RAW FROM KEYINFOMTBL;
ENCRYPTED_RAW := DBMS_CRYPTO.ENCRYPT
(
SRC => UTL_I18N.STRING_TO_RAW (INPUT_STRING, 'AL32UTF8'),
TYP => ENCRYPTION_TYPE,
KEY => KEY_BYTES_RAW
);
RETURN ENCRYPTED_RAW;
END;
這個方法為什麼這樣寫,還要請oracle的高手來說明了,本人也不是很了解啊!嘿嘿
4.就是要建立一個解密的方法了,
CREATE OR REPLACE FUNCTION DECRYPT
(
INPUT_RAW RAW
)
RETURN VARCHAR2
IS
OUTPUT_STRING VARCHAR2(100);
DECRYPTED_RAW RAW (100);
KEY_BYTES_RAW RAW (32);
ENCRYPTION_TYPE PLS_INTEGER :=
DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
BEGIN
SELECT KEYCODE INTO KEY_BYTES_RAW FROM KEYINFOMTBL;
DECRYPTED_RAW := DBMS_CRYPTO.DECRYPT
(
SRC => INPUT_RAW,
TYP => ENCRYPTION_TYPE,
KEY => KEY_BYTES_RAW
);
OUTPUT_STRING := UTL_I18N.RAW_TO_CHAR (DECRYPTED_RAW, 'AL32UTF8');
RETURN OUTPUT_STRING;
END;
/
5.我現在要給出一個可以應用這個兩個加密和解密的小的例子,可以很明顯的看到是如何應用的
你可以通過這個sql語句看一下我們在KEYINFOMTBL表種存的那個字段值是什麼
select UTL_I18N.RAW_TO_CHAR (KEYCODE, 'AL32UTF8') from KEYINFOMTBL;
create table testpw
(
password raw(20)
)
/
使用插入的時候只要用 ENCRYPT() 就可以將你的字符串加密了
insert into testpw values ( ENCRYPT('nvgwngw383$') );
你可以通過這個sql語句看到加密以後的數據效果
select UTL_I18N.RAW_TO_CHAR (password, 'AL32UTF8') from testpw;
通過下面的sql語句就可以將數據進行解密處理
select DECRYPT(password) from testpw;
本文完成