PASSWORD_REUSE_TIME参数用于设定用户不可重用旧密码的时间窗口(单位:天),需与PASSWORD_REUSE_MAX互斥设置,且仅在自定义profile中生效,DEFAULT profile不支持配置。
Oracle密码重用时间怎么设:PASSWORD_REUSE_TIME参数的作用
password_reuse_time 控制用户在多长时间内不能重复使用旧密码。它和 password_reuse_max 是互斥的——只要其中一个设为非 null 值,另一个就必须为 unlimited(否则创建 profile 会报错 ora-28035: password reuse parameters are mutually exclusive)。
比如你想让用户改密码后 180 天内不能重用任意一个历史密码,就得把 PASSWORD_REUSE_TIME 设为 180,同时确保 PASSWORD_REUSE_MAX 是 UNLIMITED。
- 单位是「天」,支持小数(如
0.5表示 12 小时) - 值为
UNLIMITED表示不限制时间,仅靠密码数量限制生效 - 设为
0不代表“立即允许重用”,而是被 Oracle 视为非法值,会报ORA-28031: maximum of 148 users exceeded类似误导性错误(实际是参数校验失败) - 该参数只对启用了密码历史功能的 profile 生效;默认 profile(
DEFAULT)不启用密码历史,需显式配置
怎么给用户启用密码历史:必须绑定自定义 profile
Oracle 不允许直接在 DEFAULT profile 上设置 PASSWORD_REUSE_TIME 或 PASSWORD_REUSE_MAX —— 这两个参数在 DEFAULT 中始终为 NULL,且不可修改。你必须新建 profile 并分配给用户。
实操步骤:
- 用
CREATE PROFILE创建新 profile,例如:CREATE PROFILE app_user_prof LIMIT PASSWORD_REUSE_TIME 180 PASSWORD_REUSE_MAX UNLIMITED;
- 用
ALTER USER ... PROFILE把用户切换过去:ALTER USER scott PROFILE app_user_prof;
- 注意:切换 profile 后,用户下次改密码(
ALTER USER ... IDENTIFIED BY)才会开始记录历史;已有密码不会自动进入历史库 - 密码历史记录保存在数据字典视图
DBA_USERS_WITH_DEFPWD不包含此信息,真实存储在内部表(不可直接查),但可通过DBA_PASSWORD_HISTORY查看已存档的哈希记录(需有相应权限)
为什么改了 profile 密码还是能马上重用?常见漏点
即使正确设置了 PASSWORD_REUSE_TIME,用户仍可能绕过限制,原因通常是以下之一:
- DBA 用
ALTER USER ... IDENTIFIED BY VALUES方式强制设密码(跳过所有验证逻辑,包括历史检查) - 用户用
ALTER USER ... IDENTIFIED BY改密时,新密码和当前密码相同(Oracle 默认允许,除非还启用了PASSWORD_VERIFY_FUNCTION拦截) - profile 没真正生效:检查
SELECT profile FROM dba_users WHERE username = 'SCOTT';确认返回的是你设的 profile 名,不是DEFAULT - 数据库版本低于 12cR2:早期版本对
PASSWORD_REUSE_TIME的实现有 bug,比如 11g 中若未同时设FAILED_LOGIN_ATTEMPTS,部分场景下历史检查不触发
密码历史实际存多久?和 PASSWORD_REUSE_TIME 的关系
PASSWORD_REUSE_TIME 不控制「历史记录保留多久」,而控制「哪些历史密码禁止重用」。Oracle 内部维护一个滚动密码历史列表(默认最多保存 10 个,由隐含参数 _password_history_max 控制,不可调),每次改密就追加一条;但只有落在 PASSWORD_REUSE_TIME 时间窗口内的记录才参与比对。
举例:设了 PASSWORD_REUSE_TIME 30,用户每 5 天改一次密,那么第 7 次改密时,最早那条(35 天前)已超时,不会被检查,但其余 6 条仍在窗口内,全都不能重用。
所以真正影响安全水位的是两者的组合:时间窗口越宽、历史条目越多,重用难度越高;但 DBA 很少调大历史条数,因为每条都存哈希,过多会影响 ALTER USER 性能。











