用Oracle的加密包进行des3算法加密

    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;
/

留言 (2)

DES3是什么时候的算法?以前在学校的时候分析过DES算法,64位加密的(好像是56位密钥加8位的校验),不是很安全,用差分分析和线性分析都比较容易解密。现在应该被AES替代了吧,当时我们的作业就是做其中一个候选算法的加密程序。我看10G的RMAN有AES128加密这一项。

最好对KEY也进行一次加密
这样即使拥有查询的KEY也无法对数据进行解密
查询KEY===》加密KEY===》解密数据

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • I like collecting stamps.
  • 我喜欢收集邮票.
  • I prefer tea to coffee.
  • 和咖啡相比, 我更喜欢茶.
  • What do you dislike most about this movie?
  • 这部电影你最不喜欢什么?
  • I would rather sleep than watch this movie.
  • 我情愿睡觉也不看这部电影.
  • You should take the advice of your teacher.
  • 你应该听老师的话?