要用到DECRYPT方法對數(shù)據(jù)解密和ENCRYPT方法加密
? ? 1.首先通過sys用戶登錄到oracle數(shù)據(jù)庫,因為我們要通過這個用戶來設(shè)置一些高級權(quán)限
? ? ? grant execute on DBMS_crypto to userName;
? ? 這句是為了能讓用戶使用dbms這個方法,能夠讓我們sql語句種直接簡單的調(diào)用就可以了,否則我們將無法使用加密和解密,數(shù)據(jù)庫也會報錯,不過我忘了是什么錯誤了,userName就是你通過程序訪問數(shù)據(jù)庫時的用戶名,
? ? ? 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語句建立表, 并給表插入一條數(shù)據(jù),注意字段的類型是raw型的,這個也是oracle數(shù)據(jù)庫種加密要用的字段類型。
? ? ? 3.就是要建立一個方法,要對數(shù)據(jù)進行加密處理了,這也是關(guān)鍵的一個部分,我以前在網(wǎng)上看到很多文章來說明這個過程,但試了很多都不好用,我現(xiàn)在給出的例子完全好用,這也是我現(xiàn)在做的項目中使用的
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;
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.我現(xiàn)在要給出一個可以應(yīng)用這個兩個加密和解密的小的例子,可以很明顯的看到是如何應(yīng)用的
你可以通過這個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語句看到加密以后的數(shù)據(jù)效果
select UTL_I18N.RAW_TO_CHAR (password, 'AL32UTF8') from testpw;
通過下面的sql語句就可以將數(shù)據(jù)進行解密處理
select DECRYPT(password) from testpw;