본문 바로가기

DBMS

PL/SQL 패스워드 검증

반응형

 

 

       
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
l_char char(1);
l_rsvpwd varchar2(100);
 
BEGIN 
digitarray:= '0123456789';
chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
punctarray:='!"#$%&()``*+,-/:;<=>?_';
 

 

더보기

 

 
1
2
3
4
-- 암호가 사용자 이름과 동일한지 확인합니다.
IF NLS_LOWER(password) = NLS_LOWER(username) THEN
raise_application_error(-20001, 'Password same as or similar to user');
END IF;

 

NLS_LOWER : 소문자로 표시된 문자열을 리턴합니다.
 

 

더보기
 
1
2
3
4
-- 패스워드 길이가 8자이상 16자 미만이여야 합니다.
IF (length(password) < 8 OR length(password) > 15 ) THEN
raise_application_error(-20002, 'Password length must be between 8 and 15 characters');
END IF;

 

더보기

 

 
1
2
3
4
-- 암호가 너무 간단한 단어인지 확인합니다. 
IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN
raise_application_error(-20002, 'Password too simple');
END IF;

 

더보기
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 암호에 하나 이상의 문자, 숫자가 1개 이상 포함되어 있는지 확인합니다.
 
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;

 

substr : 문자열 추출

ex) SELECT substr('ABC다람쥐W2', 3) FROM DUAL;

     결과 : C다람쥐W2

    

    SELECT substr('ABC다람쥐W2' 4, 3) FROM DUAL;

     결과 : 다람쥐   [ 4번째 자리부터 3글자 ]

 

더보기

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<<endsearch>>
-- 암호가 이전 암호와 다른지 확인합니다
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;

 

 

더보기
 


1
2
3
4
5
6
7
8
9
10
11
12
-- 역 방향 암호와 사용자 이름은 서로 달라야 한다.
FOR i IN 1 .. LENGTH(password) LOOP
l_char := SUBSTR(password, -i , 1);
l_rsvpwd := CONCAT(l_rsvpwd,l_char);
END LOOP;
 
IF REGEXP_SUBSTR(NLS_LOWER(l_rsvpwd),NLS_LOWER(username)) IS NOT NULL THEN
raise_application_error(-20005,'Reversed Password contains username');
END IF;
 
RETURN(TRUE);
END;

 REGEXP_SUBSTR : 문자열에서 정규 표현식 패턴을 검색하여 추출되는 문자를 반환합니다.

 

 

 

반응형

'DBMS' 카테고리의 다른 글

SQL 감사 기록 삭제 & 백업  (0) 2017.09.24
SQL AUDIT(감사 조회 , 감사 설정)  (0) 2017.09.19
PL/SQL - 프로시저 생성  (0) 2017.09.18
DB 사용자 생성 - 권한부여/제거  (0) 2017.09.05
DB 암호 정책 설정  (0) 2017.09.05