2011-03-04 2 views
0

다음 정규식을 사용하여 암호 강도를 검증하고 있습니다.긍정적 인 look ahead 정규식에 문자의 화이트리스트를 추가하는 방법

^(?=.*[a-z]{1,})(?=.*[A-Z]{1,})(?=.*[0-9]{1,})(?=.*[@\#\$%\^&\+=!\?\*]{1,}).{8,12}$ 

8-12 문자, 적어도 1 소문자, 1 대문자, 1 개 번호, 승인 된 목록에서 1 개 특수 문자. (나는 앞으로의 모습을 {1,4}로 설정하고 올바르게 작동시킬 수는 없다는 것을 알고 있지만, 곧 해결할 수 있기를 바란다.)

표현식 조금 장황하게 보이지만 내 사용자가 자신의 암호 규칙을 설정할 수 있습니다. 정규 표현식에서 상호 교환 가능한 부분을 만드는 가장 좋은 방법 인 것 같습니다. 나는 모든 문자가 일치하지 말아야 라인을 설정하지 않을 경우 모든 문자 집합

[A-Z]|[a-z]|[0-9]|[@\#\$%\^&\+=!\?\*] 

에 있어야 추가 할 이에

.

불행히도, 이것을 표현하는 올바른 방법을 찾지 못했습니다. 어떤 도움이라도 대단히 감사합니다.

토론과 관련이 있다면 .NET 구현을 사용하고 있습니다.

+0

왜 사용자가 추가 문자를 사용하지 못하게합니까? 이렇게하면 암호 강도가 줄어 듭니다. – zzzzBov

+0

일반적으로 저는 여러분에게 동의합니다. 그러나이 경우에는 단순히 비즈니스 요구 사항을 충족시키기 위해 노력하고 있습니다. –

답변

1

집합에 정의되지 않은 항목이있는 경우 음수로 둘러보기를 사용하여 일치가 실패 할 수 있습니다. 하나 개의 클래스에

첫째, 그룹의 모든 문자와 시작 부분에 캐럿을 사용하여이 클래스에서 아무것도 하지 일치하도록 지정 :

[^[email protected]\#\$%\^&\+=!\?\*] 

다음이 부정적으로 패턴 업데이트 문자 클래스와 모양 주위에 부정적인 : 당신은 더 이스케이프를 제거하여 패턴을 정리할 수 있도록

@"^(?!.*[^[email protected]\#\$%\^&\+=!\?\*])(?=.*[a-z]{1,})(?=.*[A-Z]{1,})(?=.*[0-9]{1,})(?=.*[@\#\$%\^&\+=!\?\*]{1,}).{8,12}$" 

또한, 일반적으로, 문자 클래스 내에서 메타 문자를 이스케이프 할 필요가 없습니다. 즉,이에 패턴을 단축 것 : 물론

@"^(?!.*[^[email protected]#$%^&+=!?*])(?=.*[a-z]{1,})(?=.*[A-Z]{1,})(?=.*[0-9]{1,})(?=.*[@#$%^&+=!?*]{1,}).{8,12}$" 

를 대시가 탈출 또는 실수로 문자의 범위를 지정 피하기 위해 시작 또는 문자 클래스의 끝 부분에 배치해야 가능합니다. 사용자가 패턴 정보를 제공 할 수있는 경우 중요합니다.이 경우 사용자 입력에 Regex.Escape method을 사용할 수 있습니다.

1

왜 정규식을 이런 식으로 사용하는지 알 수 없습니다. 암호는 패턴을 따르지 않고 일련의 규칙을 따릅니다. 대신, 패턴에 일치하는 일련의 규칙에 대해 그것을 확인하기 위해 노력 :

사이비 코드 :

function checkPassword(password, rules) 
{ 
    for (i = 0; i < rules.length; i++) 
    { 
    if (!rules[i](password)) return false; 
    } 
    return true; 
} 

function hasCapital(password) 
{ 
    return password.matches(/[A-Z]/); 
} 
function hasLower(password) 
{ 
    return password.matches(/[a-z]/); 
} 
function hasNumber(password) 
{ 
    return password.matches(/[0-9]/); 
} 
function hasSpecial(password) 
{ 
    return password.matches(/[@\#\$%\^&\+=!\?\*]/); 
} 

password = getPassword(); 
passwordIsValid = false; 
rules = []; 
rules[] = hasCapital; 
rules[] = hasLower; 
rules[] = hasNumber; 
rules[] = hasSpecial; 

passwordIsValid = checkPassword(password, rules); 

이 형식은 당신이 원하는 어떤 규칙을 지정할 수 있습니다, 그것은 드릴 것입니다, 모듈 형 어떤 것이 부러 졌는지 알 수 있습니다. 또한 사용 된 실제 RegEx가 의미를 갖기 때문에 디버깅 할 수 있습니다.

RegEx를 사용하는 경우 은 코드를으로 단순화해야하며 이해하기가 더 어려워서는 안됩니다.

+0

나의 첫 번째 본능은 당신이 여기있는 것과 똑같은 일을하는 것이었지만, 유효성을 검사하는 정규 표현식을 사용하는 멋진 암호 강도 컨트롤이 있습니다. 그래서 정규식 구축 기술을 사용하기로 결정했습니다. 그러나 이러한 기능은 권한이 아니기 때문에 내가 공유 한 것과 같은 구현으로 끝날 수도 있습니다. –

관련 문제