Oracle之加密算法
Oracle中的加密算法
加密算法概述
在介绍oracle中的加密算法之前,⼤家⾸先要对加密算法有⼀个⼤致的了解,懂得为什么加密,如何加密,加密算法的分类。
为什么加密
我们的系统中会存在⼀些极其敏感的数据,这些数据涉及到公司的机密。⾃然这些是不想让其他公司或竞争对⼿看到的,所以就需要⼀种⽅法来对数据进⾏“包装”。包装后的数据就象是增加了⼀层坚固的外壳,其他⼈很难看到壳内的敏感数据。这种“包装”就是加密。可见加密对于敏感数据的重要意义。
如何加密
所谓“加密”,就是对原内容为明⽂的⽂件或数据按某种算法进⾏处理,使其成为不可读的代码,经过这样处理的数据通常称为“密⽂”,密⽂只能在经过相对应的反向算法处理后才能恢复原来的内容,通过这样的途径来达到保护数据不被⾮法⼈窃取、阅读的⽬的,⽽将该编码信息转化为其原来数据的过程,就是“解密”。
最简单的加密就是通过改变明⽂中的字符位置来实现。举个简单的例⼦,⽐如说welcome这个字符串,我通过交换相邻位置的字符位置来实现最简单的加密。加密后的字符串变成ewclmoe。这是简单的加密⽅式,可以说没有任何的安全性,但是可以说明加密的原理,就是通过⼀定的处理让明⽂转变成很难读懂的密⽂。
现在流⾏的加密算法是利⽤⼀复杂的密钥通过某种加密的算法将明⽂转化为密⽂。既然是进⾏加密,那么和加密相关的密钥和加密算法⾃然也是需要保护的。算法的保密性可以分为基于保持算法的秘密和基于保持密钥的秘密。
如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。⼤的或经常变换的⽤户组织不能使⽤它们,因为每有⼀个⽤户离开这个组织,其它的⽤户就必须改换另外不同的算法。如果有⼈⽆意暴露了这个秘密,所有⼈都必须改变他们的算法。
  更糟的是,受限制的密码算法不可能进⾏质量控制或标准化。每个⽤户组织必须有他们⾃⼰的唯⼀算法。这样的组织不可能采⽤流⾏的硬件或软件产品。但窃听者却可以买到这些流⾏产品并学习算法,于是⽤户不得不⾃⼰编写算法并予以实现,如果这个组织中没有好的密码学家,那么他们就⽆法知道他们是否拥有安全的算法。
⽽基于保持密钥的算法则具有更⼤的灵活性和实⽤习性。这些算法的安全性都基于密钥的安全性;⽽不是基于算法的细节的安全性。这就意味着算法可以公开,也可以被分析,可以⼤量⽣产使⽤算法的产品,即使偷听者知道你的算法也没有关系;如果他不知道你使⽤的具体密钥,他就不可能阅读你的消息。
 演⽰如下,密钥⽤K表⽰。K可以是很多数值⾥的任意值。密钥K的可能值的范围叫做密钥空间。加密和解密运算都使⽤这个密钥(即运算都依赖于密钥,并⽤K作为下标表⽰),这样,加/解密函数现在变成:
  EK(M)=C
  DK(C)=M.
  这些函数具有下⾯的特性:
  DK(EK(M))=M.
  有些算法使⽤不同的加密密钥和解密密钥,也就是说加密密钥K1与相应的解密密钥K2不同,在这种情况下:
  EK1(M)=C
  DK2(C)=M
  DK2 (EK1(M))=M
加密算法的分类
1,基于“消息摘要”算法
“消息摘要”(Message Digest)是⼀种能产⽣特殊输出格式的算法,这种加密算法的特点是⽆论⽤户输⼊什么长度的原始数据,经过计算后输出的密⽂都是固定长度的,这种算法的原理是根据⼀定的运算规则对原数据进⾏某种形式的提取,这种提取就是“摘要”,被“摘要”的数据内容与原数据有密切联系,只要原数据稍有改变,输出的“摘要”便完全不同,因此基于这种原理的算法便能对数据完整性提供较为健全的保障。但是,由于输出的密⽂是提取原数据经过处理的定长值,所以它已经不能还原为原数据,即消息摘要算法是“不可逆”的,理论上⽆法通过反向运算取得原数据内容,因此它通常只能被⽤来做数据完整性验证,⽽不能作为原数据内容的加密⽅案使⽤,否则谁也⽆法还原。尽管如此,“消息摘要”算法还是为密码学提供了健全的防御体系,因为连专家也⽆法根据拦截到的密⽂还原出原来的密码内容。因为这个特性,“消息摘要”算法产⽣的密⽂被称为“摘要”。
如今常⽤的“消息摘要”算法经历了多年验证发展⽽保留下来的强者,分别是MD2、MD4、MD5、SHA、SHA-1/256/383/512等,其中最⼴泛应⽤的是基于MD4发展⽽来的MD5算法。
注:在oracle的加密包dbms_obfuscation_toolkit提供了MD5算法的调⽤过程。就象上⾯说明的那样,MD5这种基于消息摘要的加密算法只是单向的,是不可逆的,只能作为⼀种数据完整性的严整⽅法。另外⼀点,⼀般来说这类算法都是不需要密钥的。
2,“对称/⾮对称密钥”加密算法
由于“消息摘要”算法产⽣的数据只能作为⼀种⾝份验证的凭证来使⽤,如果我们要对整个⽂档数据进⾏加密,就不能采⽤这种“不可逆”的算法了,因此“密钥”算法(Key Encoding)的概念被提出,与开头提到的智⼒题类似,此类算法通过⼀个被称为“密钥”的凭据进⾏数据加密处理,接收⽅通过加密时使⽤的“密钥”字符串进⾏解密,即双⽅持有的“密码”相同(对称)。如果接收⽅不能提供正确的“密钥”,解密出来的就不是原来的数据了。
以上是“对称密钥”的概念,那么“⾮对称密钥”⼜该怎么理解呢?有⼈⽤邮箱作为⽐喻,任何⼈都可以从邮箱的信封⼈⼝塞进信件,但是取信的权⼒却仅仅在于持有邮箱钥匙的⼈的⼿上。这个众⼈皆知的信封⼊⼝就是“公钥”(Public Key),⽽你持有的邮箱钥匙就是“私钥”(Private Key),这种算法规定,对⽅给你发送数据前,可以⽤“公钥”加密后再发给你,但是这个“公钥”也⽆法解开它⾃⼰加密的数据,即加密过程是单向的,这样即使数据被途中拦截,⼊侵者也⽆法对其进⾏破解,能还原数据内容的只有“私钥”的持有者,这就是“⾮对称密钥”加密算法,也称为“公共密钥算法”,这两者均建⽴在PKI验证体系结构上。
基于“对称密钥”的加密算法有DES、TripleDES、RC2、RC4、RC5和Blowfish等;基于“⾮对称密钥”的加密算法有RSA、Diffie-Hellman等。
注:在oracle的加密包dbms_obfuscation_toolkit提供了DES、TripleDES(3-DES)的算法。
Oracle中的加密算法
Oracle的加密包dbms_obfuscation_toolkit提供三种加密的算法,其中包括基于“消息摘要”的算法MD5,还有对称的加密算法DES和DES3。
1,MD5
前⾯已经介绍过了MD5不能作为常规的加密使⽤,他只能作为⼀种校验数据完整性的⽅法。
1.加密包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可以作为⼀种数据校验的⽅法,如果数据量⽐较⼤的话,那么执⾏的效率就是个需要考虑的问题了。
(5) D BMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使⽤select DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc') a from Dual时,却有错误提⽰,看来该函数只能直接在程序包中调⽤,不能直接应⽤于SELECT语句。
2.Utl_Raw.Cast_To_Raw
DBMS_OBFUSCATION_TOOLKIT.MD5返回的字串,是RAW类型,要正确显⽰,需要经过Utl_Raw.Cast_To_Raw转换
1、直接调⽤
declare
v2 varchar2(32);
begin
v2 := Utl_Raw.Cast_To_Raw(sys.dbms_obfuscation_toolkit.md5(input_string => '111'));
dbms_output.put_line(v2);
end;
注意:可以在存储过程中直接调⽤,如果要嵌套调⽤md5时,记得每次调⽤后都⽤Utl_Raw.Cast_To_Raw进⾏转换,否则最后出来的结果是错误的。
2、构造函数后,再调⽤
CREATE OR REPLACE FUNCTION MD5(
passwd IN VARCHAR2)
RETURN VARCHAR2
IS
retval varchar2(32);
retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) ;
RETURN retval;
END;
调⽤md5函数⽰例:
select md5(1) from dual
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
oracle 时间转换
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
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Éš©”

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。