oracle中的加密算法

[复制链接]
查看11 | 回复9 | 2007-8-14 09:10:50 | 显示全部楼层 |阅读模式
Oracle中的加密算法
Oracle的加密包dbms_obfuscation_toolkit提供三种加密的算法,其中包括基于“消息摘要”的算法MD5,还有对称的加密算法DES和DES3。
1,MD5
前面已经介绍过了MD5不能作为常规的加密使用,他只能作为一种校验数据完整性的方法。
加密包dbms_obfuscation_toolkit中提供了四个关于MD5算法的过程或者函数,两个是操作RAW型数据的,另外两个是操作VARCHAR2。下面主要介绍下对VARCHAR2进行加密的MD5过程PROCEDURE MD5。
PROCEDURE MD5
Argument Name
Type
In/Out Default?
------------------------------ ----------------------- ------ --------
INPUT_STRING
VARCHAR2
IN
CHECKSUM_STRING
VARCHAR2(16)
OUT
其中参数INPUT_STRING为预加密的输入字符串,CHECKSUM_STRING为加密后的输出字符串。
参考代码如下:
例子1:
SQL> variable n_in varchar2(100)
SQL>variable n_out varchar2(100)
SQL> exec :n_in := 'this is a jok!'
SQL> exec dbms_obfuscation_toolkit.MD5(INPUT_STRING => :n_in,CHECKSUM_STRING => :n_out);
PL/SQL procedure successfully completed.
SQL> print n_out
N_OUT
----------------
?'Ö??å,(3Ð ÜY
SQL> select length(:n_out) from dual;
LENGTH(:N_OUT)
--------------

16
例子2:
SQL> exec :n_in := 'a';
SQL> exec dbms_obfuscation_toolkit.MD5(INPUT_STRING => :n_in,CHECKSUM_STRING => :n_out);
PL/SQL procedure successfully completed.
SQL> print n_out
N_OUT
-------------------------------------------------
Áu¹Àñ¶¨1Ã?âiw&a
SQL> select length(:n_out) from dual;
LENGTH(:N_OUT)
--------------

16
例子3:
SQL> exec :n_in := 'a';
SQL> exec dbms_obfuscation_toolkit.MD5(INPUT_STRING => :n_in,CHECKSUM_STRING => :n_out);
PL/SQL procedure successfully completed.
SQL> print n_out
N_OUT
-------------------------------------------------
Áu¹Àñ¶¨1Ã?âiw&a
SQL> select length(:n_out) from dual;
LENGTH(:N_OUT)
--------------

