sys.user$ 记录用户密码

本文介绍了如何通过SQL查询和修改数据库中用户的密码,包括使用sys.user$表获取和更新SCOTT用户密码的过程,以及如何在更改密码后再次恢复原密码。



如果不知道用户的密码可以查sys.user$ ,记下,修改密码,以后还可以再改回原来的,即使不知道原密码是什么


SQL> select name,password from sys.user$   where name='SCOTT';

NAME                                                                                       PASSWORD
------------------------------------------------------------------------------------------ ------------------------------
SCOTT                                                                                     F894844C34402B67


SQL> conn / as sysdba

Connected.


SQL> alter user scott identified by tiger123;

User altered.

SQL> conn scott/tiger123
Connected.

SQL> conn / as sysdba
Connected.

SQL> select name,password from sys.user$ where name='SCOTT';

NAME                                                                                       PASSWORD
------------------------------------------------------------------------------------------ ------------------------------
SCOTT                                                                                      0CF421ECB3EFCC4E


SQL> alter user scott identified by values 'F894844C34402B67';

User altered.

SQL> conn scott/tiger
Connected.  

<think> 我们已知在Oracle数据库中,用户密码信息存储在SYS.USER$表中,但有时我们可能会发现该表中的PASSWORD列为空(如引用[1]中提到的syssystem用户)或者无法直接查看密码(如引用[2]提到11g中DBA_USERS的PASSWORD字段不再显示密码)。此外,引用[3]显示在SYS.USER$表中,密码是以加密形式存储的(如SCOTT用户密码显示为F894844C34402B67)。 用户的问题:在SYS.USER$表找到指定用户后,无法查看用户密码(可能表现为PASSWORD列为空或无法理解其值)。需要解决这个问题。 原因分析: 1. 在Oracle 11g及更高版本中,密码存储机制发生了变化。11g之前,密码哈希值存储在USER$.PASSWORD列中。从11g开始,Oracle引入了更安全的密码存储方式,将密码的多个版本的哈希值(例如10g版本、11g版本)存储在USER$.SPARE4列(或USER$.PASSWORD列可能为空,而实际存储在SPARE4列)。同时,密码也可能以其他方式存储(如12c的SECUREFILE LOB)。 2. 对于某些特殊用户(如SYS用户),其密码可能以外部密码文件(orapw<sid>)存储,而不在数据库中,因此SYS.USER$表中的PASSWORD列为空。 3. 直接查看密码哈希值本身没有意义,因为它是加密的,无法直接还原为明文密码。 因此,无法查看密码的解决办法取决于你的目的: 目的1:只是想重置密码(因为忘记密码)-> 使用ALTER USER命令修改密码。 目的2:需要检查密码是否与默认密码相同(安全审计)-> 可以比较密码哈希值(但需要知道默认密码的哈希值)。 目的3:需要查看密码的明文?-> 这是不可能的,因为Oracle存储的是哈希值,不可逆。 对于目的1:重置密码(推荐方法) 使用SQL命令: ```sql ALTER USER <username> IDENTIFIED BY <new_password>; ``` 例如,重置SCOTT用户密码: ```sql ALTER USER SCOTT IDENTIFIED BY tiger; ``` 对于目的2:比较密码哈希值(用于安全审计) 步骤: 1. 获取当前用户密码哈希值。在11g及以上版本,可以通过以下方式获取: 查询SYS.USER$表,注意PASSWORD列可能为空,而真正的哈希值存储在SPARE4列(包含多个版本的哈希,以分号分隔)。 例如,查询SCOTT用户密码哈希值: ```sql SELECT NAME, PASSWORD, SPARE4 FROM SYS.USER$ WHERE NAME='SCOTT'; ``` 在11g中,SPARE4列的值可能类似:'S:8F2D65FB5547B71CB8BB65A7B7C8E7D9D6FF39D0B0D0B7B5F6C7B5F6C7B5F6C7B5;H:;T:8F2D65FB5547B71CB8BB65A7B7C8E7D9D6FF39D0B0D0B7B5F6C7B5F6C7B5F6C7B5' 其中,以'S:'开头的部分就是11g的密码哈希(40位),而后面可能还有其他版本的哈希。 2. 将得到的哈希值与已知的默认密码哈希值进行比较。例如,SCOTT用户的默认密码是TIGER,其10g版本的哈希值为F894844C34402B67(如引用[3]所示)。注意,11g的哈希值长度是40位,而10g是16位。 3. 但是,从11g开始,Oracle默认使用SHA-1算法(40位)存储密码,而10g使用DES(16位)。因此,如果需要检查用户是否使用了默认密码,需要同时计算默认密码在不同算法下的哈希值,然后与SPARE4中的各个部分比较。 然而,这种方法非常复杂,而且需要知道默认密码的哈希值(可以从一个测试用户那里获取,比如创建一个用户并设置密码为默认密码,然后查询其哈希值)。 替代方案:使用Oracle提供的默认密码检查工具(如DBSNMP的默认密码检查)或使用第三方安全扫描工具。 对于目的3:获取明文密码(不可行) 由于密码是哈希存储的,无法从哈希值恢复明文。如果用户忘记密码,只能重置。 特殊情况:SYSSYSTEM用户 如引用[1]所述,在SYS.USER$表中查询SYSSYSTEM用户时,PASSWORD列为空。这是因为这些用户密码存储在外部密码文件中($ORACLE_HOME/dbs/orapw<ORACLE_SID>),因此数据库内部表中没有存储密码哈希。对于这些用户,修改密码的方法同样使用ALTER USER,但修改后也会同步更新密码文件。 总结解决办法: 1. 如果是因为密码过期或忘记密码,使用ALTER USER重置密码。 2. 如果是安全审计需要,获取密码哈希值(从SPARE4列)并与已知的默认密码哈希值比较(注意版本)。 3. 不要期望能够看到明文密码,因为设计上就是不可见的。 操作步骤示例(重置密码): 步骤1:以具有足够权限的用户(如SYSDBA)登录。 步骤2:执行ALTER USER命令。 示例:重置SYS用户密码(注意:必须以SYSDBA登录,且SYS用户必须加上AS SYSDBA) ```sql CONNECT / AS SYSDBA ALTER USER SYS IDENTIFIED BY new_password; ``` 注意:修改SYS密码后,需要更新密码文件(自动完成),同时确保使用新密码连接。 如果用户坚持要查看SYS.USER$表中的密码哈希值(虽然通常为空或不可逆的哈希): 在11g及以后版本,查询SPARE4列: ```sql SELECT NAME, SPARE4 FROM SYS.USER$ WHERE NAME='<USERNAME>'; ``` 在10g及以前版本,查询PASSWORD列: ```sql SELECT NAME, PASSWORD FROM SYS.USER$ WHERE NAME='<USERNAME>'; ``` 但请注意,即使看到哈希值,也无法用于登录,因为登录时Oracle会计算输入密码的哈希然后与存储的哈希比较。 因此,无法查看密码的问题的解决方法是:理解密码的存储机制,根据目的选择重置密码或比较哈希值(安全审计)。对于SYSSYSTEM用户密码存储在外部文件,所以表中为空是正常的。 引用说明: [1] 提到在重置syssystem用户密码时,发现user$中的password为空 -> 这是因为这两个用户密码存储在外部密码文件,所以表中为空是正常的。 [2] 提到在11g中DBA_USERS视图的PASSWORD字段不再显示密码 -> 因此我们转向SYS.USER$表的SPARE4列。 [3] 显示了一个用户(SCOTT)的密码哈希值存储在PASSWORD列(10g及以前)。 因此,在11g及以上版本,要查看密码哈希值,应查询SPARE4列。如果该列也为空,则可能是外部认证(如操作系统认证)或密码存储在另一个地方(如12c的可插拔数据库环境)。 如果查询SPARE4列仍然为空,那么该用户可能是通过外部方式认证(如操作系统认证),此时在数据库中不存储密码哈希。 所以,解决办法总结: 1. 对于普通数据库用户(非SYS/SYSTEM): 11g及以上:查询SPARE4列获取哈希值(注意:哈希值不可逆,只能用于比较)。 10g及以下:查询PASSWORD列。 2. 对于SYS/SYSTEM用户密码存储在外部文件,因此表中为空。如果需要修改,用ALTER USER,它会同时更新密码文件。 3. 如果用户是通过外部认证(如OPS$),那么SYS.USER$表中没有密码哈希。 如果目的只是重置密码,那么直接使用ALTER USER命令即可,无需查看密码。 注意:直接查询SYS.USER$表需要高权限(如SYSDBA),并且不推荐直接修改该表。 因此,针对用户问题“在SYS.USER$表找到指定用户后无法查看密码的解决办法”: 回答:由于密码以不可逆的哈希值存储,无法查看明文密码。但可以通过以下方式获取密码哈希值(用于安全审计等): - 对于Oracle 11g及以上版本,查询SPARE4列(因为PASSWORD列可能为空): ```sql SELECT NAME, SPARE4 FROM SYS.USER$ WHERE NAME = '<用户名>'; ``` - 对于Oracle 10g及以下版本,查询PASSWORD列: ```sql SELECT NAME, PASSWORD FROM SYS.USER$ WHERE NAME = '<用户名>'; ``` 如果上述两列都为空,则说明该用户可能是通过外部认证(如操作系统认证)或为SYS/SYSTEM用户密码在外部密码文件)。此时,无法通过查询表获取密码哈希值。如果需要重置密码,使用ALTER USER命令。 所以,最终建议: 重置密码(无论什么用户): ```sql ALTER USER <用户名> IDENTIFIED BY <新密码>; ``` 如果用户SYS,在修改其密码时,必须用SYSDBA身份登录: ```sql CONNECT / AS SYSDBA; ALTER USER SYS IDENTIFIED BY <新密码>; ``` 这样,无论密码存储在何处,都可以重置。 注意:重置后,原来的密码哈希就被覆盖了。 因此,如果用户因为忘记密码而无法登录,可以通过以下步骤重置: 1.SYSDBA身份登录(操作系统认证或密码文件认证)。 2. 执行ALTER USER命令重置密码。 这就是解决无法查看密码问题的最常用和推荐的方法。 生成相关问题: 1. 如何以SYSDBA身份登录Oracle数据库? 2. 如何重置Oracle数据库中的SYS用户密码? 3. Oracle数据库的密码哈希存储机制在不同版本中有何不同? 4. 如何检查Oracle用户是否使用了默认密码? 5. 使用ALTER USER命令修改密码时有哪些注意事项? </think>在Oracle数据库中,`SYS.USER$`表存储用户密码的哈希值,但您可能遇到无法直接查看密码的情况(如列值为空或显示异常)。以下是根本原因和解决方案: --- ### **原因分析** 1. **密码存储机制变化** - **Oracle 11g+版本**:密码哈希值主要存储在`SPARE4`列(多版本哈希),`PASSWORD`列可能为空或存储旧哈希[^2]。 - **Oracle 10g及更早**:`PASSWORD`列直接存储DES加密的哈希值[^3]。 2. **特殊用户处理** - `SYS`和`SYSTEM`用户密码可能存储在外部密码文件(`orapw<sid>`)而非数据库表中,导致`PASSWORD`列为空[^1]。 3. **加密算法升级** 密码以**不可逆的哈希值(如SHA-1、SHA-512)** 存储,无法直接解密为明文。 --- ### **解决方案** #### 1. **查看密码哈希值(11g+版本)** ```sql -- 查询SPARE4列获取多版本哈希值 SELECT NAME, SPARE4 FROM SYS.USER$ WHERE NAME = '指定用户名'; ``` - **输出示例**: ``` S:8745F1B0D3E3F7A5... -- "S"开头的为SHA-1哈希值 T:9A8B7C6D5E4F3A2B... -- "T"开头的为12c+的SHA-512哈希值 ``` #### 2. **重置用户密码(推荐安全方法)** ```sql -- 无需知道原密码,直接修改为新密码 ALTER USER 指定用户名 IDENTIFIED BY 新密码; ``` - **示例**:重置`SCOTT`用户密码 ```sql ALTER USER SCOTT IDENTIFIED BY tiger_new; ``` #### 3. **特殊用户SYS/SYSTEM)处理** - **修改密码**: ```sql ALTER USER SYS IDENTIFIED BY 新密码; -- 自动更新外部密码文件 ``` - **检查状态**: ```sql SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME IN ('SYS','SYSTEM'); ``` #### 4. **兼容性处理(10g版本)** ```sql -- 10g中直接查询PASSWORD列 SELECT NAME, PASSWORD FROM SYS.USER$ WHERE NAME = '指定用户名'; ``` --- ### **关键注意事项** 1. **禁止直接修改SYS.USER$表** 手动更新哈希值可能导致数据库损坏或密码失效[^1]。 2. **哈希值不可逆** 即使获得哈希值,也无法还原为明文密码(设计如此)。 3. **权限要求** 需`SYSDBA`权限执行上述操作: ```sql CONNECT / AS SYSDBA; ``` --- ### **操作示例** ```sql -- 步骤1:检查用户密码状态 SELECT USERNAME, PASSWORD_VERSIONS, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'SCOTT'; -- 步骤2:重置密码(若无法登录) ALTER USER SCOTT IDENTIFIED BY new_pass123; -- 步骤3:验证哈希值(可选) SELECT NAME, SPARE4 FROM SYS.USER$ WHERE NAME = 'SCOTT'; ``` > **输出**:`SPARE4 = 'S:8745F1B0D3E3F7A5...'`(新密码的哈希值) --- ### **为何推荐ALTER USER?** - **安全性**:避免直接操作系统表的风险。 - **兼容性**:自动处理不同版本的密码存储机制。 - **审计支持**:记录在数据库日志中,符合安全规范[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值