首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 資料加密實作:使用 DBMS_OBFUSCATION_TOOLKIT 進行 MD5 雜湊

     編輯:Oracle 資料庫相關知識

前言

資料庫中儲存敏感資料(如密碼)時,明文儲存極具風險。MD5 作為單向雜湊演算法,雖已不建議用於高安全性場景,但在舊系統相容或低敏感度資料保護上仍常見。Oracle 內建 DBMS_OBFUSCATION_TOOLKIT 套件提供 MD5 運算功能,本文示範如何封裝為可重複使用的 PL/SQL 套件。

技術重點

  1. DBMS_OBFUSCATION_TOOLKIT.MD5:僅能在 PL/SQL 區塊中呼叫,不可直接用於 SQL 查詢
  2. UTL_RAW.CAST_TO_RAW / CAST_TO_VARCHAR2:RAW 型別與字串互轉
  3. UTL_ENCODE.BASE64_ENCODE:Base64 編碼(本文範例未直接使用,但常搭配傳輸)

完整套件實作碼

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
    -- 輸入轉大寫後計算 MD5,回傳 RAW,隱性轉為 VARCHAR2
    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(1000);
  begin
    select password into l_password
    from test_user
    where upper(username) = upper(p_username)
      and password = test_md5.fn_getmd5(p_password);

    if l_password is null then
      return 0;  -- 密碼錯誤
    else
      return 1;  -- 驗證成功
    end if;
  exception
    when NO_DATA_FOUND then
      return 3;  -- 使用者不存在
  end;
end;
/

測試腳本

-- 清空並建立測試資料
delete from 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 * from test_user;

-- 驗證登入
select test_md5.fn_checkuser('a','aa') from dual;  -- 回傳 1
select test_md5.fn_checkuser('a','bb') from dual;  -- 回傳 0

-- 直接比對雜湊
select * from test_user t where t.password = test_md5.fn_getmd5('aa');

安全性提醒

  • MD5 已知存在碰撞攻擊,不建議用於新系統密碼儲存
  • 現代應用請改用 DBMS_CRYPTO 的 SHA-256/512 或 PBKDF2/BCrypt/Argon2(需外部程式實作)
  • 生產環境務必加鹽,避免彩虹表攻擊

延伸閱讀

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved