使用MD5编码实现数据库用户密码字段的加密

王朝other·作者佚名  2008-05-19
宽屏版  字体: |||超大  

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的目的,是为了调试方便,同时多提供一个知识点。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有