일반 비밀번호가 아닌 정규식

암호는 소문자, 대문자, 숫자, 특수 문자(예: @$!%*#?&) 중 3개 이상을 포함해야 하며 길이는 8자 이상이어야 합니다.

그것이 목표입니다…

다양한 요구 사항에 따라 암호 유효성 검사에 사용되는 여러 정규식 패턴이 있지만 약간 관대하고 동시에 암호의 보안 및 강도를 손상시키지 않는 암호 정책이 있는 경우에는 어떻게 될까요? 이를 달성할 수 있는 특정 정규식 패턴이 있습니다(주의: 이것이 최상의 암호 정책이라고 말하는 것이 아닙니다).

정규식을 살펴보겠습니다.

String regex = "^(((?=.*[a-z])(?=.*[A-Z])(?=.*\\d))|((?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*#?&]))|((?=.*[a-z])(?=.*[A-Z])(?=.*[@$!%*#?&]))|((?=.*[a-z])(?=.*\\d)(?=.*[@$!%*#?&])))(?=\\S+$).{8,}$";


이제 사용 중인 이 정규식을 살펴보겠습니다.

public class PasswordValidationTest {

    private Pattern pattern;

    @Before
    public void setUp() {
        String regex = "^(((?=.*[a-z])(?=.*[A-Z])(?=.*\\d))|((?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*#?&]))|((?=.*[a-z])(?=.*[A-Z])(?=.*[@$!%*#?&]))|((?=.*[a-z])(?=.*\\d)(?=.*[@$!%*#?&])))(?=\\S+$).{8,}$";
        pattern = Pattern.compile(regex);
    }

    @Test
    public void test_first_valid_password_example() {
        //Number, upper case, lower case in no particular order
        String password = "13Edlpouhgfdcfvgbqb";
        Assert.assertTrue(matchPassword(password));
    }

    @Test
    public void test_second_valid_password_example() {
        //Lower case, number, special character in no particular order
        String password = "dfgjrwerdvfbghjhgfdxc90@";
        Assert.assertTrue(matchPassword(password));
    }

    @Test
    public void test_third_valid_password_example() {
        //Upper case, number, lower case in no particular order
        String password = "POIIUHGFBGNHUYF2df";
        Assert.assertTrue(matchPassword(password));
    }

    @Test
    public void test_fourth_valid_password_example() {
        //Upper case, lower case, number, special character in no particular order
        String password = "KJSrtyhgh!58E543561#";
        Assert.assertTrue(matchPassword(password));
    }

    @Test
    public void test_invalid_password_example() {
        String password = "TGsayhtgfdcsxrbfdvc";
        Assert.assertFalse(matchPassword(password));
    }

    //Utility function
    private boolean matchPassword(String password) {
        Matcher matcher = pattern.matcher(password);
        return matcher.matches();
    }
}


위의 코드 조각에서 볼 수 있듯이 이 정규식은 조건을 필수로 만들지 않지만 사용자는 이러한 조건 중 3개 이상을 충족하지 않는 암호를 제출할 수 없으며 물론 암호 길이는 8자 미만일 수 없습니다. 네 번째 테스트 사례는 정규 표현식이 네 가지 조합을 모두 포함하는 암호를 허용할 수 있음을 보여주고 마지막 테스트 사례는 잘못된 암호의 경우입니다.

이제 위의 테스트 결과를 보자.



모든 테스트를 통과했으며 이제 약간의 설명이 제공됩니다.^ 줄의 시작 부분에 위치 주장(?=.*[a-z]) 소문자가 한 번 이상 나타나야 합니다.(?=.*[A-Z]) 대문자가 한 번 이상 나타나야 합니다.(?=.*\\d) 숫자가 한 번 이상 발생해야 합니다.(?=.*[@$!%*#?&]) 특수 문자가 한 번 이상 발생해야 합니다.(?=\S+$) 전체 문자열에 공백이 허용되지 않는지 확인.{8,} 최소 8자 이상이어야 합니다.$ 행의 끝에서 위치 주장
또한 OR 조건에 해당하는 대체 기호(|)로 구분된 정규식에는 4개의 조합 그룹이 있습니다. 조건부 시행을 하는 것입니다. 나는 이것이 누군가에게 도움이되기를 바랍니다.

읽어 주셔서 감사합니다! 관찰한 사항이 있으면 의견 섹션에서 의견을 공유해 주십시오. 또는 를 통해 저에게 연락할 수도 있습니다.

좋은 웹페이지 즐겨찾기