1. 程式人生 > 其它 >Oracle進行資料庫欄位內容加密和解密

Oracle進行資料庫欄位內容加密和解密

技術標籤:oracle

  1. 自定義函式的方式:
-- 加密函式
CREATE OR REPLACE function
	ds_func_encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
	v_text varchar2(4000);
	v_key varchar2(4000);
	v_enc varchar2(4000);
	raw_input RAW(20000) ;
	key_input RAW(1000) ;
	decrypted_raw RAW(20000);
	v_ErrorText varchar2(500);
begin
	if(p_text is
null or p_text = '' ) then return ''; end if; if(lengthb(p_key)<8) then v_key := lpad(p_key,8,'0'); else v_key := p_key; end if; 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(v_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; exception when others then --自定義異常,並捕獲輸出異常資訊
--v_ErrorText := 'dserror:'||SUBSTR(SQLERRM, 1, 200); --return v_ErrorText; --直接丟擲異常 RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM, TRUE); end; -- 呼叫加密函式 select ds_func_encrypt_des('我愛中國I Love China 521','ECMPMAIN') from dual; -- 解密函式 CREATE OR REPLACE function ds_func_decrypt_des(p_text varchar2, p_key varchar2) return varchar2 is v_text varchar2(4000); v_key varchar2(4000); p_text_raw RAW(20000); p_key_raw RAW(20000); v_text_raw RAW(20000); v_ErrorText varchar2(500); begin if(p_text is null or p_text = '' ) then return ''; end if; if(lengthb(p_key)<8) then v_key := lpad(p_key,8,'0'); else v_key := p_key; end if; p_text_raw := HEXTORAW(p_text); p_key_raw := UTL_I18N.STRING_TO_RAW(v_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)); exception when others then --自定義異常,並捕獲輸出異常資訊 --v_ErrorText := 'dserror:'||SUBSTR(SQLERRM, 1, 200); --return v_ErrorText; --直接丟擲異常 RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM, TRUE); end; -- 呼叫解密函式 select ds_func_decrypt_des('60B593D9FA437A6EBCD6E84C2F12AAD22B7482E483DD2167B022FEF426D1D9CC','ECMPMAIN') from dual; -- 加密和解密函式都有兩個入參 p_text:加密欄位 p_key:加密金鑰(防止加密被容易破解,最短8位 可以通過length函式判斷然後進行lpad/rpad補齊,不過要記住,否則無法解密) -- 查詢Oracle版本 SELECT * FROM PRODUCT_COMPONENT_VERSION; -- 刪除加密函式 DROP FUNCTION DS_FUNC_ENCRYPT_DES; -- 刪除解密函式 DROP FUNCTION DS_FUNC_DECRYPT_DES;
  1. SQL的方式:
2.1 不使用金鑰key--加密SQL
select select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('我愛中國I Love China 521'))) from dual;
--解密SQL
select utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw('5oiR54ix5Lit5Zu9SSBMb3ZlIENoaW5hIDUyMQ=='))) from dual;
2.2 使用金鑰key--加密SQL
select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('ECMP' ||'我愛中國I Love China 521'))) from dual;
--解密SQL
select substr((select utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw('RUNNUOaIkeeIseS4reWbvUkgTG92ZSBDaGluYSA1MjE='))) from dual), LENGTH('ECMP')+1) from dual;