Oracle 資料庫內建 DBMS_OBFUSCATION_TOOLKIT 套件提供 MD5 雜湊功能,但直接呼叫有諸多限制。本文深入解析核心技術細節,提供可直接部署的自訂函數範例,解決 SQL 語句中直接使用的難題。
此函數回傳 RAW 型別資料,且無法直接在 SQL 查詢中呼叫,僅能在 PL/SQL 區塊或預存程序中使用。嘗試直接執行 SELECT DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => 'abc') FROM dual 會報錯。
MD5 運算結果為 RAW 型別,需搭配 UTL_RAW.CAST_TO_RAW 或 RAWTOHEX 轉換為可讀字串。嵌套呼叫時,每層呼叫後都必須轉換,否則最終結果錯誤。
DECLARE
v_hash VARCHAR2(32);
BEGIN
v_hash := UTL_RAW.CAST_TO_RAW(
SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => '111')
);
DBMS_OUTPUT.PUT_LINE(v_hash);
END;
/
CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2) RETURN VARCHAR2 IS
retval VARCHAR2(32);
BEGIN
retval := UTL_RAW.CAST_TO_RAW(
DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)
);
RETURN retval;
END;
/
使用方式:
SELECT MD5('1') FROM dual;
CREATE OR REPLACE FUNCTION MD5HASH(str IN VARCHAR2) RETURN VARCHAR2 IS
v_checksum VARCHAR2(32);
BEGIN
v_checksum := LOWER(
RAWTOHEX(
UTL_RAW.CAST_TO_RAW(
SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => str)
)
)
);
RETURN v_checksum;
EXCEPTION
WHEN NO_DATA_FOUND THEN RETURN NULL;
WHEN OTHERS THEN RAISE;
END MD5HASH;
/
-- Oracle 端建立函數(回傳大寫)
CREATE OR REPLACE FUNCTION MD5(vin_string IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN UPPER(
DBMS_OBFUSCATION_TOOLKIT.MD5(
input => UTL_RAW.CAST_TO_RAW(vin_string)
)
);
END MD5;
/
最佳實踐原則:
UPDATE users SET password = MD5(password);