Oracle MD5加密的存储过程的实现

    技术2022-05-11  49

    /*

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


    最新回复(0)