Oracle 將密碼存儲為 加密雜湊值(DBA_USERS.PASSWORD,11g 為 SHA-1,12c+ 為 PBKDF2/SHA-512)。ALTER USER ... IDENTIFIED BY VALUES 'hash' 可直接按雜湊值還原密碼,無需知明文。
SQL> CONNECT / AS SYSDBA
Connected.
SQL> SELECT username, password FROM dba_users WHERE username = 'SYSTEM';
USERNAME PASSWORD
-------- ------------------------------
SYSTEM 2D594E86F93B17A1
記錄該雜湊值(2D594E86F93B17A1),稍後還原用。
SQL> ALTER USER system IDENTIFIED BY manager;
User altered.
SQL> CONNECT system/manager
Connected.
-- 執行所需操作:查詢、授權、導出等
SQL> CONNECT / AS SYSDBA
Connected.
SQL> ALTER USER system IDENTIFIED BY VALUES '2D594E86F93B17A1';
User altered.
SQL> CONNECT system/Oracle
Connected. -- 原密碼生效
SQL> CONNECT system/manager
ERROR: ORA-01017: invalid username/password; logon denied
-- 臨時密碼已失效
-- 1. 記錄目標用戶雜湊
DEFINE target_user = SYSTEM
COL password NEW_VALUE old_hash
SELECT password FROM dba_users WHERE username = UPPER('&target_user');
-- 2. 設置臨時密碼
ALTER USER &target_user IDENTIFIED BY TempPass123;
-- 3. 此處可手動操作或調用腳本
-- @do_something.sql
-- 4. 還原原密碼
ALTER USER &target_user IDENTIFIED BY VALUES '&old_hash';
-- 5. 驗證
-- CONNECT &target_user/original_password
| 版本 | 密碼雜湊算法 | PASSWORD 列長度 | 備註 |
|---|---|---|---|
| 10g/11g | SHA-1 (基於 DES 的雙重雜湊) | 16 字符 | IDENTIFIED BY VALUES 完全支援 |
| 12c+ | PBKDF2 + SHA-512 (SALT + 迭代) | 80+ 字符 | 同樣支援,雜湊值更長,區分大小寫 |
| 18c+ | 支援專用密碼驗證函數 | - | 若使用自定義驗證函數,VALUES 子句可能不適用 |
PASSWORD_VERIFY_FUNCTION 策略。ALTER USER ... IDENTIFIED BY VALUES 'S:...;T:...;' 包含 SHA-512 與 11g 兼容雜湊,確保雜湊值完整複製(含分號)。利用 DBA_USERS.PASSWORD 雜湊值配合 IDENTIFIED BY VALUES 實現「借用身份、無感歸還」,是 DBA 運維工具箱中的經典技巧。關鍵在於:備份雜湊 → 臨時修改 → 業務操作 → 精確還原 → 驗證失效,全程不接觸明文密碼,符合最小知情原則與審計合規要求。12c+ 環境下注意雜湊值格式變化,確保完整複製。