Development record of developer who study hard everyday.

레이블이 자바 정규표현식인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바 정규표현식인 게시물을 표시합니다. 모든 게시물 표시
, , , , ,

안드로이드 자바 비밀번호 유효성 검사 예제 코드

안드로이드 자바 비밀번호 유효성 검사 예제 코드

안드로이드 개발

회사에서 기존 프로젝트 유지보수를 맡았다.

KISA에서 보안점검?이 나왔는데 보안정책을 강화하라는게 주요 내용이였다.

그 중에 주목할만한 내용이 비밀번호 유효성 검사 강화였다.

안드로이드를 자바로 처음 공부할 때 정규표현식에 대해서 한 번 훑어본 적만 있었지 제대로 써본 적이 없었다.

이번 기회에 제대로 정규표현식을 써보면서 공부한 것들을 기록해본다.

public class ValidationUtil {
public static final String pwdPattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[~!@#$%^&*()_+])[A-Za-z[0-9]~!@#$%^&*()_+]{8,20}$";    //1
public static final String sameCharacterPattern = "(\\w)\\1\\1";    //2
public static final String continuousKeyboardPattern = "qwe|wer|ert|rty|tyu|yui|uio|iop|asd|sdf|dfg|fgh|ghj|hjk|jkl|zxc|xcv|cvb|vbn|bnm";    //3

public static Boolean validateDefaultRule(String pwd) {    //1
Matcher defaultMatch = Pattern.compile(pwdPattern).matcher(pwd);    //비교를 위한 Matcher 인스턴스 생성
if (!defaultMatch.find()) return false;
else return true;
}

public static Boolean validateSameCharacterPattern(String pwd) {    //2
Matcher samePwdMatch = Pattern.compile(sameCharacterPattern).matcher(pwd);
if(samePwdMatch.find()) return false;
else return true;
}

public static Boolean validateContinuousKeyboardPattern(String pwd) {    //3
Matcher continuousKeyboardMatch = Pattern.compile(continuousKeyboardPattern).matcher(pwd);
if(continuousKeyboardMatch.find()) return false;
else return true;
}
}

비밀번호 유효성 검사를 할 때마다 사용하는 정규표현식과 유효성 검사 함수를 


1 => 영문 대소문자, 숫자, 특수문자 포함 8~12자리

2 => 같은 단어(영어 or 숫자) 3번 이상

3 => 키보드 상의 나란히 배열된 단어 3자


👉 개인적으로 구글링하면서 "3: 키보드 상의 나란히 배열된 단어 3자"의 정규표현식이 쇼킹했다. ㅋㅋ

어떻게 저 내용을 정규표현식으로 작성할 수 있을까? 고민했는데 그냥 노가다로 처리하는걸 보고서 놀랐다. ㅋㅋㅋㅋ

근데 다시금 생각해보니까 짜피 경우의 수가 그리 많지 않아서 노가다로 적어주는게 훨씬 깔끔하다고 생각했다.


👀👀 이외의 많이 쓰이는 정규표현식

public static final String pattern1 = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[$@$!%*#?&])[A-Za-z[0-9]$@$!%*#?&]{8,20}$"; //영문, 숫자,특수문자 8~20자리
public static final String pattern2 = "^[A-Za-z[0-9]]{10,20}$"; //영문, 숫자 10자 ~ 20자
public static final String pattern3 = "^[[0-9]$@$!%*#?&]{10,20}$"; //영문, 특수문자 10~20자
public static final String pattern4 = "^[[A-Za-z]$@$!%*#?&]{10,20}$"; //특수문자, 영문 10~20자


/**
* 연속 문자, 숫자 4자리 체크
* => 개인적으로 이해해보려고했는데 그냥 포기했다;;
* @param pwd
* @return
*/

public boolean continuousPwd(String pwd) {
int o = 0;
int d = 0;
int p = 0;
int n = 0;
int limit = 4;    //만약 연속 문자나 숫자 3자리면 4 => 3

for (int i = 0; i < pwd.length(); i++) {

char tempVal = pwd.charAt(i);
if (i > 0 && (p = o - tempVal) > -2 && (n = p == d ? n + 1 : 0) > limit - 3) {
return true;
}
d = p;
o = tempVal;
}

return false;
}


차라리 위의 코드보다 내가 생각했을 땐 아래 정규표현식이 더 직관적이고 깔끔한 것 같다.

public static final String continuousWordPattern = "abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|vwx|wxy|xyz|012|123|234|345|456|567|678|789";

ㅋㅋㅋ 노가다지만 이게 더 보는 사람 입장에서 이해가 쉬워서 좋다.


                                         

위의 코드를 참고해서 변형하면 실무에서 비밀번호나 아이디 유효성 검사는 왠만큼 커버가 가능할거라고 생각한다.


이제 좀 더 본질적으로 정규표현식으로 유효성 검사를 할 때 사용하는 Pattern 클래스와 Matcher 클래스에 대해서 알아보자.











Share:
Read More