mysql字段加密存储过程_Oracle MD5加密的存储过程的实现 (转Zhou JianGuo)

1 前言

众所周知,MD5是目前应用最多的密码保护方法,该编码传说为不可逆加密编码<也就是说,永运无法倒算原码>。

使用MD5加密用户的操作密码,可以有效防止系统维护人员直接进入数据库时出现系统安全漏洞<直接使用SELECT语句查询,将用户密码字段只能看到乱码,或者"****">

2 技术点

2.1 DBMS_OBFUSCATION_TOOLKIT.MD5

DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc') a from Dual时,却有错误提示,看来该函数只能直接在程序包中调用,不能直接应用于SELECT语句。

2.2 Utl_Raw.Cast_To_Raw

DBMS_OBFUSCATION_TOOLKIT.MD5返回的字串,是RAW类型,要正确显示,需要经过Utl_Raw.Cast_To_Raw转换<该知识点则之前论坛中NICK511贴子中获得>

3 实例演练

3.1 测试环境

使用Scott/Tiger@YourDBName

--3.2.1 创建数据表

Drop Table Test_User;

CREATE TABLE Test_User (

UserName VARCHAR2(30) NOT NULL,

Password VARCHAR2(2000) NOT NULL

)

/

--3.2.2 创建程序包

Create Or Replace Package Test_MD5 AS

Function FN_GetMD5(P_Str In VarChar2)

Return VarChar2;

Function FN_CheckUser

(P_UserName In VarChar2

,P_Password In VarChar2)

Return Number;

End;

/

CREATE OR REPLACE PACKAGE BODY Test_MD5 AS

FUNCTION FN_GetMD5 (P_Str IN VARCHAR2)

RETURN VARCHAR2 AS

BEGIN

RETURN DBMS_OBFUSCATION_TOOLKIT.MD5(

input_string => Upper(P_Str));

END;

Function FN_CheckUser

(P_UserName IN VARCHAR2

,P_Password IN VARCHAR2)

Return Number

Is

L_Password VarChar2(2000);

BEGIN

SELECT

Utl_Raw.Cast_To_Raw(Password)

INTO

L_Password

FROM

Test_User

WHERE

Upper(UserName) = UPPER(P_UserName);

If Utl_Raw.Cast_To_Raw(FN_GetMD5(P_Password))=L_Password Then

Return 1;

Else

Return 0;

End If;

EXCEPTION

WHEN NO_DATA_FOUND THEN

Return 0;

END;

End;

/

--3.3 测试

Delete Test_User;

Insert Into Test_User Values('A',Test_MD5.FN_GetMD5('aa'));

Insert Into Test_User Values('B',Test_MD5.FN_GetMD5('bb'));

Commit;

Select Test_MD5.FN_CheckUser('a','aa') From Dual;

Select Test_MD5.FN_CheckUser('a','bb') From Dual;

注:对MD5编码的比较,可以不需要经过Utl_Raw.Cast_To_Raw转换。此处使用Utl_Raw.Cast_To_Raw的目的,是为了调试方便,同时多提供一个知识点

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7104/viewspace-133939/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值