В этой статье показано, как использовать регулярное выражение для проверки пароля в Java.
Требования к безопасному паролю
- Пароль должен содержать по крайней мере одну цифру [0-9].
- Пароль должен содержать по крайней мере один строчный латинский символ [a-z].
- Пароль должен содержать по крайней мере один заглавный латинский символ [А-Я].
- Пароль должен содержать по крайней мере один специальный символ, такой как
! @ # & ( )
. - Пароль должен содержать не менее 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 StreamvalidPasswordProvider() { 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-регулярное выражение/пароль
Рекомендации
- Википедия – Буквенно-цифровые обозначения
- Википедия – Надежность пароля
- Утверждения нулевой длины с регулярным выражением – Lookahead и Lookbehind
- JUnit 5 Параметризованные тесты
- Рекомендации по использованию Пароля и Имени пользователя
- Индексирование не буквенно-цифровых символов
- Топ-5 Самых Надежных Паролей
- Пример генератора паролей Java
Оригинал: “https://mkyong.com/regular-expressions/how-to-validate-password-with-regular-expression/”