oracle 11g 中 default profile 的 password_reuse_time 和 password_reuse_max 始终为 null 且硬编码禁用,修改无效;必须创建自定义 profile 并显式分配给用户,且两参数须一设值、一设 unlimited 才生效。
必须新建自定义 profile 并显式分配给用户,default profile 无法启用密码历史功能。
为什么直接改 DEFAULT profile 的 PASSWORD_REUSE_MAX 没用
Oracle 11g 中,DEFAULT profile 的 PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX 始终为 NULL,且不可修改。即使执行了 ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 5,实际查询 dba_profiles 仍显示 NULL 或报错 ORA-28035 —— 因为这两个参数在 DEFAULT 中被硬编码禁用。
常见错误现象:
- 执行完 ALTER PROFILE DEFAULT 命令后,用户仍能立刻重用刚改过的密码
-
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_REUSE_MAX';返回NULL,而非你设的值
根本原因:Oracle 只在自定义 profile 中解析并生效这两个参数。
正确创建和绑定密码历史 profile 的步骤
创建 profile 时,PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX 必须互斥设置 —— 一个设为具体值,另一个必须是 UNLIMITED,否则会报 ORA-28035。
例如,要实现「180 天内不能重用旧密码」:
CREATE PROFILE app_sec_prof LIMIT PASSWORD_REUSE_TIME 180 PASSWORD_REUSE_MAX UNLIMITED;ALTER USER scott PROFILE app_sec_prof;
再比如,要实现「最多保留最近 5 次密码,不限制时间」:
CREATE PROFILE app_sec_prof LIMIT PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX 5;ALTER USER scott PROFILE app_sec_prof;
注意:PASSWORD_REUSE_TIME 单位是天,支持小数(如 0.5 表示 12 小时);设为 0 是非法值,会触发校验失败,报类似 ORA-28031 的误导性错误。
为什么用户改完密码还是能重用?排查这三点
profile 生效后,密码历史校验只在 ALTER USER ... IDENTIFIED BY 时触发,且依赖底层记录。容易踩的坑:
- DBA 用
ALTER USER ... IDENTIFIED BY VALUES强制设密码 → 完全跳过所有密码策略,包括历史检查 - 用户执行
ALTER USER ... IDENTIFIED BY时,新密码和当前密码相同 → Oracle 默认允许(除非额外配置了PASSWORD_VERIFY_FUNCTION) - profile 已切换,但用户尚未执行过一次合规的改密操作 → 密码历史表(内部
USER$相关字段)为空,无记录可比对
验证是否真有历史记录,可查 DBA_PASSWORD_HISTORY(需 DBA 权限),但要注意:该视图只存成功通过校验的改密事件,不是实时日志。
隐含限制:历史记录最多存 10 条
Oracle 内部用隐含参数 _password_history_max 控制密码哈希链长度,默认值为 10,且不可修改。这意味着:
- 即使你设了
PASSWORD_REUSE_MAX 20,实际只保留最近 10 次哈希 -
PASSWORD_REUSE_MAX超过 10 的值全部无效,Oracle 不报错也不警告 - 历史记录不按时间自动清理,而是滚动覆盖:第 11 次改密会挤掉最早那条
这个限制藏得深,很多 DBA 配置完发现「明明设了 20 次却只能查到 10 条」,就是卡在这里。











