oracle 23c默认不启用密码复杂度校验,需手动执行utlpwdmg.sql并绑定ora12c_strong_verify_function到default profile,否则alter user仍可设弱密码。

Oracle 23c 默认仍不启用任何密码复杂度校验,PASSWORD_VERIFY_FUNCTION 值为 NULL,哪怕你设了 PASSWORD_LIFE_TIME 或 FAILED_LOGIN_ATTEMPTS,用户照样能设 123 或用户名本身作密码。
怎么确认当前没生效?
别信“脚本跑过了”,直接查数据库状态:
-
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_VERIFY_FUNCTION';—— 返回NULL就等于没锁 -
SELECT username, profile FROM dba_users WHERE username = 'SCOTT';—— 确保用户真在DEFAULTprofile 下,不是被单独 assign 到空策略的 profile - 用测试用户执行
ALTER USER scott IDENTIFIED BY 123;—— 若成功,说明策略完全没起作用
必须执行 utlpwdmg.sql 才能启用内置函数
Oracle 23c 自带 ORA12C_STRONG_VERIFY_FUNCTION(比老版 VERIFY_FUNCTION_11G 多校验键盘序列、重复字符、字典词),但它不会自动加载。关键动作只有一步:以 SYS AS SYSDBA 连接后执行脚本:
- 路径必须准确:
@?/rdbms/admin/utlpwdmg.sql(?自动展开为$ORACLE_HOME) - 不能用
START或复制粘贴内容执行;必须用@命令加载 - 执行前确认:
SHOW PARAMETER resource_limit返回TRUE,否则先ALTER SYSTEM SET resource_limit = TRUE; - 若报
PLS-00201: identifier 'DBMS_RANDOM' must be declared,说明缺权限,补一句:GRANT EXECUTE ON DBMS_RANDOM TO PUBLIC;
绑定函数到 profile 是最后且不可省的一步
脚本执行完只是把函数建进数据库,不绑定就等于有质检员但没派岗。必须显式指定:
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION ORA12C_STRONG_VERIFY_FUNCTION;- 23c 不再推荐用
VERIFY_FUNCTION或ORA12C_VERIFY_FUNCTION,前者已过时,后者不校验键盘序列(如123456、qwerty) - 改完立刻生效——但只对后续
ALTER USER ... IDENTIFIED BY或密码重置操作生效;已有弱密码不会被强制更新 - 验证是否绑定成功:
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_VERIFY_FUNCTION';应返回ORA12C_STRONG_VERIFY_FUNCTION
配套参数要协同设置,否则形同虚设
单靠复杂度函数不够,暴力破解和口令老化得靠其他参数兜底:
-
FAILED_LOGIN_ATTEMPTS设为5(不是3,防误锁;也不是10,太松) -
PASSWORD_LOCK_TIME单位是“天”:锁 30 分钟写30/1440,写0.5就是锁半天 -
PASSWORD_LIFE_TIME和PASSWORD_GRACE_TIME必须配对:比如90+7,过期后还能登 7 天,第 8 天起拒绝登录 -
PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX要一起设,避免用户循环用旧密码绕过策略
最易忽略的一点:所有这些限制都只作用于 profile 绑定的用户。如果某个账号被 ALTER USER ... PROFILE other_profile; 指向了没配策略的 profile,那它就彻底游离在规则之外。











