ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle11g新特性:dba_users不再显示密码

Oracle11g新特性:dba_users不再显示密码

原创 Linux操作系统 作者:kidking2010 时间:2012-05-30 09:50:37 0 删除 编辑

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的结果

SYS@10g>select username,password from dba_users;
 
USERNAME                       PASSWORD
----------------------------
-- ------------------------------
SYS                            7D55A4DE0D9A4BEB
SYSTEM                         ADCB2935EDDF29D4
SOE                            552DCAEDD0062495
OUTLN                          4A3BA55E08595C81
EXFSYS                         66F4EF5650C20355
DBSNMP                         E066D214D5421CCC
WMSYS                          7C9BA362F8314299
OLAPSYS                        3FB8EF9DB538647C
TSMSYS                         3DF26A8B17D0F29F
DIP                            CE4A36B8E06CA59C

Oracle11g查询dba_users的结果

SYS@11g>select username,password from 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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: pfile与spfile
请登录后发表评论 登录
全部评论

注册时间:2011-02-27

  • 博文量
    107
  • 访问量
    302032