使用MD5編碼實現數據庫用戶密碼字段的加密
2024-07-21 02:37:57
供稿:網友
 
             
  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的目的,是為了調試方便,同時多提供一個知識點。