- Как проверить пароль с помощью регулярного выражения
- 1. Пример регулярного выражения Java
- 2. Пароль, который соответствует:
- 3. Не совпадает пароль:
- 4. Модульный тест — PasswordValidator
- 5. Модульный тест — результат
- Validate password in java
- Using regex
- Регулярное выражение Java проверяет примеры паролей
- 1. Объяснение пароля регулярного выражения
- 2. Регулярное выражение для проверки пароля
- 3. Модульные тесты паролей регулярных выражений
- 4. Часто задаваемые вопросы
- Скачать Исходный Код
- Рекомендации
- Java Regex Password Validation Example
Как проверить пароль с помощью регулярного выражения
Целая комбинация — это среднее от 6 до 20 символов, по крайней мере, с одной цифрой, одной заглавной буквой, одной строчной буквой и одним специальным символом («@ # $%»). Этот шаблон регулярных выражений очень полезен для реализации надежного и сложного пароля.
P.S Порядок формулы группировки не имеет значения.
1. Пример регулярного выражения Java
package com.mkyong.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PasswordValidator< private Pattern pattern; private Matcher matcher; private static final String PASSWORD__PATTERN = "((?=.** \\d)(?=.** [a-z])(?=.** [A-Z])(?=.** [@#$%]).)"; public PasswordValidator() < pattern = Pattern.compile(PASSWORD__PATTERN); >/** ** ** Validate password with regular expression ** @param password password for validation ** @return true valid password, false invalid password ** / public boolean validate(final String password) < matcher = pattern.matcher(password); return matcher.matches(); >>
2. Пароль, который соответствует:
3. Не совпадает пароль:
1. mY1A @, слишком короткий, минимум 6 символов 2. mkyong12 @, требуются заглавные буквы 3. mkyoNg12 , специальный символ « » здесь не разрешен 4. mkyonG $$, требуется цифра 5. MKYONG12 $, символ нижнего регистра требуется
4. Модульный тест — PasswordValidator
package com.mkyong.regex; import org.testng.Assert; import org.testng.annotations.** ; /** ** ** Password validator Testing ** @author mkyong ** ** /public class PasswordValidatorTest < private PasswordValidator passwordValidator; @BeforeClass public void initData()< passwordValidator = new PasswordValidator(); >@DataProvider public Object[][]ValidPasswordProvider() < return new Object[][]< > >; > @DataProvider public Object[][]InvalidPasswordProvider() < return new Object[][]< > >; > @Test(dataProvider = "ValidPasswordProvider") public void ValidPasswordTest(String[]password) < for(String temp : password)< boolean valid = passwordValidator.validate(temp); System.out.println("Password is valid : " + temp + " , " + valid); Assert.assertEquals(true, valid); >> @Test(dataProvider = "InvalidPasswordProvider", dependsOnMethods="ValidPasswordTest") public void InValidPasswordTest(String[]password) < for(String temp : password)< boolean valid = passwordValidator.validate(temp); System.out.println("Password is valid : " + temp + " , " + valid); Assert.assertEquals(false, valid); >> >
5. Модульный тест — результат
Password is valid : mkyong1A@ , true Password is valid : mkYOn12$ , true Password is valid : mY1A@ , false Password is valid : mkyong12@ , false Password is valid : mkyoNg12** , false Password is valid : mkyonG$$ , false Password is valid : MKYONG12$ , false PASSED: ValidPasswordTest([Ljava.lang.String;@1d4c61c) PASSED: InValidPasswordTest([Ljava.lang.String;@116471f) =============================================== com.mkyong.regex.PasswordValidatorTest Tests run: 2, Failures: 0, Skips: 0 =============================================== =============================================== mkyong Total tests run: 2, Failures: 0, Skips: 0 ===============================================
ссылка://тег/пароль/[пароль]ссылка://тег/регулярное выражение/[регулярное выражение]
Validate password in java
In this post, we will see how to validate a password in java.
Here are rules for password:
- Must have at least one numeric character
- Must have at least one lowercase character
- Must have at least one uppercase character
- Must have at least one special symbol among @#$%
- Password length should be between 8 and 20
Using regex
Here is standard regex for validating password.
Here is explanation for above regex
^ asserts position at start of a line
Group (?=.*\\d)
Assert that the Regex below matches
.* matches any character (except for line terminators)
\\ matches the character \ literally (case sensitive)
d matches the character d literally (case sensitive)
Group (?=.*[a-z])
Assert that the Regex below matches
.* matches any character (except for line terminators)
Match a single character present in the list below [a-z]
a-z a single character in the range between a (index 97) and z (index 122) (case sensitive)
Group (?=.*[A-Z])
Assert that the Regex below matches
.* matches any character (except for line terminators)
Match a single character present in the list below [A-Z]
A-Z a single character in the range between A (index 65) and Z (index 90) (case sensitive)
Group (?=.*[@#$%])
Assert that the Regex below matches
.* matches any character (except for line terminators)
Match a single character present in the list below [@#$%]
@#$% matches a single character in the list @#$% (case sensitive)
. matches any character (except for line terminators)
Quantifier — Matches between 8 and 20 times, as many times as possible, giving back as needed (greedy)
$ asserts position at the end of a line
Here is java program to implement it.
Регулярное выражение Java проверяет примеры паролей
В этой статье показано, как использовать регулярное выражение для проверки пароля в Java.
В этой статье показано, как использовать регулярное выражение для проверки пароля в Java.
Требования к безопасному паролю
- Пароль должен содержать по крайней мере одну цифру 4.
- Пароль должен содержать по крайней мере один строчный латинский символ [a-z].
- Пароль должен содержать по крайней мере один заглавный латинский символ [А-Я].
- Пароль должен содержать по крайней мере один специальный символ, такой как ! @ # & ( ) .
- Пароль должен содержать не менее 8 символов и не более 20 символов.
Ниже приведено регулярное выражение, соответствующее всем вышеперечисленным требованиям.
1. Объяснение пароля регулярного выражения
Пароль должен содержать по крайней мере один символ нижнего регистра, один символ верхнего регистра, одну цифру, один специальный символ и длину от 8 до 20. Приведенное ниже регулярное выражение использует положительный внешний вид для условной проверки.
^ # start of line (?=.*6) # positive lookahead, digit 3 (?=.*[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 # 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 = "^(?=.*5)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()â€"[<>]:;',?/*~$^+=<>]).$"; 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 = "#- Run test with password = ") @MethodSource("validPasswordProvider") void test_password_regex_valid(String password) < assertTrue(PasswordValidator.isValid(password)); >@ParameterizedTest(name = "# - Run test with password = ") @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 символов; для цифр 1 он состоит из 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 для создания безопасного и надежного пароля.
Скачать Исходный Код
$cd java-регулярное выражение/пароль
Рекомендации
- Википедия – Буквенно-цифровые обозначения
- Википедия – Надежность пароля
- Утверждения нулевой длины с регулярным выражением – Lookahead и Lookbehind
- JUnit 5 Параметризованные тесты
- Рекомендации по использованию Пароля и Имени пользователя
- Индексирование не буквенно-цифровых символов
- Топ-5 Самых Надежных Паролей
- Пример генератора паролей Java
Java Regex Password Validation Example
Password validation is the need of almost all the applications today. There are various ways to do validate passwords from writing everything manually to use third party available APIs. In this Java regex password validation tutorial, We are building password validator using regular expressions.
1. Regex for password validation
Above regular expression has following sections:
(?=.*[a-z]) : This matches the presence of at least one lowercase letter. (?=.*d) : This matches the presence of at least one digit i.e. 0-9. (?=.*[@#$%]) : This matches the presence of at least one special character. ((?=.*[A-Z]) : This matches the presence of at least one capital letter. : This limits the length of password from minimum 6 letters to maximum 16 letters.
Ordering of top 4 sections can be changed or they can even dropped out from final regular expression. This fact can be used to build our password validator programmatically.
2. Java program to validate password using regex
We are making the our validator configurable so that one can put the limits based on needs. Like if we want to force at least one special character, but not any capital letter, we can pass the required arguments accordingly.
package com.howtodoinjava.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PasswordValidator < private static PasswordValidator INSTANCE = new PasswordValidator(); private static String pattern = null; /** * No one can make a direct instance * */ private PasswordValidator() < //do nothing >/** * Force the user to build a validator using this way only * */ public static PasswordValidator buildValidator( boolean forceSpecialChar, boolean forceCapitalLetter, boolean forceNumber, int minLength, int maxLength) < StringBuilder patternBuilder = new StringBuilder("((?=.*[a-z])"); if (forceSpecialChar) < patternBuilder.append("(?=.*[@#$%])"); >if (forceCapitalLetter) < patternBuilder.append("(?=.*[A-Z])"); >if (forceNumber) < patternBuilder.append("(?=.*d)"); >patternBuilder.append(".)"); pattern = patternBuilder.toString(); return INSTANCE; > /** * Here we will validate the password * */ public static boolean validatePassword(final String password) < Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(password); return m.matches(); >>
3. Unit test password validation
So our password validator is ready. Lets test it with some JUnit test cases.
package com.howtodoinjava.regex; import junit.framework.Assert; import org.junit.Test; @SuppressWarnings("static-access") public class TestPasswordValidator < @Test public void testNormalPassword() < PasswordValidator validator = PasswordValidator.buildValidator(false, false, false, 6, 14); Assert.assertTrue(validator.validatePassword("howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodoin")); //Sort on length Assert.assertFalse(validator.validatePassword("howto")); >@Test public void testForceNumeric() < PasswordValidator validator = PasswordValidator.buildValidator(false,false, true, 6, 16); //Contains numeric Assert.assertTrue(validator.validatePassword("howtodoinjava12")); Assert.assertTrue(validator.validatePassword("34howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodo56injava")); //No numeric Assert.assertFalse(validator.validatePassword("howtodoinjava")); >@Test public void testForceCapitalLetter() < PasswordValidator validator = PasswordValidator.buildValidator(false,true, false, 6, 16); //Contains capitals Assert.assertTrue(validator.validatePassword("howtodoinjavA")); Assert.assertTrue(validator.validatePassword("Howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodOInjava")); //No capital letter Assert.assertFalse(validator.validatePassword("howtodoinjava")); >@Test public void testForceSpecialCharacter() < PasswordValidator validator = PasswordValidator.buildValidator(true,false, false, 6, 16); //Contains special char Assert.assertTrue(validator.validatePassword("howtod@injava")); Assert.assertTrue(validator.validatePassword("@Howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodOInjava@")); //No special char Assert.assertFalse(validator.validatePassword("howtodoinjava")); >>
In this post we learned about password validation using Java regular expression, which is capable of validating alphanumeric and special characters, including maximun and minimum password length.