--加密字符串 create or replace function des3_enc ( input varchar2 ) return varchar2 is i_data varchar2(128); v_in varchar2(255); i_key varchar2(128); raw_input RAW(128) ; key_input RAW(128) ; decrypted_raw RAW(2048); begin --判断是否为空 if input is null then return null; else if input='' then return ''; end if; end if; --key,至少要16位 i_key:= 'abcdef0123456789'; --要加密信息 i_data:= input; v_in := rpad(i_data,(trunc(length(i_data)/8)+1)*8,chr(0)); --字符转成RAW raw_input := UTL_RAW.CAST_TO_RAW(v_in); key_input := UTL_RAW.CAST_TO_RAW(i_key); dbms_obfuscation_toolkit.DES3Encrypt(input => raw_input,key => key_input,encrypted_data => decrypted_raw); --加密信息转成字符 return to_char(rawtohex(decrypted_raw)); end des3_enc;
--解密字符串 create or replace function des3_dec ( input varchar2 ) return varchar2 is i_data varchar2(2048); i_key varchar2(2048); v_in varchar2(2048); begin --判断是否为空 if input is null then return null; else if input='' then return ''; end if; end if; --key,至少要16位 i_key:= 'abcdef0123456789'; --要解密的信息 i_data := input; dbms_obfuscation_toolkit.DES3DECRYPT(input_string => UTL_RAW.CAST_TO_varchar2(i_data),key_string => i_key,decrypted_string=> v_in); v_in := rtrim(v_in,chr(0)); --返回解密信息 return v_in; end des3_dec;
--触发器,用于在增加、修改时自动加密字段,查询时需要手动调用解密函数进行解密。 create or replace trigger enc_trigger before insert or update on scott.dept for each row begin select des3_enc(:new.dname) into :new.dname from dual; end enc_trigger;
--使用示例: insert into dept values (50,'test','test'); commit; select des3_dec(dname) from dept where deptno=50;