본문 바로가기
IT/Java

[JAVA] 정규식을 활용한 패스워드 체크 함수(regex Pattern, Matcher)

by 스터딩아재 2023. 10. 20.
반응형
사용자에게 입력받은 비밀번호가 규칙에 맞는지 체크하기 위한 함수를 알아보겠습니다. 관련 게시글을 꽤 찾아봤는데 실무에서 바로 쓸 정도로 정리된 글은 없는 것 같아 바로 복사해서 적용할 수 있게 정리하겠습니다.

 

Import

정규식 사용에 필요한 regex의 Pattern과 Matcher

import java.util.regex.Pattern;
import java.util.regex.Matcher;

 

패스워드 체크 함수

* XSS나 암복호화는 이미 처리된 후 평문으로 서버에서 체크하는 방식입니다.

public String chkPasswd(String passwd, String birth) {
	  //반복된 문자 확인
	  Pattern passPattern1 = Pattern.compile("(\\w)\\1\\1\\1");
	  Matcher passMatcher1 = passPattern1.matcher(passwd);
	 
	  // 영문 포함 확인
	  Pattern passPatternEng =  Pattern.compile("[a-zA-Z]");
	  Matcher passMatcherEng = passPatternEng.matcher(passwd);
	 
	  // 숫자 포함 확인
	  Pattern passPatternNum =  Pattern.compile("[\\d]");
	  Matcher passMatcherNum = passPatternNum.matcher(passwd);
	  
	  // 특수문자 포함 확인
	  Pattern passPatternSign =  Pattern.compile("[\\W]");
	  Matcher passMatcherSign = passPatternSign.matcher(passwd);
	  boolean includeSign = false;
	  
	  // 허용된 특수문자
	  Pattern passPatternPermitSign =  Pattern.compile("[~!#$%^*]");
	  Matcher passMatcherPermitSign = passPatternPermitSign.matcher(passwd);
	  
	  int cnt = 0;
	  if (passMatcherEng.find()){
		  cnt += 1;
	  }
	  if (passMatcherNum.find()){
		  cnt += 1;
	  }
	  if (passMatcherSign.find()){
		  cnt += 1;
		  includeSign = true;
	  }	 
	 
	  if(passMatcher1.find()){
		  return "1"; // 3자 이상 같은 문자 사용
	  }else if(continuousPwd(passwd)){
		  return "2"; // 3자 이상 연속 문자 사용 체크
	  }else if(cnt == 1){
		  return "3"; // 영문, 숫자, 특수기호 하나만 사용 체크
  	  }else if(cnt == 2 && includeSign){
  		return "4";   // 특수문자 미사용 체크
  	  }else if(birth.indexOf(passwd) > -1){
  		return "5";   // 패스워드에 생년월일 포함 체크
  	  }else if(cnt == 3 && passwd.length() < 10){
  		return "6";   // 문자 조합 및 자리수 체크
  	  }else if(cnt == 3 && !passMatcherPermitSign.find()){
  		return "7";   // 허용된 특수문자만 사용했는지 체크
  	  }else{
		return "0";    // 정상
	  }
  }

 

연속된 문자 사용 체크 함수

연속된 문자 체크를 위해 별도 함수로 추가해줍니다.

public boolean continuousPwd(String pwd) {
	  int o = 0;
	  int d = 0;
	  int p = 0;
	  int n = 0;  
	  int limit = 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;
	 }

 

그리드형

댓글