接下来我们来说明一下oracle中关于用户锁定的状态
SQL>select username,account_status,profile from dba_users;
USERNAME ACCOUNT_STATUS PROFILE
--------------------------------------------
SYSTEM OPEN DEFAULT
SYS OPEN DEFAULT
TEST3 OPEN DEFAULT
SCOTT OPEN DEFAULT
TEST2 EXPIRED(GRACE) PROFILE2
TEST EXPIRED(GRACE) DEFAULT
MGMT_VIEW EXPIRED & LOCKED DEFAULT
在10G环境中,我们仔细查看dba_users这张视图,对应的PASSWORD这个字段,其实该字段即为我们设置的密码的HASH值,当我们的密码过期或者用户被锁定后,可以通过该字段来巧妙的规避一下该特性。
查看用户信息(10G版本)
SQL> selectusername,account_status,password from dba_users where username like 'TEST%';
USERNAME ACCOUNT_STATUS PASSWORD
---------------------------- ------------------
TEST2 OPEN 3C0731F39486287E
TEST1 OPEN C04FB3810DDE34AE
我们可以看到,以上的密码进过加密处理后显示为一串无序的HASH值。而在11G开始,oracle为了凸显密码安全性,将dba_users中的password这一列不再做显示
查看用户信息(11G版本)
SQL> select username,account_status,passwordfrom dba_users where username like '%TEST%';
USERNAME ACCOUNT_STATUS PASSWORD
---------------------------------- -----------
TEST OPEN
TESTYING3 OPEN
TEST2 EXPIRED
TEST3 OPEN
Changingpassword for dmsys
New password:
提示需要输入新密码
此时我们查看用户状态:
SQL> selectusername,account_status,password,profile from dba_users whereusername='MDSYS';
USERNAME ACCOUNT_STATUS PASSWORD PROFILE
-------------------------- ---------------------------
MDSYS EXPIRED 72979A94BAD2AF80 DEFAULT
我们从上面的实验过程看到,虽然我们将用户解锁,但是用户的状态仅仅从EXPIRED & LOCKED转为EXPIRED,并没有正常的OPEN,从新连接用户提示输入新密码。
此处就产生一个问题,可以想象一下,当提示我们输入新密码时,我们势必需要输入生产用户的原密码,否则将造成业务中间件的密码与修改的密码不一致。如果此时我们不知道原密码,势必会造成一定的麻烦。此时我们就需要dba_users视图中的password字段。Password字段虽然已经经过oracle的hash运算并加密(oracle密码采用用户名+密码的组合进行HASH加密),但是我们并不是需要知道该密码是什么,只是需要利用该字段HASH值来成功的解锁用户。
对于一个用户赋新的密码,相信大家都很了解:
alter user username> 那么我们就可以利用password的hash值进行巧妙的解锁,如下:
SQL> alter user dmsysidentified by values 'BFBA5A553FD9E28A';
User>
SQL> selectusername,account_status,password,profile from dba_users whereusername='MDSYS';
USERNAME ACCOUNT_STATUS PASSWORD PROFILE
-------------------------- ----------------- ---------
MDSYS OPEN 72979A94BAD2AF80 DEFAULT
SQL> conndmsys/dmsys
Connected.
SQL>
可以看到,虽然我们不知道该用户的密码,但是我们可以在通过password的HASH值来重置该密码。而在11G中,oracle为了提高安全性能,将DBA_USERS.password中的值不做显示,默认为空。如下:
SQL> selectusername,account_status,password from dba_users;
USERNAME ACCOUNT_STATUS PASSWORD
--------------------------------------
SYS OPEN
WMSYS OPEN
TESTYING3 OPEN
TESTYING OPEN
在11G环境中,我们可以通过USER$基表中查询得到该值,如下:
SQL> selectUSER#,name,PASSWORD from user$ where name like 'TEST%';
USER# NAME PASSWORD
------------------- ---------------------
85 TEST 48724AE7C369325F
86 TEST2 3C0731F39486287E
87 TEST3 47B23A1E17F2D107
6 rows selected.
运用同样的命令和方法,我们就可以解锁密码过期而导致的用户锁定。