16
说明:
(1)
对于例子1我加密的字符串长度大概是15,而例子2中我加密的字符串长度为1,可见MD5对加密字符串的长度是没有限制,当然了VARCHAR2自身会有4000的限制。
(2)
从3个例子的结果可以看出来,无论加密前的字符串长度为多少,加密后的字符串长度均为16。这个是由MD5的算法决定的,这也是为什么MD5仅仅是“摘要”的体现,他是不可逆的。
(3)
例子2和例子3看起来完全一样,这个是很好理解的,同样的输入当然得到同样的结果了。这也是MD5可以作为一种数据检验方法的基础,同样的输入同样的输出。反过来呢,同样的输出是否代表同样的输入呢?总有一些例外的,不过几率是极小的,比连续3期都中双色球头奖还要难。
(4)
MD5可以作为一种数据校验的方法,如果数据量比较大的话,那么执行的效率就是个需要考虑的问题了。
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
2,DES
DES是一种较为强壮的数据加密算法,他的算法是公开的,全部的保密性都在于密钥的保密性上。所以对于DES(包括DES)来说一个复杂的密钥是必须的,简单的密钥对于那些黑客来说形同虚设。现在的机器性能相比原来有了极大的提高,这也给暴力破解提供的物质上的准备。只要有足够的时间,一切密文都会被破解的。我们能做得就是采用极其复杂的密钥,将这个破解的时间往后推100年,推1000年,甚至10000年,让破解密文后得到的回报远远小于破解所需的花费。想一想,如果破解一个软件的注册码需要花费100万元,而购买注册证书的花费只有100元,大部分人都不会舍易取难了吧。当然了,也不排除那些极其执着的技术狂人,但毕竟是极小数。对于DES现在唯一的破解办法就是穷举法,如果一台计算机的速度是每一秒种检测一百万个密钥,那么它搜索完全部密钥就需要将近2285年的时间。那么那些技术狂人可以活这么久么?
Oracle的加密包dbms_obfuscation_toolkit中提供了实用与RAW类型的DES加密,也提供了VARCHAR2类型的DES加密。下面只介绍VARCHAR2类型的加密,RAW的与此类似。
PROCEDURE DESGETKEY
Argument Name
Type
In/Out Default?
------------------------------ ----------------------- ------ --------
SEED_STRING
VARCHAR2
IN
KEY
VARCHAR2
OUT
通过调用过程DESGETKEY可以产生一个相对复杂的密钥。其中参数SEED_STRING是产生密钥需要的种子,KEY为系统产生的密钥字符串。
例子1:
SQL> variable n_seed varchar2(100)
SQL> variable n_key varchar2(100)
SQL> exec :n_seed := 'sun'
SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);
BEGIN dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key); END;
*
ERROR at line 1:
ORA-28237: seed length too short
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 3
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 25
ORA-06512: at line 1
例子2:
SQL> exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'
SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);
BEGIN dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key); END;
*
ERROR at line 1:
ORA-28237: seed length too short
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 3
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 25
ORA-06512: at line 1
例子3:
SQL>exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'
SQL>exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);
PL/SQL procedure successfully completed.
SQL> print n_key
N_KEY
-------------------------------------------------
Æs?[È*n
SQL> select length(:n_key) from dual;
LENGTH(:N_KEY)
--------------

8
例子4:
SQL>exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'
SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);
PL/SQL procedure successfully completed.
SQL>print n_key
N_KEY
-------------------------------------------------
©ÿëí?Jw
例子5:
SQL> exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'
SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);
PL/SQL procedure successfully completed.
SQL> print n_key
N_KEY
-------------------------------------------------
XEÉ?©”
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
PROCEDURE DESENCRYPT
Argument Name
Type
In/Out Default?
------------------------------ ----------------------- ------ --------
INPUT_STRING
VARCHAR2
IN
KEY_STRING
VARCHAR2
IN
ENCRYPTED_STRING
VARCHAR2
OUT
DESENCRYPT过程就是DES的加密过程。其中参数INPUT_STRING是需要加密的字符串,参数KEY_STRING是加密算法的密钥匙,而参数ENCRYPTED_STRING为得到的加密后的字符串。
例子1:
SQL> variable en_in varchar2(100)
SQL> variable en_key varchar2(100)
SQL> variable en_out varchar2(100)
SQL> exec :en_in := 'sunwg'
SQL> exec :en_key := '12345'
SQL> exec dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out);
BEGIN dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out); END;
*
ERROR at line 1:
ORA-28232: invalid input length for obfuscation toolkit
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 21
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 115
ORA-06512: at line 1
例子2:
SQL>exec :en_in := 'sunwgsun'
SQL>exec :en_key := '12345'
SQL> exec dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out);
BEGIN dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out); END;
*
ERROR at line 1:
ORA-28234: key length too short
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 21
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 115
ORA-06512: at line 1
例子3:
SQL> exec :en_in := 'sunwgsun'
SQL> exec :en_key := '12345678'
SQL> exec dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out);
PL/SQL procedure successfully completed.
SQL> print en_out
EN_OUT
-------------------------------------------------
6ð?ªä5Ù
SQL> select length(:en_out) from dual;
LENGTH(:EN_OUT)
---------------

