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。
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;
password 直接傳值,無需轉義@)sqlplus user/'pass@word'@tnsSEC_CASE_SENSITIVE_LOGON=TRUEPBKDF2 / SHA-512 強哈希,PASSWORD_VERSIONS 顯示 11G/12CPASSWORD_ROLLOVER_TIME 平滑輪換DBMS_CRYPTO / ORAPWD 生成高熵密碼DBA_USERS.PASSWORD_VERSIONS、PTIME總結: @ 符號是 Oracle 連接語法的保留字,密碼包含它屬於「自帶干擾源」。從源頭 (Profile 驗證函數) 禁止,配合應用層規範化管理,才是企業級安全基線。