2.查看密码策略
SQL> select * from dba_profiles where resource_NAME=‘PASSWORD_VERIFY_FUNCTION‘;
3.登录PL/SQL,以sysdba方式登录,密码输入默认密码 change_on_install
4.执行两个Funtion
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) < 9 THEN
raise_application_error( - 20002 , ‘ Password length less than 9 ‘ );
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
<< 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 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
<< findpunct >>
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 ;
<< endsearch >>
-- 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 ;
CREATE OR REPLACE FUNCTION verify_function_11G
(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 );
chararray varchar2 ( 52 );
i_char varchar2 ( 10 );
simple_password varchar2 ( 10 );
reverse_user varchar2 ( 32 );
BEGIN
digitarray: = ‘ 0123456789 ‘ ;
chararray: = ‘ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ‘ ;
-- Check for the minimum length of the password
IF length(password) < 8 THEN
raise_application_error( - 20001 , ‘ Password length less than 8 ‘ );
END IF ;
-- Check if the password is same as the username or username(1-100)
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;
-- Check if the password is same as the username reversed
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 ;
-- Check if the password is the same as server name and or servername(1-100)
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;
-- 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 ( ‘ welcome1 ‘ , ‘ database1 ‘ , ‘ account1 ‘ , ‘ user1234 ‘ , ‘ password1 ‘ , ‘ oracle123 ‘ , ‘ computer1 ‘ , ‘ abcdefg1 ‘ , ‘ change_on_install ‘ ) THEN
raise_application_error( - 20006 , ‘ Password too simple ‘ );
END IF ;
-- Check if the password is the same as oracle (1-100)
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;
-- Check if the password contains at least one letter, one digit
-- 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( - 20008 , ‘ Password must contain at least one digit, one character ‘ );
END IF ;
-- 2. Check for the character
<< 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 ;
<< endsearch >>
-- 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);
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 ;
5. 设置密码策略
SQL> alter system set resource_limit = true;
SQL> alter profile default limit password_verify_function verify_function;
6.查看密码策略是否设置成功
SQL> select * from dba_profiles where resource_NAME=‘PASSWORD_VERIFY_FUNCTION‘;
Oracle修改密码复杂度策略
标签:dba name ast lte zab 查看 复杂度 tar fine
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did117463