Oracle密码复杂度策略由verify_function(11g及更早)或ora12c_strong_verify_function(12c+)控制,二者需通过ALTER PROFILE显式绑定至profile方可生效,直接修改_utlpwdmg.sql脚本内容无效。
Oracle密码复杂度策略由哪个函数控制
oracle默认的密码复杂度校验逻辑封装在 verify_function(11g及更早)或 ora12c_strong_verify_function(12c+)里,它们不是普通pl/sql函数,而是被create profile显式调用的密码验证回调。直接改脚本不生效——必须通过alter profile把新函数绑定到profile上,否则_utlpwdmg.sql里定义的函数只是“躺在数据库里”。
常见错误现象:ORA-28003: password verification for the specified password failed 报错后反复修改_utlpwdmg.sql内容却无变化,本质是profile没刷新。
- 确认当前用户使用的profile:
SELECT profile FROM dba_users WHERE username = 'YOUR_USER'; - 查profile绑定的密码函数:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_VERIFY_FUNCTION'; - 12c+建议优先用
ora12c_strong_verify_function,它比老版多校验重复字符、键盘序列(如"123456")、字典词等
运行_utlpwdmg.sql前必须检查的3个前提
这个脚本不是“双击运行”的安装包,它依赖数据库状态和权限。跳过检查大概率导致函数编译失败或校验不触发。
- 必须以
SYS用户连接,且使用AS SYSDBA方式(普通DBA权限不够) - 确保
RESOURCE_LIMIT = TRUE:查SHOW PARAMETER resource_limit,若为FALSE需先执行ALTER SYSTEM SET resource_limit = TRUE; - 脚本路径要准确——Oracle 12c+默认已自带
_utlpwdmg.sql,位置通常在$ORACLE_HOME/rdbms/admin/,别从网上随便下载同名文件覆盖
自定义密码规则时,哪些参数能改、哪些不能碰
_utlpwdmg.sql里最常被修改的是verify_function内部的硬编码阈值,比如最小长度、大小写字母数量要求。但改法有陷阱:
- 可安全调整:
min_length、min_uppercase、min_lowercase、min_digits、min_special这几个变量值(注意:12c+的ora12c_strong_verify_function里这些叫法不同,是length、upper等) - 禁止删除或注释掉
RETURN TRUE;之前的校验分支,否则函数可能提前返回TRUE,等于关掉了全部校验 - 别在函数里加
DBMS_OUTPUT.PUT_LINE——密码校验发生在登录鉴权阶段,此时输出不可见,还可能因权限问题报ORA-06502 - 修改后必须重新执行
@?/rdbms/admin/utlpwdmg.sql(注意是@不是START),再ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION your_function_name;
为什么改完还是允许弱密码?重点看这2个地方
最常被忽略的两个点,导致所有配置像没做一样:
- 用户profile没真正生效:有些用户被显式赋予了非DEFAULT profile(比如
APP_PROFILE),你只改了DEFAULT,得同步ALTER PROFILE APP_PROFILE LIMIT PASSWORD_VERIFY_FUNCTION ...; - 密码修改场景被绕过:用
ALTER USER ... IDENTIFIED BY VALUES '...';(带hash值)或ALTER USER ... IDENTIFIED EXTERNALLY;时,密码验证函数完全不执行——这是Oracle设计如此,不是bug
复杂点在于:同一个数据库里可能混用多种认证方式(OS auth、LDAP、密码),而密码复杂度只对纯口令登录起作用。如果业务系统用的是外部认证,再严的_utlpwdmg.sql也管不到。










