http://www.ningoo.net/2007/08/27/oracle11g_new_feature_dba_users_no_longer_display_password.htm
我们知道,oracle用户的密码是加密后存储在数据字典中的,可以通过dba_users视图查看到加密后的密码。虽然密码是经过加密存储的,但是从信息安全的角度来看,暴露的信息越多越不安全,所以即使是加密后的密码泄漏,也可能造成很严重的安全问题。所以,在Oracle11g中,除了可以选择加强的密码算法,更加严格的密码强度,还有一点加强,就是不再在dba_uses.password中显示加密后的密码了。
Oracle10g查询dba_users的结果
USERNAME PASSWORD
---------------------------- -- ------------------------------
SYS 7 D55A4DE0D9A4BEB
SYSTEM ADCB2935EDDF29D4
SOE 552 DCAEDD0062495
OUTLN 4 A3BA55E08595C81
EXFSYS 66 F4EF5650C20355
DBSNMP E066D214D5421CCC
WMSYS 7 C9BA362F8314299
OLAPSYS 3 FB8EF9DB538647C
TSMSYS 3 DF26A8B17D0F29F
DIP CE4A36B8E06CA59C
Oracle11g查询dba_users的结果
USERNAME PASSWORD
------------------ -- ------------------------------
SYS
SYSTEM
NING
TEST
OUTLN
DBSNMP
WMSYS
TSMSYS
DIP
Oracle11g在用户安全性方面的加强,还有:
密码区分大小写
可以通过初始化参数sec_case_sensitive_logon来控制密码是否大小写敏感,默认TRUE
密码复杂性检查
通过执行以下脚本生成密码复杂性检查函数verify_function_11G
@$ORACLE_HOME/RDBMS/ADMIN/utlpwdmg.sql
然后设置profile使用该函数来检查密码即可
ALTER PROFILE default PASSWORD_VERIFY_FUNCTION verify_function_11G;
强度更高的Hash加密算法
Oracle11g采用安全散列算法(Secure Hash Algorithm)SHA-1做为新的加密算法,但貌似这个算法已经开始不那么安全了。
引自:http://space.itpub.net/24005010/viewspace-711795
ORACLE数据库用户名密码被加密过我们看不懂,因此很多时候我们在检查测试用户名和密码相同的情况会采用先从dba_users视图取用户password值
SQL> select username,password from dba_users;
USERNAME PASSWORD
------------------------------ ------------------------------
YYJ 27317D6A1D4800BD
ASSET 733CCCA926CC3319
SCOTT CDC57F9E62A38D03
TESTMZH F32F644F6D2FF07B
BI EB32A21961929D0C
PM C7A235E6D2AF6018
IX 885DA62CD26FED7E
SH 54B253CBBAAA8C48
OE D1A2DFC623FDA40A
HR 4C6D73C3E8B0F0DA
例如yyj用户的加密密码为27317D6A1D4800BD,先将这个值记录下来=a
之后我们会修改用户密码改为相同的,alter user yyj identified by yyj;
此时我们再从dba_users里查询password加密密码b,如果a=b,那么就认为用户名密码相同
如果a≠b,认为密码与用户名不相同,账户安全。此时再将密码改回a。
语法与明码改密码略有不同
alter user yyj identified by values '27317D6A1D4800BD';
然而在11gR2的环境中,这种方法会出问题,因为11g的dba_users视图中的password一般情况下是为空的(从该视图的相关语句可以看出当用户被创建为全局或外部认证时password才有加密值)。
SQL> select username,password from dba_users;
USERNAME PASSWORD
------------------------------ ------------------------------
MGMT_VIEW
SYS
SYSTEM
DBSNMP
SYSMAN
YYJ
OUTLN
APPQOSSYS
WMSYS
DIP
ORACLE_OCM
这种情况下很显然会将密码置为空。在存储过程中如果我们强行将密码设为NULL,会报600的错误,同时密码被置于未知。在10g中能将密码设为空,但连接密码未知
SQL> alter user yyj identified by values '';
alter user yyj identified by values ''
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kzsviver:1], [], [], [], [], [],
[], [], [], [], [], []
当然,如果真要用上述方法来验证密码的话,也可以从user$里查到相关加密密码
SQL> select name,password from user$ where name in (select username from dba_users);
NAME PASSWORD
------------------------------ ------------------------------
MGMT_VIEW CBE59D420599A775
SYS 8A8F025737A9097A
SYSTEM 2D594E86F93B17A1
DBSNMP FFF45BB2C0C327EC
SYSMAN 2CA614501F09FCCC
YYJ 27317D6A1D4800BD
OUTLN 4A3BA55E08595C81
APPQOSSYS 519D632B7EE7F63A
WMSYS 7C9BA362F8314299
DIP CE4A36B8E06CA59C
ORACLE_OCM 5A2E026A9157958C
事实上dba_users就是结合user$等相关基表创建的视图
从dba_uses视图的相关语句可以看出当用户被创建为全局或外部认证时password才有加密值,而10g中dba_users的password列完全取值与user$的password列值
相关SQL
10g:
select u.name, u.user#, u.password,
m.status,
decode(u.astatus, 4, u.ltime,
5, u.ltime,
6, u.ltime,
8, u.ltime,
9, u.ltime,
10, u.ltime, to_date(NULL)),
decode(u.astatus,
1, u.exptime,
2, u.exptime,
5, u.exptime,
6, u.exptime,
9, u.exptime,
10, u.exptime,
decode(u.ptime, '', to_date(NULL),
decode(pr.limit#, 2147483647, to_date(NULL),
decode(pr.limit#, 0,
decode(dp.limit#, 2147483647, to_date(NULL), u.ptime +
dp.limit#/86400),
u.ptime + pr.limit#/86400)))),
dts.name, tts.name, u.ctime, p.name,
nvl(cgm.consumer_group, 'DEFAULT_CONSUMER_GROUP'),
u.ext_username
from sys.user$ u left outer join sys.resource_group_mapping$ cgm
on (cgm.attribute = 'ORACLE_USER' and cgm.status = 'ACTIVE' and
cgm.value = u.name),
sys.ts$ dts, sys.ts$ tts, sys.profname$ p,
sys.user_astatus_map m, sys.profile$ pr, sys.profile$ dp
where u.datats# = dts.ts#
and u.resource$ = p.profile#
and u.tempts# = tts.ts#
and u.astatus = m.status#
and u.type# = 1
and u.resource$ = pr.profile#
and dp.profile# = 0
and dp.type#=1
and dp.resource#=1
and pr.type# = 1
and pr.resource# = 1
11g:
select u.name, u.user#,
decode(u.password, 'GLOBAL', u.password,
'EXTERNAL', u.password,
NULL),
m.status,
decode(u.astatus, 4, u.ltime,
5, u.ltime,
6, u.ltime,
8, u.ltime,
9, u.ltime,
10, u.ltime, to_date(NULL)),
decode(u.astatus,
1, u.exptime,
2, u.exptime,
5, u.exptime,
6, u.exptime,
9, u.exptime,
10, u.exptime,
decode(u.ptime, '', to_date(NULL),
decode(pr.limit#, 2147483647, to_date(NULL),
decode(pr.limit#, 0,
decode(dp.limit#, 2147483647, to_date(NULL), u.ptime +
dp.limit#/86400),
u.ptime + pr.limit#/86400)))),
dts.name, tts.name, u.ctime, p.name,
nvl(cgm.consumer_group, 'DEFAULT_CONSUMER_GROUP'),
u.ext_username,
decode(length(u.password),16,'10G ',NULL)||NVL2(u.spare4, '11G ' ,NULL),
decode(bitand(u.spare1, 16),
16, 'Y',
'N'),
decode(u.password, 'GLOBAL', 'GLOBAL',
'EXTERNAL', 'EXTERNAL',
'PASSWORD')
from sys.user$ u left outer join sys.resource_group_mapping$ cgm
on (cgm.attribute = 'ORACLE_USER' and cgm.status = 'ACTIVE' and
cgm.value = u.name),
sys.ts$ dts, sys.ts$ tts, sys.profname$ p,
sys.user_astatus_map m, sys.profile$ pr, sys.profile$ dp
where u.datats# = dts.ts#
and u.resource$ = p.profile#
and u.tempts# = tts.ts#
and u.astatus = m.status#
and u.type# = 1
and u.resource$ = pr.profile#
and dp.profile# = 0
and dp.type#=1
and dp.resource#=1
and pr.type# = 1
and pr.resource# = 1
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23141985/viewspace-731442/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23141985/viewspace-731442/