oracle 11g 不支持仅靠 password_reuse_max 单独限制“前3次”密码重用——必须同时设置 password_reuse_time,否则策略完全不生效。
oracle 11g 不支持仅靠 password_reuse_max 单独限制“前3次”密码重用——必须同时设置 password_reuse_time,否则策略完全不生效。
为什么只设 PASSWORD_REUSE_MAX 3 没用
Oracle 11gR2 起强制要求 PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX 必须**同时指定非 UNLIMITED 值**,策略才启动。如果只执行:
ALTER PROFILE app_prof LIMIT PASSWORD_REUSE_MAX 3;
那 PASSWORD_REUSE_TIME 仍为默认的 UNLIMITED,结果就是:用户改一次密码后立刻就能重用旧密码(只要没超3次),时间约束形同虚设。
常见错误现象:ORA-28007: the password cannot be reused 压根不会报,但安全策略也等于没开。
正确配置方式:两个参数都得设,且要匹配业务逻辑
想实现“不能与前3次重复”,本质是限制历史密码出现次数 ≤3,但 Oracle 的 PASSWORD_REUSE_MAX 含义是:“当前密码在被重用前,必须至少经历 N 次密码更改”。所以设 PASSWORD_REUSE_MAX 3 意味着:用户必须改密3次后,才能再次使用最初那个密码。
- 推荐组合:
PASSWORD_REUSE_TIME 365+PASSWORD_REUSE_MAX 3 - 含义:同一个密码,既要在历史上最多只出现3次,又要距离上次使用满365天,两个条件都满足才能重用
- 建 profile 示例:
CREATE PROFILE app_prof LIMIT PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 3;
- 绑定用户:
ALTER USER scott PROFILE app_prof;
注意:PASSWORD_REUSE_MAX 实际生效上限受隐含参数 _password_history_max 控制(默认 10),设成 3 是安全有效的;但设成 15 就无效,系统只记最近 10 条哈希。
检查和验证是否真生效
别只信命令执行成功——得看数据字典里有没有真正写入:
- 查 profile 当前值:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'APP_PROF' AND resource_name IN ('PASSWORD_REUSE_TIME', 'PASSWORD_REUSE_MAX'); - 确认用户绑定了该 profile:
SELECT username, profile FROM dba_users WHERE username = 'SCOTT';
- 关键验证点:执行
ALTER USER scott IDENTIFIED BY xxx时,Oracle 才会查sys.user_history$表校验。所以改密操作本身才是触发点,不是 profile 创建完就自动扫历史。
如果用户抱怨“明明改了3次还是不能重用”,大概率是因为 PASSWORD_REUSE_TIME 太大(比如设了 1000),而实际时间没到——这个时间判断基于密码哈希记录的时间戳,精度是秒级,但显示单位是天,容易误判。
绕过限制的紧急手段(仅限 DBA 自救)
生产环境遇到无法重用旧密码又急需恢复的情况,可临时清理历史记录或跳过校验:
- 清空某用户密码历史(需
SYSDBA):DELETE FROM sys.user_history$ WHERE user# = (SELECT user# FROM sys.user$ WHERE name = 'SCOTT');
- 用哈希直设密码(绕过所有策略):
ALTER USER scott IDENTIFIED BY VALUES 'S:xxx...';
(spare4字段值需提前查) - 临时放开限制:
ALTER PROFILE app_prof LIMIT PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX UNLIMITED;
这些操作都会留下审计痕迹,且不解决根本问题——真正该盯住的,是 profile 里两个参数是否成对出现、是否被正确绑定到用户,以及用户改密行为是否真实触发了校验链路。











