Oracle Password Verify Function

Database’ in güvenliği için kritik olan kısımlardan biride database’ e erişim sağlayan userların şifreleridir. Bu şifrelerin kolay tahmin edilemeyen bir kombinasyondan oluşuyor olması istenilen bir durumdur. Oracle software sunucunuza install ettiğiniz anda ORACLE_HOME altında rdbms/admin dizini altındaki utlpwdmg.sql dosyasında oracle’ ın sizin kullanabilmeniz için hazırladığı bir password verify functionını bulabilirsiniz. Bu functiondaki kurallarda aslına bakarsanız hiç editlemeye bile gerek olmadan kullanabilirsiniz, ihtiyacınızı fazlasıyla karşılayacağından emin olabilirsiniz.

Nettede baktığınız da bu konuda bir sürü yazı ve çeşitli şekillerde düzenlemiş password verify functionları bulabilirsiniz. Bir password verify functionıda ben eklemek istedim. Aşağıdaki function ile şifre oluşturulurken hangi kriterlerin dikkate alındığını function içerisindeki commetli alanlardan görebilirsiniz ;

CREATE OR REPLACE FUNCTION sys.password_verify_function
(username varchar2,
password varchar2,
old_password varchar2)
RETURN boolean IS
n boolean;
m integer;
differ integer;
digit_count integer;
char_count 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 can not be same as the username’);
END IF;
— Check for the minimum length of the password
IF length(password) < 8 THEN raise_application_error(-20002, 'minimum length of passwords is 8'); 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','12345abc','abc12345','abcde123','123abcde','ab123456','123456ab','abcdef12','12abcdef','abcd1234','1234abcd','welcome1', 'database1', 'account1', 'user1234', 'password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN raise_application_error(-20002, 'Password is too simple'); END IF; -- Check if the password contains at least 2 letter and 2 digit -- 1. Check for the digit digit_count:=0; char_count :=0; 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 digit_count:= digit_count + 1; if digit_count = 2 then isdigit:=TRUE; GOTO findchar; end if; END IF; END LOOP; END LOOP; IF isdigit = FALSE THEN raise_application_error(-20003, 'Password should contain at least 2 letter and 2 digit '); 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
char_count := char_count + 1;
if char_count =2 then
ischar:=TRUE;
end if;
END IF;
END LOOP;
END LOOP;
IF ischar = FALSE THEN
raise_application_error(-20003, ‘Password should contain at least 2 letter and 2 digit ‘);
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, ' Check if the password differs from the previous password by at least 3 letters '); END IF; END IF; END IF; -- Everything is fine; return TRUE ; RETURN(TRUE); END; /

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


üç × = 12