oracle密码重用限制由profile的password_reuse_time和password_reuse_max属性共同控制,二者为“与”关系,必须同时满足才能重用旧密码。
oracle 密码重用限制靠 profile 控制,不是单独配置参数
oracle 没有全局或实例级的 _password_reuse_time 或 max 这类独立参数——它们只存在于 profile 的密码策略中。试图在 init.ora、spfile 或 alter system 里设置这些名字,会直接报错或被忽略。
真正起作用的是 PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX 这两个 PROFILE 属性,必须绑定到具体用户(或默认 PROFILE)上才生效。
PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX 的行为差异
这两个值不是“二选一”,而是“与”关系:用户必须同时满足时间间隔和次数限制,才能重用旧密码。比如设为 PASSWORD_REUSE_TIME 365 且 PASSWORD_REUSE_MAX 5,意味着:同一密码至少要隔 365 天,且该密码在历史中最多只出现过 5 次(含当前),才能再次使用。
-
PASSWORD_REUSE_TIME单位是天,支持小数(如0.5表示 12 小时),但实际生效精度取决于密码更改时间戳记录粒度(通常到秒) -
PASSWORD_REUSE_MAX是整数,设为UNLIMITED表示不检查历史次数;设为0表示完全禁止重用(哪怕时间过了也不行) - 如果只设其中一个,另一个默认为
UNLIMITED,此时单条件不构成限制(例如只设PASSWORD_REUSE_MAX 3,但没设时间,则只要历史上用过 ≤3 次就能立刻重用)
实操:创建/修改 PROFILE 并分配给用户
不能直接改 DEFAULT PROFILE 的密码策略(除非你明确知道后果),推荐新建 PROFILE。注意:修改 PROFILE 不影响已存在的密码历史记录,只对后续 ALTER USER ... IDENTIFIED BY 生效。
CREATE PROFILE app_user_prof LIMIT PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 5 FAILED_LOGIN_ATTEMPTS 6 PASSWORD_LOCK_TIME 1/24; -- 锁 1 小时 <p>ALTER USER scott PROFILE app_user_prof;</p>
- 执行后,
scott下次改密时,Oracle 会查其密码历史表(USER$中的ASTATUS和加密哈希链),判断是否满足两个条件 - 历史密码记录默认保留最近 10 次(由隐含参数
_password_history_max控制,不可改),所以PASSWORD_REUSE_MAX超过 10 实际无效 - PROFILE 修改立即生效,但用户当前会话无需重新登录——下次执行
ALTER USER ... IDENTIFIED BY才触发校验
常见错误现象和排查点
用户抱怨“明明过了 365 天还是不能重用旧密码”,大概率不是配置问题,而是没理解 Oracle 的校验逻辑。
- 错误信息通常是:
ORA-28007: the password cannot be reused—— 这说明两个条件至少有一个未满足 - 检查当前 PROFILE 设置:
SELECT * FROM DBA_PROFILES WHERE PROFILE='APP_USER_PROF' AND RESOURCE_NAME LIKE 'PASSWORD%'; - 确认用户实际使用的 PROFILE:
SELECT USERNAME, PROFILE FROM DBA_USERS WHERE USERNAME='SCOTT'; - Oracle 不记录明文密码,只存哈希;但哈希相同即视为同一密码——所以大小写、空格、特殊字符变化都会产生新哈希,不算“重用”
- 如果用户用
ALTER USER ... IDENTIFIED BY VALUES绕过密码复杂度和重用检查,那PASSWORD_REUSE_*完全不生效
真正难搞的是密码历史和 PROFILE 的耦合性:它依赖系统表、隐含参数、甚至底层哈希算法版本。一旦出问题,很难靠日志定位,得靠反复验证 PROFILE + 用户 + 历史哈希链三者状态。










