Oracle中的bms_obfuscation_toolkit包定义了几种加密算法, 你可以用这个包来对需要的数据进行加密, 国外有人这样用的, 刚好那个库坏了向我求助, 所以我才知道. 对于这方面我们知道的实在有限.

    将两个过程(加密和解密)放在一个包中, 定义如下:

create or replace package mydes3 is
  function encrypt (p_input varchar2) return varchar2;
  function decrypt (p_input varchar2) return varchar2;
end;
/

    DES3算法要求输入的值的长度是8的整数倍, 因此在加密和解密过程中, 字符串后面会多出空格. 如下所示:

ASQL> SELECT mydes3.ENCRYPT('ABCDE') ENC_STR FROM DUAL;

ENC_STR
-------
?oa?[Z?

1 rows returned.

ASQL> SELECT mydes3.DECRYPT(mydes3.ENCRYPT('ABCDE')) enc_str from dual;

ENC_STR
--------
ABCDE

1 rows returned.

ASQL> SELECT LENGTH(mydes3.DECRYPT(mydes3.ENCRYPT('ABCDE'))) STRLEN FROM DUAL;

STRLEN
------
     8

1 rows returned.

    为了安全起见, 你可以将PL/SQL代码用Wrap来加密. 下面附上Package Body部份代码:

create or replace package body mydes3 is

  gk1  varchar2 (1000) := 'This is my DES3 key, make it longer!!';

  function encrypt (p_input varchar2) return varchar2 is
    l_input   varchar2 (1000);
    l_key     varchar2 (100) := gk1;
    l_result  varchar2 (1000);
  begin
    if p_input is null then
       return null;
    else
       -- pad to multiple of 8 chars;
       l_input := rpad (p_input, (trunc(length(p_input)/8)+1)*8, ' ');
       dbms_obfuscation_toolkit.des3encrypt (
            input_string      => l_input,
            key_string        => l_key,
            encrypted_string  => l_result,
            which             => 1);
       return l_result;
     end if;
   end encrypt;

   function decrypt (p_input varchar2) return varchar2 is
     l_input   varchar2 (1000);
     l_key     varchar2 (100) := gk1;
     l_result  varchar2 (1000);
   begin
     if p_input is null then
        return null;
     else
        l_input := p_input;
        dbms_obfuscation_toolkit.des3decrypt (
            input_string      => l_input,
            key_string        => l_key,
            decrypted_string  => l_result,
            which             => 1);
            return l_result;
     end if;
   end decrypt ;

end mydes3;
/