Сделать более безопасный пароль для профиля пользователя
-- utlpwdmg.sql CONNECT/as sysdba CREATEORREPLACEFUNCTION verify_function ( username VARCHAR2, password VARCHAR2, old_password VARCHAR2 ) RETURNBOOLEANIS 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:='!"#$%&()``*+,-/:;<=>?_'; -- -------------------------------------------------- -- -- Проверка на совпадение имени пользователя и пароля -- -- -------------------------------------------------- -- IF NLS_LOWER(password)= NLS_LOWER(username) THEN raise_application_error(-20001,'Пароль совпадает с именем'); ENDIF; -- --------------------------------------------- -- -- Проверка минимальной длины пароля -- -- --------------------------------------------- -- IFLENGTH(password)<4THEN raise_application_error(-20002,'Длина пароля должна быть не менее 4 символов'); ENDIF; -- --------------------------------------------- -- Проверка пароля на простоту. Словарь может быть -- дополнен по желанию. -- --------------------------------------------- IF NLS_LOWER(password)IN('welcome','qwerty','database','account', 'user','password','oracle','computer', 'abcd','123456','111111')THEN raise_application_error(-20002,'Пароль слишком прост'); ENDIF; -- ---------------------------------------------- -- Проверка содержания как минимум одной цифры, -- одного символа и одного знака знака пунктуации. -- ---------------------------------------------- -- 1. Проверка на наличие цифр -- ---------------------------------------------- isdigit:=FALSE; m :=LENGTH(password); FOR i IN1..10LOOP FOR j IN1..m LOOP IFSUBSTR(password, j,1)=SUBSTR(digitarray, i,1)THEN isdigit:=TRUE; GOTO findchar; ENDIF; ENDLOOP; ENDLOOP; IF isdigit = FALSE THEN raise_application_error(-20003,'Пароль должен содержать как минимум 1 цифру, 1 символ и 1 знак пунктуации'); ENDIF; -- --------------------------------------------- -- 2. Проверка на наличие символа -- --------------------------------------------- <> ischar:=FALSE; FOR i IN1..length(chararray)LOOP FOR j IN1..m LOOP IFSUBSTR(password, j,1)=SUBSTR(chararray, i,1)THEN ischar:=TRUE; GOTO findpunct; ENDIF; ENDLOOP; ENDLOOP; IF ischar = FALSE THEN raise_application_error(-20003,'Пароль должен содержать как минимум 1 цифру, 1 символ и 1 знак пунктуации'); ENDIF; -- --------------------------------------------- -- 3. Проверка на наличие знака пунктуации -- --------------------------------------------- <> ispunct:=FALSE; FOR i IN1..length(punctarray)LOOP FOR j IN1..m LOOP IFSUBSTR(password, j,1)=SUBSTR(punctarray, i,1)THEN ispunct:=TRUE; GOTO endsearch; ENDIF; ENDLOOP; ENDLOOP; IF ispunct = FALSE THEN raise_application_error(-20003,'Пароль должен содержать как минимум 1 цифру, 1 символ и 1 знак пунктуации'); ENDIF; <> -- --------------------------------------------- -- Проверка отличия нового пароля от старого -- как минимум на три символа -- --------------------------------------------- IF old_password =''THEN raise_application_error(-20004,'Старый пароль пуст'); ENDIF; differ :=LENGTH(old_password)-LENGTH(password); IFABS(differ)<3THEN IFLENGTH(password)<LENGTH(old_password)THEN m :=LENGTH(password); ELSE m :=LENGTH(old_password); ENDIF; differ :=ABS(differ); FOR i IN1..m LOOP IFSUBSTR(password,i,1) !=SUBSTR(old_password,i,1)THEN differ := differ +1; ENDIF; ENDLOOP; IF differ <3THEN raise_application_error(-20004,'Пароль должен отличатся как минимум на три символа'); ENDIF; ENDIF; -- --------------------------------------------- -- Все хорошо возвращаем TRUE -- --------------------------------------------- RETURN(TRUE); END; /