Oracle的AES加密与解密用法

--加密字符串
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;

猜你喜欢

转载自softlife.iteye.com/blog/1988052
今日推荐