oracle口令管理

1, 口令文件信息查詢 口令文件中存儲着擁有sysdba或者sysoper權限的用戶. 這裏我們首先檢查一下每個系統中有哪些用戶擁有管理權限. 使用語句select * from v$pwfile_users可以完成這步操作. USERNAME SYSDBA SYSOPER SYS TRUE TRUE CTLKF TRUE FALSE 2, 查詢用戶的資源信息 select du.username, du.profile, dp.resource_name,dp.limit from dba_users DU, dba_profiles DP where du.profile = dp.profile and dp.resource_name in ('FAILED_LOGIN_ATTEMPTS', --允許用戶輸入多少次口令錯誤,超過允許次數後,賬號被鎖定 'PASSWORD_VERIFY_FUNCTION', --密碼驗證函數 'PASSWORD_LOCK_TIME', --鎖定用戶的時間(單位爲天) 'PASSWORD_LIFE_TIME', --口令的有效期, 過期提醒 'PASSWORD_GRACE_TIME' , --口令的提醒天數, 這期間口令仍然可用 'PASSWORD_REUSE_MAX', -- 口令歷史記錄保留次數 'PASSWORD_REUSE_TIME' -- 口令歷史記錄保留時間 ) order by du.username; USERNAME PROFILE RESOURCE_NAME LIMIT SYS DEFAULT FAILED_LOGIN_ATTEMPTS UNLIMITED SYS DEFAULT PASSWORD_LIFE_TIME UNLIMITED SYS DEFAULT PASSWORD_GRACE_TIME UNLIMITED SYS DEFAULT PASSWORD_LOCK_TIME UNLIMITED SYS DEFAULT PASSWORD_VERIFY_FUNCTION NULL 3. 修改口令資源 也可以使用下面的語句完成同樣的效果. ALTER PROFILE "DEFAULT" FAILED_LOGIN_ATTEMPTS 5 --允許用戶輸入多少次口令錯誤,超過允許次數後,賬號被鎖定 PASSWORD_VERIFY_FUNCTION verify_Function --密碼驗證函數 PASSWORD_LOCK_TIME 0.0416 --鎖定用戶的時間(單位爲天) PASSWORD_LIFE_TIME unlimited --口令的有效期, 過期提醒 PASSWORD_GRACE_TIME unlimited --口令的提醒天數, 這期間口令仍然可用 PASSWORD_REUSE_MAX 1 -- 口令歷史記錄保留次數 PASSWORD_REUSE_TIME unlimited -- 口令歷史記錄保留時間 4,口令複雜性檢查函數 口令複雜性檢查函數password_verify_function是oracle中自帶的, 作爲複雜性函數中的default檢查函數, 但是缺省這個函數沒有創建, 需要運行在oracle軟件主目錄下的rdbms/admin下的utlpwdmg.sql纔可以使用. SQL> conn sys/sys as sysdba 已連接。 SQL> @E:/oracle/ora92/rdbms/admin/utlpwdmg.sql 函數已創建。 配置文件已更改 默認的函數可以檢查密碼是否與用戶名相同, 是否小於4個字符, 是否是一組特定的詞, 密碼中是否包含一個字符, 一個數字和一個標點符號, 然後再和舊口令進行對照. 當然,用戶也可以修改或者創建自己的口令複雜度函數, 然後啓用. CREATE OR REPLACE FUNCTION verify_function (username varchar2, password varchar2, old_password varchar2) RETURN boolean IS n boolean; m integer; differ integer; isdigit boolean; ischar boolean; ispunct boolean; digitarray varchar2(20); punctarray varchar2(25); chararray varchar2(52); BEGIN digitarray:= '0123456789'; chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; punctarray:='!"#$%&()``*+,-/:;<=>?_'; -- Check if the password is same as the username IF NLS_LOWER(password) = NLS_LOWER(username) THEN raise_application_error(-20001, 'Password same as or similar to user(密碼和用戶不能相同...)'); END IF; -- Check for the minimum length of the password IF length(password) < 4 THEN raise_application_error(-20002, 'Password length less than 4(密碼長度必須大於等於4)'); END IF; -- Check if the password is too simple. A dictionary of words may be -- maintained and a check may be made so as not to allow the words -- that are too simple for the password. IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN raise_application_error(-20002, 'Password too simple(暈, 這都想得出來...)'); END IF; -- Check if the password contains at least one letter, one digit and one -- punctuation mark. -- 1. Check for the digit 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(-20003, 'Password should contain at least one digit, one character and one punctuation(密碼至少包含一個數字...)'); END IF; -- 2. Check for the character <> 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 findpunct; END IF; END LOOP; END LOOP; IF ischar = FALSE THEN raise_application_error(-20003, 'Password should contain at least one / digit, one character and one punctuation(密碼至少包含一個字符...)'); END IF; -- 3. Check for the punctuation <> ispunct:=FALSE; FOR i IN 1..length(punctarray) LOOP FOR j IN 1..m LOOP IF substr(password,j,1) = substr(punctarray,i,1) THEN ispunct:=TRUE; GOTO endsearch; END IF; END LOOP; END LOOP; IF ispunct = FALSE THEN raise_application_error(-20003, 'Password should contain at least one / digit, one character and one punctuation(密碼至少包含一個標點...)'); END IF; <> -- Check if the password differs from the previous password by at least -- 3 letters IF old_password IS NOT NULL THEN differ := length(old_password) - length(password); IF abs(differ) < 3 THEN IF length(password) < length(old_password) THEN m := length(password); ELSE m := length(old_password); END IF; differ := abs(differ); 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(-20004, 'Password should differ by at / least 3 characters(新密碼跟舊密碼至少有三個字符不同...)'); END IF; END IF; END IF; -- Everything is fine; return TRUE ; RETURN(TRUE); END; 5, 修改用戶密碼 1, 使用alter user 使用sysdba權限用戶登錄後, 可以用下屬語句修改用戶密碼. Alter user username identified by password; 2, 使用password SQL> password 更改SYS的口令 舊口令: 新口令: 重新鍵入新口令: 口令已更改 3, 修改超級用戶sys密碼 A, 使用conn / as sysdba 登錄, 然後使用alter user sys identified by password B, 刪除口令文件, 然後在dos控制檯使用orapwd修改. C:/Documents and Settings/Administrator>orapwd Usage: orapwd file= password= entries= where file - name of password file (mand), password - password for SYS (mand), entries - maximum number of distinct DBA and OPERs (opt), There are no spaces around the equal-to (=) character. C:/Documents and Settings/Administrator>orapwd file=PWDordDB.ora password=sys.47522341 entries=5 6, 強制過期所有用戶密碼 begin for myrec in ( select username from dba_users ) loop execute immediate 'alter user '||myrec.username||' password expire'; end loop; end; -- 強制修改所有用戶密碼 begin for myrec in ( select username from dba_users ) loop execute immediate 'alter user '||myrec.username||' identified by '||myrec.username||'_47522341'; end loop; end; 7, 測試修改口令後需要的工作量. 1, C/S環境. 環境建立: 在delphi中創建oracle連接, 設置密碼, 打開一個數據表. 測試目的: 將密碼過期後, 查看再次登錄是否需要修改密碼. 測試結論: 如果用戶強制將密碼過期, 那麼所有已經發布的登錄也要在修改完密碼後重新配置連接字符串.
發佈了86 篇原創文章 · 獲贊 5 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章