Мои критерии надежности пароля следующие:
- Длина 8 символов
- 2 буквы в верхнем регистре
- 1 специальный символ
(!@#$&*)
- 2 цифры
(0-9)
- 3 буквы в нижнем регистре
Может ли кто-нибудь дать мне регулярное выражение для того же. Все условия должны выполняться паролем.
password
иhello123
являются действительными паролями!»).Ответы:
Вы можете выполнить эти проверки, используя утверждения о позитивном прогнозе:
Рубулярная ссылка
Пояснение:
источник
n
, замените.{8}
на.{n,}
Вы можете использовать положительный прогноз нулевой длины, чтобы указать каждое из ваших ограничений отдельно:
(?=.{8,})(?=.*\p{Lu}.*\p{Lu})(?=.*[!@#$&*])(?=.*[0-9])(?=.*\p{Ll}.*\p{Ll})
Если движок регулярных выражений не поддерживает
\p
запись и чистый ASCII достаточно, то вы можете заменить\p{Lu}
с[A-Z]
и\p{Ll}
с[a-z]
.источник
Приведенные выше ответы идеальны, но я предлагаю использовать несколько регулярных выражений меньшего размера, а не большое.
Разделение длинного регулярного выражения имеет некоторые преимущества:
Как правило, такой подход позволяет легко поддерживать код .
Сказав это, я делюсь фрагментом кода, который пишу на Swift в качестве примера:
struct RegExp { /** Check password complexity - parameter password: password to test - parameter length: password min length - parameter patternsToEscape: patterns that password must not contains - parameter caseSensitivty: specify if password must conforms case sensitivity or not - parameter numericDigits: specify if password must conforms contains numeric digits or not - returns: boolean that describes if password is valid or not */ static func checkPasswordComplexity(password password: String, length: Int, patternsToEscape: [String], caseSensitivty: Bool, numericDigits: Bool) -> Bool { if (password.length < length) { return false } if caseSensitivty { let hasUpperCase = RegExp.matchesForRegexInText("[A-Z]", text: password).count > 0 if !hasUpperCase { return false } let hasLowerCase = RegExp.matchesForRegexInText("[a-z]", text: password).count > 0 if !hasLowerCase { return false } } if numericDigits { let hasNumbers = RegExp.matchesForRegexInText("\\d", text: password).count > 0 if !hasNumbers { return false } } if patternsToEscape.count > 0 { let passwordLowerCase = password.lowercaseString for pattern in patternsToEscape { let hasMatchesWithPattern = RegExp.matchesForRegexInText(pattern, text: passwordLowerCase).count > 0 if hasMatchesWithPattern { return false } } } return true } static func matchesForRegexInText(regex: String, text: String) -> [String] { do { let regex = try NSRegularExpression(pattern: regex, options: []) let nsString = text as NSString let results = regex.matchesInString(text, options: [], range: NSMakeRange(0, nsString.length)) return results.map { nsString.substringWithRange($0.range)} } catch let error as NSError { print("invalid regex: \(error.localizedDescription)") return [] } } }
источник
Я бы предложил добавить
источник
Вам также следует подумать об изменении некоторых из ваших правил на:
С указанными выше улучшениями, а также для большей гибкости и читабельности я бы изменил регулярное выражение на.
^(?=(.*[a-z]){3,})(?=(.*[A-Z]){2,})(?=(.*[0-9]){2,})(?=(.*[!@#$%^&*()\-__+.]){1,}).{8,}$
Основное объяснение
(?=(.*RULE){MIN_OCCURANCES,})
Каждый блок правил обозначен (? = () {}). Затем правило и количество вхождений могут быть легко определены и протестированы по отдельности, прежде чем объединяться.
Детальное объяснение
^ start anchor (?=(.*[a-z]){3,}) lowercase letters. {3,} indicates that you want 3 of this group (?=(.*[A-Z]){2,}) uppercase letters. {2,} indicates that you want 2 of this group (?=(.*[0-9]){2,}) numbers. {2,} indicates that you want 2 of this group (?=(.*[!@#$%^&*()\-__+.]){1,}) all the special characters in the [] fields. The ones used by regex are escaped by using the \ or the character itself. {1,} is redundant, but good practice, in case you change that to more than 1 in the future. Also keeps all the groups consistent {8,} indicates that you want 8 or more $ end anchor
И, наконец, для целей тестирования вот robulink с указанным выше регулярным выражением
источник
Решение codaddict работает нормально, но это немного более эффективно: (синтаксис Python)
password = re.compile(r"""(?#!py password Rev:20160831_2100) # Validate password: 2 upper, 1 special, 2 digit, 1 lower, 8 chars. ^ # Anchor to start of string. (?=(?:[^A-Z]*[A-Z]){2}) # At least two uppercase. (?=[^!@#$&*]*[!@#$&*]) # At least one "special". (?=(?:[^0-9]*[0-9]){2}) # At least two digit. .{8,} # Password length is 8 or more. $ # Anchor to end of string. """, re.VERBOSE)
Классы инвертированных символов потребляют все, вплоть до желаемого символа, за один шаг, не требуя возврата с возвратом. (Решение с точкой в виде звездочки работает нормально, но требует некоторого отката.) Конечно, с короткими целевыми строками, такими как пароли, это повышение эффективности будет незначительным.
источник
(?#
и заканчивается)
. В этом регулярном выражении нет несбалансированных пар.import re RegexLength=re.compile(r'^\S{8,}$') RegexDigit=re.compile(r'\d') RegexLower=re.compile(r'[a-z]') RegexUpper=re.compile(r'[A-Z]') def IsStrongPW(password): if RegexLength.search(password) == None or RegexDigit.search(password) == None or RegexUpper.search(password) == None or RegexLower.search(password) == None: return False else: return True while True: userpw=input("please input your passord to check: \n") if userpw == "exit": break else: print(IsStrongPW(userpw))
источник
Для PHP это нормально работает!
if(preg_match("/^(?=(?:[^A-Z]*[A-Z]){2})(?=(?:[^0-9]*[0-9]){2}).{8,}$/", 'CaSu4Li8')){ return true; }else{ return fasle; }
в этом случае результат верный
Спасибо за @ridgerunner
источник
return preg_match("/^(?=(?:[^A-Z]*[A-Z]){2})(?=(?:[^0-9]*[0-9]){2}).{8,}$/", 'CaSu4Li8')
?Другое решение:
import re passwordRegex = re.compile(r'''( ^(?=.*[A-Z].*[A-Z]) # at least two capital letters (?=.*[!@#$&*]) # at least one of these special c-er (?=.*[0-9].*[0-9]) # at least two numeric digits (?=.*[a-z].*[a-z].*[a-z]) # at least three lower case letters .{8,} # at least 8 total digits $ )''', re.VERBOSE) def userInputPasswordCheck(): print('Enter a potential password:') while True: m = input() mo = passwordRegex.search(m) if (not mo): print(''' Your password should have at least one special charachter, two digits, two uppercase and three lowercase charachter. Length: 8+ ch-ers. Enter another password:''') else: print('Password is strong') return userInputPasswordCheck()
источник
Пароль должен соответствовать минимум 3 из 4 правил сложности,
[минимум 1 символ верхнего регистра (AZ) минимум 1 символ нижнего регистра (az) минимум 1 цифра (0-9) минимум 1 специальный символ - не забывайте также рассматривать пробел как специальные символы]
не менее 10 символов
максимум 128 символов
не более двух одинаковых символов подряд (например, 111 не допускается)
'^ (?!. (.) \ 1 {2}) ((? =. [Az]) (? =. [AZ]) (? =. [0-9]) | (? =. [Az] ) (? =. [AZ]) (? =. [^ A-zA-Z0-9]) | (? =. [AZ]) (? =. [0-9]) (? =. [^ A -zA-Z0-9]) | (? =. [az]) (? =. [0-9]) (? =. * [^ a-zA-Z0-9])). {10,127} $ '
(?!. * (.) \ 1 {2})
(? =. [az]) (? =. [AZ]) (? =. * [0-9])
(? =. [az]) (? =. [AZ]) (? =. * [^ a-zA-Z0-9])
(? =. [AZ]) (? =. [0-9]) (? =. * [^ A-zA-Z0-9])
(? =. [az]) (? =. [0-9]) (? =. * [^ a-zA-Z0-9])
. {10.127}
источник
К сожалению, все вышеперечисленное регулярное выражение не сработало для меня. Основные правила надежного пароля:
Итак, Best Regex будет
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*]).{8,}$
Вышеупомянутое регулярное выражение имеет минимальную длину 8. Вы можете изменить его с {8,} на { any_number ,}
Модификация в правилах?
Допустим, вам нужно минимум x символов строчными буквами, y символов заглавными буквами, z символов чисел, общая минимальная длина w . Затем попробуйте ниже регулярное выражение
^(?=.*[a-z]{x,})(?=.*[A-Z]{y,})(?=.*[0-9]{z,})(?=.*[!@#\$%\^&\*]).{w,}$
Примечание. Измените x , y , z , w в регулярном выражении.
Изменить: обновленный ответ регулярного выражения
Edit2: добавлена модификация
источник
12345678
вы уверены , что это сильный пароль? Пожалуйста, попробуйте ваше регулярное выражение перед публикацией.