背景
在日常数据库运维中,我们经常会遇到这样的场景:
- 开发人员忘记了数据库用户的密码
- 应用连接池报错
ora-28001: the password has expired - 密码策略被修改,导致大量用户密码过期
- 密码被误修改,但不知道原来的密码是什么
当你遇到这些情况时,oracle 的密码哈希值(spare4) 可以帮你优雅地解决问题。
oracle 密码存储机制
在 oracle 11g 及更高版本中,用户密码以哈希值的形式存储在 sys.user$ 表的 spare4 列中。
存储格式:
s:<加盐哈希>;t:<哈希值>
s:部分:包含加盐的 sha-1 哈希t:部分:包含额外的哈希信息(用于兼容性)
这个哈希值就是 oracle 用来验证密码的“指纹”。只要知道这个哈希值,我们就能将用户密码恢复为原来的状态,而无需知道明文密码。
实战:恢复用户密码
第一步:查询用户状态
select username, account_status, expiry_date, profile from dba_users where username = '目标用户名';
如果状态是 expired 或 locked,就需要进行恢复。
第二步:获取密码哈希值
select spare4 from sys.user$ where name = '目标用户名';
输出示例:
s:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;t:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
第三步:使用哈希值还原密码
alter user 目标用户名 identified by values '完整的哈希值(s:...;t:...)' account unlock;
关键点:
- 使用
identified by values而不是identified by - 哈希值必须完整复制,不能有遗漏
- 最后加上
account unlock解锁账户
第四步:验证恢复结果
select username, account_status, lock_date, expiry_date from dba_users where username = '目标用户名';
期望输出:
username account_status lock_date expiry_date ---------- --------------- ---------- ----------- 目标用户名 open (null) ———————————————— 版权声明:本文为csdn博主「一十九的酒」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/gary192211112/article/details/163248179
批量恢复多个用户
如果需要恢复多个用户,可以批量执行:
-- 查询所有需要恢复的用户
select name, spare4 from sys.user$
where name in ('用户1', '用户2', '用户3');
-- 生成恢复语句
select 'alter user ' || name || ' identified by values ''' || spare4 || ''' account unlock;' as sql_command
from sys.user$
where name in ('用户1', '用户2', '用户3');
————————————————
版权声明:本文为csdn博主「一十九的酒」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gary192211112/article/details/163248179重要提醒
1. 哈希值不是密码
| 操作 | 说明 |
|---|---|
identified by values '哈希值' | ✅ 用于数据库内部恢复密码 |
conn username/哈希值 | ❌ 不能用于登录(哈希值不是明文密码) |
2. 哈希值来源
- 可以从
sys.user$表中获取 - 可以从数据库备份中提取
- 如果用户被删除重建,哈希值会改变
3. 权限要求
-- 需要 dba 权限才能查询 sys.user$ grant select on sys.user$ to 用户名;
4. 版本兼容性
| oracle 版本 | 哈希值存储位置 |
|---|---|
| 10g 及更早 | password 列 |
| 11g 及以后 | spare4 列(优先) |
常见问题排查
q1:spare4为 null 怎么办?
-- 使用旧版 password 列 select password from sys.user$ where name = '目标用户名'; -- 使用旧版哈希恢复 alter user 目标用户名 identified by values '旧版哈希值' account unlock; ———————————————— 版权声明:本文为csdn博主「一十九的酒」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/gary192211112/article/details/163248179
q2:用户仍然是 expired 状态?
-- 强制解锁并重新设置密码 alter user 目标用户名 identified by values '哈希值' account unlock;
q3:应用仍然报错 ora-01017?
可能是应用配置中的密码与恢复后的密码不一致。解决方案:
- 在应用配置中更新密码
- 或者将数据库密码改为应用配置中的密码
完整恢复流程图
┌─────────────────┐
│ 用户密码过期/锁定 │
└────────┬────────┘
▼
┌─────────────────────────┐
│ select spare4 from sys.user$ │
└────────┬────────────────┘
▼
┌─────────────────────────────────────────┐
│ alter user 用户 identified by values '哈希值' │
│ account unlock; │
└────────┬────────────────────────────────┘
▼
┌─────────────────┐
│ 验证 account_status │
└────────┬────────┘
▼
┌─────────────────┐
│ ✅ 密码恢复成功! │
└─────────────────┘
————————————————
版权声明:本文为csdn博主「一十九的酒」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gary192211112/article/details/163248179总结
| 方法 | 优点 | 缺点 |
|---|---|---|
| 使用哈希值恢复 | ✅ 保留原密码 | ⚠️ 需要 dba 权限 |
| 重置密码 | ✅ 操作简单 | ❌ 需要同步应用配置 |
| 从备份恢复 | ✅ 数据完整 | ❌ 耗时、风险高 |
推荐做法:在紧急情况下,优先使用哈希值恢复密码。如果不知道原密码或需要统一管理,则重置为已知密码并同步更新应用配置。
以上就是oracle使用spare4哈希值还原用户密码的实战指南的详细内容,更多关于oracle spare4还原用户密码的资料请关注代码网其它相关文章!
发表评论