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