使用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的目的,是為了調試方便,同時多提供一個知識點。