반응형
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:='!"#$%&()``*+,-/:;<=>?_';
|
더보기
1234 -- 암호가 사용자 이름과 동일한지 확인합니다.IF NLS_LOWER(password) = NLS_LOWER(username) THENraise_application_error(-20001, 'Password same as or similar to user');END IF;
NLS_LOWER : 소문자로 표시된 문자열을 리턴합니다.
더보기
1234 -- 패스워드 길이가 8자이상 16자 미만이여야 합니다.IF (length(password) < 8 OR length(password) > 15 ) THENraise_application_error(-20002, 'Password length must be between 8 and 15 characters' );END IF;
더보기
1234 -- 암호가 너무 간단한 단어인지 확인합니다.IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THENraise_application_error(-20002, 'Password too simple');END IF;
더보기
123456789101112131415 -- 암호에 하나 이상의 문자, 숫자가 1개 이상 포함되어 있는지 확인합니다.isdigit:=FALSE;m := length(password);FOR i IN 1..10 LOOPFOR j IN 1..m LOOPIF substr(password,j,1) = substr(digitarray,i,1) THENisdigit:=TRUE;GOTO findchar;END IF;END LOOP;END LOOP;IF isdigit = FALSE THENraise_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글자 ]
더보기
12345678910111213141516171819202122232425 <<endsearch>>-- 암호가 이전 암호와 다른지 확인합니다IF old_password IS NOT NULL THENdiffer := length(old_password) - length(password);IF abs(differ) < 3 THENIF length(password) < length(old_password) THENm := length(password);ELSEm := length(old_password);END IF;differ := abs(differ);FOR i IN 1..m LOOPIF substr(password,i,1) != substr(old_password,i,1) THENdiffer := differ + 1;END IF;END LOOP;IF differ < 3 THENraise_application_error(-20004, 'Password should differ by at \least 3 characters');END IF;END IF;END IF;
더보기
123456789101112 -- 역 방향 암호와 사용자 이름은 서로 달라야 한다.FOR i IN 1 .. LENGTH(password) LOOPl_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 THENraise_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 |