8
例子4:
SQL> exec :en_in := 'sunwgsun'
SQL> exec :en_key := '123456789'
SQL> exec dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out);
PL/SQL procedure successfully completed.
SQL>print en_out
EN_OUT
-------------------------------------------------
6ð?ªä5Ù
SQL>select length(:en_out) from dual;
LENGTH(:EN_OUT)
---------------

8
例子5:
SQL> exec :en_in := 'sunwgsun'
SQL>exec :en_key := '12345678901234567890'
SQL>exec dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out);
PL/SQL procedure successfully completed.
SQL> print en_out
EN_OUT
-------------------------------------------------
6ð?ªä5Ù
SQL>select length(:en_out) from dual;
LENGTH(:EN_OUT)
---------------

8
例子6:
SQL> exec :en_in := 'sunwgsunwg'
SQL> exec :en_key := '12345678'
SQL> exec dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out);
BEGIN dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out); END;
*
ERROR at line 1:
ORA-28232: invalid input length for obfuscation toolkit
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 21
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 115
ORA-06512: at line 1
例子7:
SQL> exec :en_in := 'sunwgsunwgsunwgs'
SQL> exec :en_key := '12345678'
SQL>exec dbms_obfuscation_toolkit.DESENCRYPT(INPUT_STRING => :en_in,KEY_STRING => :en_key,ENCRYPTED_STRING => :en_out);
PL/SQL procedure successfully completed.
SQL> print en_out
EN_OUT
-------------------------------------------------
6ð?ªä5Ù ?õ©P‘ÏT£ SQL>select length(:en_out) from dual;
LENGTH(:EN_OUT)
---------------

16
说明:
(1)
从例子1和例子2可以看出输入的需要加密的字符串长度是有限制的,需要大于等于8的。那是不是所有大于8的都可以呢,不是的。从例子6可以看出长度是10也是不可以的,例子7说明长度是16是允许的。其实长度只要是8的倍数就可以,因为DES加密的第一步就是置位,置位的最少单位是64位,即8个字节。超过8个字符的也会被分割成多个长度为8的字符串进行处理。
(2)
关于加密密钥的长度大家都知道了,应该是不能小于8的,这点从例子2和例子3中也可以看出来。如果大于8呢,大于8也是允许的合法输入。可是从例子3,4,5可以看出来,密钥匙有效的只是前8个字符,后面的全部会被忽略的。所以超过8个字符的密钥也是没有意思的。从这里就可以体现出过程DESGETKEY的重要性了,他可以产生相对人为设置的更加复杂的密钥。
(3)
从例子3和例子7可以看出,加密后的字符串长度等于加密前的字符串长度,都是8的倍数。还是那句话,这是由DES的算法决定的。
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
PROCEDURE DESDECRYPT
Argument Name
Type
In/Out Default?
------------------------------ ----------------------- ------ --------
INPUT_STRING
VARCHAR2
IN
KEY_STRING
VARCHAR2
IN
DECRYPTED_STRING
VARCHAR2
OUT
过程DESDECRYPT是DES的解密过程,使用方法和注意事项都和加密过程类型,这里就不在详细说明了。
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
3,DES3
DES3的过程和函数与DES的基本一样,只不过有的函数或者过程可能会多两个参数一个是WHICH,还有一个是IV_STRING。这两个参数都有默认值的,调用的时候使用默认值就没有问题。WHICH的默认值是TwoKeyMode,而IV_STRING的默认值是NULL。至于两个参数的具体含义就不大清楚了,估计WHICH参数说明的是DES3的加密方式是采用2个密钥进行3次加密。
总结:
上面大概介绍了一下加密的基本知识和oracle中的加密包dbms_obfuscation_toolkit。在实际的工作中,那些敏感的数据是需要保护的,而加密技术就是一种很好的保护数据的方法。希望大家的数据都是安全的。
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
這個 應該頂一下
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
很祥細
學習了解一下
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
thanks, get a lot
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层
不错,学习!
回复

使用道具 举报

千问 | 2007-8-14 09:10:50 | 显示全部楼层


和不错哎
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行