본문 바로가기

IT/JavaScript

정규표현식 - 비밀번호 체크 및 안전성 검사

//비밀번호 안전성 검사


var pwdValue = document.querySelector("[name='user_pwd']");

pwdValue.addEventListener("change", function(evt){

pwdValid = false;

var pwdValueNow = pwdValue.value;

var reg = {

blank:/[\s]/g,

lower : /[a-z]/g,

upper : /[A-Z]/g,

number :/[0-9]/g,

special : /[!@#$%^&*()]/g

}; //special 은 /W/g 입력하면 숫자,영문(대/소)을 제외한 모든 문자 의미 현재는 임의값 정해준것.

//공백있으면 바로 return 

var blank=(pwdValueNow.match(reg['blank']) || []).length > 0 ? 1 : 0 ;

if(blank === 1){

pwdResult.innerHTML="<span style=\"color:red\">비밀번호에 공백은 입력할 수 없습니다.</span>";

return;

}

var number =(pwdValueNow.match(reg['number']) || []).length > 0 ? 1: 0;

// []은 null 값이 생기면 안되므로 추가한것, [] 은 length가 0이므로 0을  리턴

var lower =(pwdValueNow.match(reg['lower']) || []).length > 0 ? 1 : 0 ;

var upper =(pwdValueNow.match(reg['upper']) || []).length > 0 ? 1 : 0 ;

var special =(pwdValueNow.match(reg['special']) || []).length > 0 ? 1 : 0 ; 

var pwdSum = number+lower+upper+special;

//연속성 검사 

var SamePass_0 = 0; // 동일 문자 카운트

var SamePass_1 = 0; // 연속성(+) 카운트

var SamePass_2 = 0; // 연속성(-) 카운트

for(var i=0; i<pwdValueNow.length; i++){

var chr_pass_0 =pwdValueNow.charAt(i); //패스워드의 i번째 문자 선택

var chr_pass_1 =pwdValueNow.charAt(i+1);

var chr_pass_2 = pwdValueNow.charAt(i+2);

//동일 문자 카운트 

if(chr_pass_0 == chr_pass_1 && chr_pass_1 == chr_pass_2){

SamePass_0 = SamePass_0 + 1;

}

//연속성(+) 카운트 , charCodeAt(n):n번째 자리의 아스키코드 값

if(chr_pass_1.charCodeAt(0) - chr_pass_0.charCodeAt(0) == 1 && 

chr_pass_2.charCodeAt(0) - chr_pass_1.charCodeAt(0) == 1){

SamePass_1 = SamePass_1 +1 ;

}

//연속성(-) 카운트

if(chr_pass_1.charCodeAt(0) - chr_pass_0.charCodeAt(0) == -1 && 

chr_pass_2.charCodeAt(0) - chr_pass_1.charCodeAt(0) == -1){

SamePass_2 = SamePass_2 +1 ;

}

}

// 숫자, 영어(소문자,대문자), 특수문자  총4단계

// 하나의 문자는 사용불가 

if(pwdSum == 1) {

pwdResult.innerHTML="<span style=\"color:red\">

영문, 숫자,특수문자 중 2가지 이상을 혼합하여 주세요</span>";

return;

}

// 쉬움 : 2단계  (2개조합)

else if(pwdSum == 2){

pwdResult.innerHTML="<span style=\"color:#afaf07\">쉬움</span>";

pwdValid = true;

return;

}

// 안전 : 3단계 (3개조합 / 동일한 문자 반복 없음 )

else if(pwdSum == 3 && SamePass_0 < 1){

pwdResult.innerHTML="<span style=\"color:green\">안전</span>";

pwdValid = true;

return;

}

// 어려움 : 4단계 (4개 조합 / 동일한 문자 반복 , 연속성 없음 / 20자 미만)

else if(pwdSum == 4  && (SamePass_0 +SamePass_1 +SamePass_2) < 1 && 

pwdValueNow.length < 20)

  {

pwdResult.innerHTML="<span style=\"color:navy\">어려움</span>";

pwdValid = true;

return;

}

// 최종판: 4단계 (4개 조합 / 동일한 문자 반복, 연속성 없음 / 20자)

else if(pwdSum == 4 && (SamePass_0 +SamePass_1 +SamePass_2) < 1 && 

pwdValueNow.length == 20){

pwdResult.innerHTML="<span style=\"color:purple\">매우어려움</span>";

pwdValid = true;

return;

}

});