Oracle 函數(shù)加密

在oracle中,可以使用其自帶的加密函數(shù),使得應(yīng)用部分不必關(guān)心加密的細(xì)節(jié),只需要在sql語(yǔ)句中對(duì)對(duì)應(yīng)的字段進(jìn)行加解密。

Oracle支持AES和DES等加密方法,AES加密方法相對(duì)比較安全,但是des基本可以滿足要求。

Oracle加密存儲(chǔ)過程如下:


CREATE OR REPLACE function?

encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is

v_text varchar2(4000);

v_enc varchar2(4000);

raw_input RAW(128) ;

key_input RAW(128) ;

decrypted_raw RAW(2048);

begin

dbms_output.put_line(p_text);

v_text := rpad( p_text, (trunc(lengthb(p_text)/8)+1)*8, chr(0));

dbms_output.put_line(v_text);

raw_input := UTL_I18N.STRING_TO_RAW(v_text,'ZHS16GBK');

key_input := UTL_I18N.STRING_TO_RAW(p_key,'ZHS16GBK');

dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,key => key_input,encrypted_data =>decrypted_raw);

v_enc := rawtohex(decrypted_raw);

dbms_output.put_line(v_enc);

return v_enc;

end;

/


對(duì)應(yīng)的解密存儲(chǔ)過程如下:

CREATE OR REPLACE function WPGL.decrypt_des(p_text varchar2, p_key varchar2) return varchar2 is

p_text_raw RAW(2000);

p_key_raw RAW(2000);

v_text_raw RAW(2000);

v_text varchar2(2000);

begin

if(p_text? is null or p_text = '' )

then return '';

end if;

p_text_raw := HEXTORAW(p_text);

p_key_raw := UTL_I18N.STRING_TO_RAW(p_key, 'ZHS16GBK');

dbms_obfuscation_toolkit.DESDECRYPT(input => p_text_raw, key =>p_key_raw, decrypted_data=> v_text_raw);

v_text := UTL_I18N.RAW_TO_CHAR(v_text_raw, 'ZHS16GBK');

dbms_output.put_line(v_text);

return rtrim(v_text,chr(0));

end;

/


加密函數(shù)中,用到?lengthb 而不是length,是防止中文與ase碼長(zhǎng)度不一,不然,加密時(shí)會(huì)丟失部分中文信息。

解密函數(shù) 中,最后return時(shí),不是直接把字符串返回去,而是使用?rtrim(v_text,chr(0)) 方法,如果直接返回字符串的話,正常的顯示是沒有問題的,但是后面會(huì)有不可顯示字符 asc碼為0的情況,這樣就加解密不可互逆。

純屬學(xué)習(xí),錯(cuò)誤之處,請(qǐng)指出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容