Рубрики
Без рубрики

Регулярное выражение Java проверяет примеры паролей

В этой статье показано, как использовать регулярное выражение для проверки пароля в Java.

В этой статье показано, как использовать регулярное выражение для проверки пароля в Java.

Требования к безопасному паролю

  1. Пароль должен содержать по крайней мере одну цифру [0-9].
  2. Пароль должен содержать по крайней мере один строчный латинский символ [a-z].
  3. Пароль должен содержать по крайней мере один заглавный латинский символ [А-Я].
  4. Пароль должен содержать по крайней мере один специальный символ, такой как ! @ # & ( ) .
  5. Пароль должен содержать не менее 8 символов и не более 20 символов.

Ниже приведено регулярное выражение, соответствующее всем вышеперечисленным требованиям.

  ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()â€"[{}]:;',?/*~$^+=<>]).{8,20}$

1. Объяснение пароля регулярного выражения

Пароль должен содержать по крайней мере один символ нижнего регистра, один символ верхнего регистра, одну цифру, один специальный символ и длину от 8 до 20. Приведенное ниже регулярное выражение использует положительный внешний вид для условной проверки.

^                                   # start of line
  (?=.*[0-9])                       # positive lookahead, digit [0-9]
  (?=.*[a-z])                       # positive lookahead, one lowercase character [a-z]
  (?=.*[A-Z])                       # positive lookahead, one uppercase character [A-Z]
  (?=.*[!@#&()â€"[{}]:;',?/*~$^+=<>]) # positive lookahead, one of the special character in this [..]
  .                                 # matches anything
  {8,20}                            # length at least 8 characters and maximum of 20 characters
$                                   # end of line

В регулярном выражении есть положительный взгляд (?=) и отрицательный взгляд (?!) :

  • Позитивный взгляд (?=) гарантирует что-то за чем следует что-то еще.
  • Негативный взгляд (?!) гарантирует, что за чем-то НЕ последует что-то еще.

Например, b(?=c) соответствует b за этим следует a c . (позитивный взгляд) Например, b(?!c) соответствует a b за этим НЕ следует a c . (отрицательный взгляд)

2. Регулярное выражение для проверки пароля

Ниже приведен пример регулярного выражения Java для проверки пароля.

package com.mkyong.regex.password;

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

public class PasswordValidator {

    // digit + lowercase char + uppercase char + punctuation + symbol
    private static final String PASSWORD_PATTERN =
            "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()â€"[{}]:;',?/*~$^+=<>]).{8,20}$";

    private static final Pattern pattern = Pattern.compile(PASSWORD_PATTERN);

    public static boolean isValid(final String password) {
        Matcher matcher = pattern.matcher(password);
        return matcher.matches();
    }

}

3. Модульные тесты паролей регулярных выражений

Ниже приведены модульные тесты для проверки списка допустимых и недопустимых паролей.

package com.mkyong.regex.password;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class PasswordValidatorTest {

    @ParameterizedTest(name = "#{index} - Run test with password = {0}")
    @MethodSource("validPasswordProvider")
    void test_password_regex_valid(String password) {
        assertTrue(PasswordValidator.isValid(password));
    }

    @ParameterizedTest(name = "#{index} - Run test with password = {0}")
    @MethodSource("invalidPasswordProvider")
    void test_password_regex_invalid(String password) {
        assertFalse(PasswordValidator.isValid(password));
    }

    static Stream validPasswordProvider() {
        return Stream.of(
                "AAAbbbccc@123",
                "Hello world$123",
                "A!@#&()â€"a1",               // test punctuation part 1
                "A[{}]:;',?/*a1",           // test punctuation part 2
                "A~$^+=<>a1",               // test symbols
                "0123456789$abcdefgAB",     // test 20 chars
                "123Aa$Aa"                  // test 8 chars
        );
    }

    // At least
    // one lowercase character,
    // one uppercase character,
    // one digit,
    // one special character
    // and length between 8 to 20.
    static Stream invalidPasswordProvider() {
        return Stream.of(
                "12345678",                 // invalid, only digit
                "abcdefgh",                 // invalid, only lowercase
                "ABCDEFGH",                 // invalid, only uppercase
                "abc123$$$",                // invalid, at least one uppercase
                "ABC123$$$",                // invalid, at least one lowercase
                "ABC$$$$$$",                // invalid, at least one digit
                "java REGEX 123",           // invalid, at least one special character
                "java REGEX 123 %",         // invalid, % is not in the special character group []
                "________",                 // invalid
                "--------",                 // invalid
                " ",                        // empty
                "");                        // empty
    }
}

Все прошло.

4. Часто задаваемые вопросы

Ниже есть некоторые часто задаваемые вопросы:

  • Почему более длинный пароль более защищен?
  • Почему необходимо смешивать хотя бы один специальный символ?

Ответ : Для латинских символов, строчных и прописных [a-za-Z], он состоит из 52 символов; для цифр [0-9] он состоит из 10 символов, всего 62 символа.

  • Если пароль содержит длину 1, он состоит из 62 возможности, [a-za-Z0-9]. Это означает наихудший случай; нам нужно угадать 62 раза, чтобы узнать правильный пароль.
  • Для длины 2 это 62 x 62 или 62 ^ 2 = 3,844
  • 62 ^ 3 = 238,328
  • 62 ^ 4 = 14,776,336
  • 62 ^ 5 = 916,132,832
  • 62 ^ 6 = 56,800,235,584
  • 62 ^ 7 = 3,521,614,606,208
  • 62 ^ 8 = 218,340,105,584,896
  • Более длинный пароль более защищен, поскольку злоумышленникам сложнее угадать правильный пароль. Уловил идею?

Если бы мы включили специальные символы как знаки препинания ! @ # & ( ) – [ { } ]: ; ' , ?/* (18 символов) и символы ~ $ ^ + = < > (7 символов), это значительно увеличит трудности с подбором правильного пароля. Я не совсем уверен, сколько там специальных символов, пусть это будет 25 символов (приблизительно).

Для 62 буквенно-цифровых символов + 25 специальных символов это в общей сложности 87 символов.

  • 87 ^ 1 = 87
  • 87 ^ 2 = 7,569
  • 87 ^ 3 = 658,503
  • 87 ^ 4 = 57,289,761
  • 87 ^ 5 = 4,984,209,207
  • 87 ^ 6 = 433,626,201,009
  • 87 ^ 7 = 37,725,479,487,783
  • 87 ^ 8 = 3,282,116,715,437,121

Смешанный со специальными символами значительно увеличит трудности при вводе правильного пароля.

Хэширование пароля Не сохраняйте пароль в виде открытого текста. Рекомендуется использовать медленный хэш, такой как Argon2 для хэширования пароля.

Генератор надежных паролей Попробуйте это Пример генератора паролей Java для создания безопасного и надежного пароля.

Скачать Исходный Код

$клон git $клон git

$cd java-регулярное выражение/пароль

Рекомендации

Оригинал: “https://mkyong.com/regular-expressions/how-to-validate-password-with-regular-expression/”