Oracle11g新特性:dba_users不再顯示密碼

kidking2010發表於2012-05-30

我們知道,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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章