SHA-1(UPPER(username) || password) — **無 Salt、大寫化用戶名**、單次 SHA-1,**極易建立 Rainbow Table**。研究者指出:**普通硬體、幾分鐘內即可破解大多數用戶密碼**。工具:orabf(Oracle Brute Force)、Cain & Abel、John the Ripper(支援 Oracle 10g 格式)。
| 版本 | 改進 | 狀態 |
|---|---|---|
| 10g R2 (10.2.0.4+) | 引入 **案例敏感密碼** (可選),但預設仍不敏感 | 補丁 |
| 11g R1 (11.1) | **預設啟用案例敏感**、SHA-1 + Salt (10 bytes)、支援 SEC_CASE_SENSITIVE_LOGON | 重大改進 |
| 11g R2 (11.2) | 新增 PASSWORD_VERSIONS 欄位 (10G/11G/12C),支援漸進式遷移 | 成熟 |
| 12c R1 (12.1) | **PBKDF2 (SHA-512, 4096 iterations)**、**強制案例敏感**、SEC_CASE_SENSITIVE_LOGON 參數廢除 | 現代標準 |
| 18c/19c/21c | 支援 **SCRAM-SHA-256/512**、EXCLUSIVE_MODE 禁用舊版驗證 | 最新 |
PASSWORD_VERIFY_FUNCTION 要求 **≥ 12 字元、含大小寫/數字/特殊符號**。PASSWORD_LIFE_TIME = 60 (天),強制定期輪換。FAILED_LOGIN_ATTEMPTS = 5, PASSWORD_LOCK_TIME = 1 (天)。SQLNET.ENCRYPTION_SERVER = REQUIRED, SQLNET.ENCRYPTION_TYPES_SERVER = (AES256) — 防止傳輸中竊聽雜湊。AUDIT SESSION WHENEVER NOT SUCCESSFUL; 監控暴力嘗試。ALTER USER scott ACCOUNT LOCK; 等。
-- 1. 確認密碼版本 (應為 12C)
SELECT username, password_versions FROM dba_users WHERE account_status = 'OPEN';
-- 2. 僅允許 12C 驗證 (禁用 10G/11G 回退)
ALTER SYSTEM SET ALLOWED_LOGON_VERSION_SERVER = 12C SCOPE=SPFILE;
-- 12c 預設 12C,19c 可設 12C/18C
-- 3. 密碼驗證函數 (範例)
CREATE OR REPLACE FUNCTION verify_complex (
username VARCHAR2, password VARCHAR2, old_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
IF LENGTH(password) < 12 THEN RAISE_APPLICATION_ERROR(-20001, '密碼至少 12 字元'); END IF;
IF NOT REGEXP_LIKE(password, '[A-Z]') THEN RAISE_APPLICATION_ERROR(-20002, '需含大寫'); END IF;
IF NOT REGEXP_LIKE(password, '[a-z]') THEN RAISE_APPLICATION_ERROR(-20003, '需含小寫'); END IF;
IF NOT REGEXP_LIKE(password, '[0-9]') THEN RAISE_APPLICATION_ERROR(-20004, '需含數字'); END IF;
IF NOT REGEXP_LIKE(password, '[!@#$%^&*]') THEN RAISE_APPLICATION_ERROR(-20005, '需含特殊符號'); END IF;
RETURN TRUE;
END;
/
-- 套用至 Profile
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION verify_complex;
**Oracle 10g/9i 密碼雜湊機制在現代標準下極度脆弱**。**唯一徹底解法:升級至 12c+ 並啟用 12C/18C 專用驗證**。舊版環境必須疊加 **長密碼、短壽命、帳號鎖定、網路加密、稽核** 多層防禦,並規劃遷移時間表。資料庫安全**不止於修補程式,更在於架構升級**。