Oracle中的MD5加密

作者:iamlaosong

因为要用到MD5加密,所以在网上搜了一下相关资料,并进行仔细研究。其核心就是MD5编码的数据包函数:DBMS_OBFUSCATION_TOOLKIT.MD5,这里涉及到RAW类型,其实就是原始的代码值。

MD5加密的结果就是16个byte值,也就是是RAW类型,是显示不出来的,要正确显示,需要经过Utl_Raw.Cast_To_Raw转换,这个函数的作用是将每个字节的值用十六进制字符表示出来。为了说明清楚,举例如下:假定一个字节的二进制值是0100 0001,十六进制表示就是41(这个值实际上就是字母“A”的ASCII代码值,硬要显示,还是可以显示出A来的,但有些非ASCII码的值就显示不出来了,比如1100 0001,十六进制表示就是C1),那么经过Utl_Raw.Cast_To_Raw转换后就变成了字符串“41”。

Utl_Raw.Cast_To_Raw函数也可以转换字符串,也就是将字符串的代码值(应该是oracle字符集内码)以十六进制表示出来,例如:

utl_raw.cast_to_raw('iamlaosong')的结果是:69616D6C616F736F6E67

utl_raw.cast_to_raw('我是老宋')的结果是:CED2CAC7C0CFCBCE

16进制字符串表达的raw值也可以转换成其代表的字符串:

utl_raw.cast_to_varchar2('69616D6C616F736F6E67')的结果是:iamlaosong

utl_raw.cast_to_varchar2('CED2CAC7C0CFCBCE')的结果是:我是老宋

注意:上面的raw值是用16进制的字符串表示的(raw值总要有一种表达形式)。

上面的功能也可以用utl_i18n包函数,效果是一样的:

select utl_i18n.string_to_raw('我是老宋') from dual;

select utl_i18n.raw_to_char('CED2CAC7C0CFCBCE') from dual;

==================================================

 MD5包函数的使用方法如下:

1、直接调用

declare

v2 varchar2(32);

begin

v2 := Utl_Raw.Cast_To_Raw(sys.dbms_obfuscation_toolkit.md5(input_string => '123456'));

dbms_output.put_line(v2);

end;

显示结果:E10ADC3949BA59ABBE56E057F20F883E

这个字符串实际上是16个字节的值用十六进制表示的结果,其中的字符是0-9和A-F,正因为如此,其中的字母大小写是无关的,都表示同一个值。

再举个例子,字符串:iamlaosong,加密后显示的结果:7E0FB497D8C4515157DDEAFC2E511290,很显然,也是16个字节的十六进制表示。

至于加密结果的比较,还是转换成字符串后较为直观,比较起来也方便一些。


2、构造函数后,再调用

CREATE OR REPLACE FUNCTION MD5(

passwd IN VARCHAR2)

RETURN VARCHAR2

IS

retval varchar2(32);

BEGIN

retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) ;

RETURN retval;

END;

 

调用md5函数示例:

select md5('iamlaosong') from dual



  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle,可以使用DBMS_CRYPTO包函数来实现MD5加密和解密。 MD5加密的步骤如下: 1. 将原始数据转换成二进制数据。 2. 对二进制数据进行填充,使其长度为512的整数倍。 3. 将填充后的数据分成512位的数据块,每个数据块包含16个32位的字。 4. 对每个数据块进行4轮循环运算,每轮运算包含16个步骤,每个步骤都是基于位运算和非线性函数计算得到的。 5. 将最后一个数据块的结果进行累加,并输出128位的MD5值。 下面是使用DBMS_CRYPTO包函数实现MD5加密和解密的示例: ``` -- MD5加密 DECLARE l_text VARCHAR2(32767) := 'hello world'; l_key RAW(2000) := UTL_RAW.CAST_TO_RAW('secret key'); l_hash RAW(16); BEGIN l_hash := DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(l_text), DBMS_CRYPTO.HASH_MD5); DBMS_OUTPUT.PUT_LINE('MD5 hash of ' || l_text || ': ' || UTL_RAW.CAST_TO_VARCHAR2(l_hash)); END; -- MD5解密(无法解密) DECLARE l_text VARCHAR2(32767) := 'hello world'; l_key RAW(2000) := UTL_RAW.CAST_TO_RAW('secret key'); l_hash RAW(16); l_decrypt RAW(2000); BEGIN l_hash := DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(l_text), DBMS_CRYPTO.HASH_MD5); DBMS_OUTPUT.PUT_LINE('MD5 hash of ' || l_text || ': ' || UTL_RAW.CAST_TO_VARCHAR2(l_hash)); -- MD5是不可逆的加密算法,无法解密。 END; ``` 需要注意的是,MD5是一种不可逆的加密算法,无法对其进行解密。因此,上面的MD5解密示例实际上是无法解密的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值