溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle密碼復(fù)雜度

發(fā)布時(shí)間:2020-08-14 17:28:58 來源:ITPUB博客 閱讀:184 作者:cqvienet 欄目:關(guān)系型數(shù)據(jù)庫
sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on 星期一 3月 25 22:53:24 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> @?/rdbms/admin/utlpwdmg.sql


轉(zhuǎn)自:http://blog.itpub.net/23135684/viewspace-757083/

或者自定義腳本
-----------------------------------腳本如下--------------------------------------------
CREATE OR REPLACE FUNCTION PASSWORD_VERIFY_FUNCTION 
(
  username varchar2,  
  password varchar2,  
  old_password varchar2)  
  
  RETURN boolean IS   
   n boolean;  
   m integer;  
   differ integer;  
   isdigit boolean;  
   ischar  boolean;  
   ispunct boolean;  
   db_name varchar2(40);  
   digitarray varchar2(20);  
   punctarray varchar2(25);  
   specialarray varchar2(14);  
   chararray varchar2(52);
   i_char varchar2(10);  
   simple_password varchar2(10);  
   reverse_user varchar2(32);  
  
BEGIN   
   digitarray:= '0123456789';  
   chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';  
    specialarray:= '~!@#$%^&*()_<>'; 
  
   -- 校驗(yàn)密碼長度至少為8位  
   IF length(password) < 8 THEN  
      raise_application_error(-20001, 'Password length less than 8');  
   END IF;  
  
  
   -- 校驗(yàn)密碼是否和用戶名相同  
   IF NLS_LOWER(password) = NLS_LOWER(username) THEN  
     raise_application_error(-20002, 'Password same as or similar to user');  
   END IF;  
   FOR i IN 1..100 LOOP  
      i_char := to_char(i);  
      if NLS_LOWER(username)|| i_char = NLS_LOWER(password) THEN  
        raise_application_error(-20005, 'Password same as or similar to user name ');  
      END IF;  
    END LOOP;  
  
   -- 校驗(yàn)密碼是不是用戶名的反序  
     
   FOR i in REVERSE 1..length(username) LOOP  
     reverse_user := reverse_user || substr(username, i, 1);  
   END LOOP;  
   IF NLS_LOWER(password) = NLS_LOWER(reverse_user) THEN  
     raise_application_error(-20003, 'Password same as username reversed');  
   END IF;  
  
   -- 校驗(yàn)密碼是否是服務(wù)名  
   select name into db_name from sys.v$database;  
   if NLS_LOWER(db_name) = NLS_LOWER(password) THEN  
      raise_application_error(-20004, 'Password same as or similar to server name');  
   END IF;  
   FOR i IN 1..100 LOOP  
      i_char := to_char(i);  
      if NLS_LOWER(db_name)|| i_char = NLS_LOWER(password) THEN  
        raise_application_error(-20005, 'Password same as or similar to server name ');  
      END IF;  
    END LOOP;  
  
   -- 檢查用戶密碼是否過于簡單,  
   -- 檢查密碼是否有列表中的關(guān)鍵字  
   -- 是否存在弱口令  
   IF NLS_LOWER(password) IN ('welcome1', 'database1', 'account1', 'user1234', 'password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN  
      raise_application_error(-20006, 'Password too simple');  
   END IF;  
  
   -- 檢查密碼是否為oracle  
    simple_password := 'oracle';  
    FOR i IN 1..100 LOOP  
      i_char := to_char(i);  
      if simple_password || i_char = NLS_LOWER(password) THEN  
        raise_application_error(-20007, 'Password too simple ');  
      END IF;  
    END LOOP;  
  
   -- 檢驗(yàn)密碼至少包含至少一個(gè)字母,一個(gè)數(shù)字 ,一個(gè)特殊字符  
   -- 1. 校驗(yàn)數(shù)字  
   isdigit:=FALSE;  
   m := length(password);  
   FOR i IN 1..10 LOOP   
      FOR j IN 1..m LOOP   
         IF substr(password,j,1) = substr(digitarray,i,1) THEN  
            isdigit:=TRUE;  
             GOTO findchar;  
         END IF;  
      END LOOP;  
   END LOOP;  
  
   IF isdigit = FALSE THEN  
      raise_application_error(-20008, 'Password must contain at least one digit, one character');  
   END IF;  
   -- 2. 檢驗(yàn)字符  
   <<findchar>>  
   ischar:=FALSE;  
   FOR i IN 1..length(chararray) LOOP   
      FOR j IN 1..m LOOP   
         IF substr(password,j,1) = substr(chararray,i,1) THEN  
            ischar:=TRUE;  
             GOTO endsearch;  
         END IF;  
      END LOOP;  
   END LOOP;  
   IF ischar = FALSE THEN  
      raise_application_error(-20009, 'Password must contain at least one \  
              digit, and one character');  
   END IF;  
  
  
    -- 3. 檢驗(yàn)特殊字符
   <<findchar>>  
   ischar:=FALSE;  
   FOR i IN 1..length(specialarray) LOOP   
      FOR j IN 1..m LOOP   
         IF substr(password,j,1) = substr(specialarray,i,1) THEN  
            ischar:=TRUE;  
             GOTO endsearch;  
         END IF;  
      END LOOP;  
   END LOOP;  
   IF ischar = FALSE THEN  
      raise_application_error(-20009, 'Password must contain at least one special_char');  
   END IF;  
  
  
   <<endsearch>>  
   --檢驗(yàn)密碼和上一個(gè)密碼至少有三個(gè)不同字符  
   --  
   IF old_password IS NOT NULL THEN  
     differ := length(old_password) - length(password);  
  
     differ := abs(differ);  
     IF differ < 3 THEN  
       IF length(password) < length(old_password) THEN  
         m := length(password);  
       ELSE  
         m := length(old_password);  
       END IF;  
  
       FOR i IN 1..m LOOP  
         IF substr(password,i,1) != substr(old_password,i,1) THEN  
           differ := differ + 1;  
         END IF;  
       END LOOP;  
  
       IF differ < 3 THEN  
         raise_application_error(-20011, 'Password should differ from the \  
            old password by at least 3 characters');  
       END IF;  
     END IF;  
   END IF;  
   -- Everything is fine; return TRUE ;     
   RETURN(TRUE);  
END;  



在測試環(huán)境學(xué)習(xí)oracle,出現(xiàn)用戶密碼過期的問題,更改密碼提示驗(yàn)證未通過,因?yàn)闉闇y試環(huán)境,為方便期間,不需要經(jīng)常修改密碼,在此發(fā)現(xiàn)profile的使用方法,記錄如下。
  SQL> SELECT * FROM dba_profiles ;
  查看用戶所屬的 profile ,一般為DEFAULT
  SQL>select * from dba_profiles where resource_type='PASSWORD';
  SQL> alter user lh identified by lh;
  alter user lh identified by lh
  ORA-28003: password verification for the specified password failed
  ORA-20001: Password same as or similar to user
  取消密碼管理:
  SQL>alter profile DEFAULT limit unlimited;
  如:
  SQL>alter profile DEFAULT limit password_reuse_time unlimited;
  停止密碼檢驗(yàn)函數(shù):
  SQL>alter profile DEFAULT limit password_verify_function null;
  創(chuàng)建 用戶 專用 profile:
  CREATE PROFILE test LIMIT
  SESSIONS_PER_USER       UNLIMITED
  CPU_PER_SESSION          UNLIMITED
  CPU_PER_CALL             3000
  CONNECT_TIME             45
  LOGICAL_READS_PER_SESSION   DEFAULT
  LOGICAL_READS_PER_CALL     1000
  PRIVATE_SGA             15K
  COMPOSITE_LIMIT          5000000;
  如需更改:
  SQL>alter profile test limit PASSWORD_LIFE_TIME 60 ;
  更改用戶profile
  SQL>alter user scott profile test;
  ****************************************************************
  Oracle數(shù)據(jù)庫用戶密碼過期處理
  1、sqlplus 用戶/密碼@數(shù)據(jù)庫服務(wù) as sysdba;
  2、select username,profile from dba_users;
  3、select * from dba_profiles s where s.profile='default' and resource_name='password_life_time';
  4、alter profile default limit password_life_time unlimited;
  如果用戶已經(jīng)被鎖定,則執(zhí)行5,否則不用執(zhí)行5;
  5、alter user 用戶 identified by 密碼 account unlock;

//////////////////////////////////////

/*查看用戶所屬的 profile,一般為DEFAULT*/
SELECT * FROM dba_profiles;
select * from dba_profiles where resource_type='PASSWORD' and profile=upper('PROFILE1');
/*停止密碼檢驗(yàn)函數(shù):*/
alter profile PROFILE1 limit PASSWORD_VERIFY_FUNCTION null;

alter user yufeng profile DEFAULT;

alter profile PROFILE1 limit PASSWORD_LIFE_TIME 60 ;

alter profile PROFILE1 limit password_life_time unlimited;
/*如果用戶已經(jīng)被鎖定,則執(zhí)行下面SQL,否則不用執(zhí)行;*/
alter user 用戶 identified by 密碼 account unlock;

***********************************************************************************************

=》Oracle密碼復(fù)雜度設(shè)置(Oracle_Password_Complexity)
 
一、Oracle_Password_Complexity:
 
    SQL> alter system set resource_limit = true;
 
    SQL> @ $ORACLE_HOME/RDBMS/ADMIN/utlpwdmg.sql → [verify_function|verify_function_11G]
 
    SQL> alter profile default limit password_verify_function verify_function;
 
    # 取消Oracle密碼復(fù)雜度檢查:
    SQL> alter profile default limit password_verify_function null;
 
    SQL> SELECT profile,resource_type,resource_name,limit FROM dba_profiles WHERE resource_type='PASSWORD' AND profile='DEFAULT';
 
   1.FAILED_LOGIN_ATTEMPTS: 用戶在登錄嘗試失敗n次后被鎖定。
 
   2.PASSWORD_LOCK_TIME: 登錄嘗試失敗達(dá)到指定次數(shù),用戶鎖定時(shí)長,以“Day”為單位。
 
   3.PASSWORD_LIFE_TIME: 用戶口令的生命周期。
 
   4.PASSWORD_GRACE_TIME: 表示用戶口令使用時(shí)間超過其生命周期后,可以延續(xù)使用的天數(shù),并且可延續(xù)時(shí)間內(nèi)登錄會(huì)有相應(yīng)口令即將過期的提示。
 
   5.PASSWORD_REUSE_TIME: 指定了口令不能重用前的天數(shù)。
 
   6.PASSWORD_REUSE_MAX: 在達(dá)到PASSWORD_REUSE_TIME指定時(shí)間后,要再次使用同一口令前必須改變的次數(shù)。
 
   如:PASSWORD_REUSE_TIME=30,PASSWORD_REUSE_MAX=10,用戶可以在30天以后重用該口令,要求口令必須被改變超過10次。
 
   7.PASSWORD_VERIFY_FUNCTION: Oracle允許將復(fù)雜的PL/SQL密碼驗(yàn)證腳本做為參數(shù)傳遞給PASSWORD_VERIFY_FUNCTION。并且其自己提供了一個(gè)默認(rèn)的腳本,但是用戶可以創(chuàng)建自己的驗(yàn)證規(guī)則或使用第三方軟件驗(yàn)證。
 
   8.Password Verify Function:
 
   When you create a password verify function for verifying the user password, this function can verify the following password characteristics:
 
   1.The minimum number of characters for the password.
 
   2.The characters that the password must contain, such as when a password should contain a specific number of numeric, alphabetic or special characters.  
 
   3.Whether or not the password can be the same as the username.Whether or not the new password can be similar to the previous password.
 
  Oracle 11g數(shù)據(jù)庫密碼區(qū)分大小寫的設(shè)置 → SEC_CASE_SENSITIVE_LOGON = TRUE.
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI