首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 密碼避坑指南:為什麼不能包含 @ 符號及最佳實踐

     編輯:Oracle 資料庫基礎

問題現場

SQL> CREATE USER testuser2 IDENTIFIED BY "H@t";
User created.

SQL> CONNECT testuser2/h@t
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

根因剖析

Oracle 連接字符串語法:CONNECT username/password@connect_identifier
@ 符號被解析器識別為「連接標識符分隔符」。
當密碼包含 @ 時,解析器誤將 @ 後內容視為 TNS 別名 (如上例中的 t),導致 ORA-12154。

解決方案

方案一:雙引號括起密碼 (僅限 SQL*Plus / 腳本)

CONNECT testuser2/"H@t"
-- 或
CONNECT testuser2/"H@t"@tns_alias

限制: 依賴客戶端工具支持,JDBC/ODBC/OCI 驅動行為不一,不推薦作為通用方案。

方案二:密碼複雜度函數禁止 @ (根治)

CREATE OR REPLACE FUNCTION pwd_verify_fn
(username VARCHAR2, password VARCHAR2, old_password VARCHAR2)
RETURN BOOLEAN IS
BEGIN
  IF INSTR(password, '@') > 0 THEN
    RAISE_APPLICATION_ERROR(-20001, '密碼不得包含 @ 符號');
  END IF;
  -- 其他複雜度檢查:長度、大小寫、數字、特殊字符...
  RETURN TRUE;
END;
/

-- 創建 Profile 並關聯
CREATE PROFILE secure_profile LIMIT
  PASSWORD_VERIFY_FUNCTION pwd_verify_fn
  PASSWORD_LIFE_TIME 90
  PASSWORD_REUSE_TIME 365
  PASSWORD_REUSE_MAX 5
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LOCK_TIME 1;

-- 分配給用戶
ALTER USER app_user PROFILE secure_profile;

方案三:編碼/轉義 (應用層處理)

  • JDBC Thin:連接屬性 password 直接傳值,無需轉義
  • 連接池配置文件 (XML/Properties):按格式轉義 (如 XML 用 @)
  • Shell 腳本:單引號包裹 sqlplus user/'pass@word'@tns

版本演進說明

  • 10gR2 及之前:密碼不區分大小寫,@ 符號衝突普遍
  • 11g+:引入區分大小寫密碼 (Case-sensitive),SEC_CASE_SENSITIVE_LOGON=TRUE
  • 12c+:引入 PBKDF2 / SHA-512 強哈希,PASSWORD_VERSIONS 顯示 11G/12C
  • 18c+:支持 PASSWORD_ROLLOVER_TIME 平滑輪換

最佳實踐清單

  1. 密碼策略禁用 @ # $ 等特殊元字符 (保留 ! % ^ & * - _ + = 等安全字符)
  2. 強制長度 ≥ 12,包含大小寫、數字、允許特殊字符
  3. 使用 DBMS_CRYPTO / ORAPWD 生成高熵密碼
  4. 應用層統一使用 連接池 + 驗證代理,避免明文密碼出現在代碼/配置/日誌中
  5. 定期輪換,審計 DBA_USERS.PASSWORD_VERSIONS、PTIME

總結: @ 符號是 Oracle 連接語法的保留字,密碼包含它屬於「自帶干擾源」。從源頭 (Profile 驗證函數) 禁止,配合應用層規範化管理,才是企業級安全基線。

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