Регулярное выражение для проверки надежности пароля - PullRequest
125 голосов
/ 28 февраля 2011

Мои критерии надежности пароля указаны ниже:

  • длина 8 символов
  • 2 буквы в верхнем регистре
  • 1 специальный символ (!@#$&*)
  • 2 цифры (0-9)
  • 3 буквы в нижнем регистре

Может кто-нибудь, пожалуйста, дайте мне регулярное выражение для того же. Все условия должны быть выполнены паролем.

Ответы [ 9 ]

383 голосов
/ 28 февраля 2011

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

^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$

Рубулярная ссылка

Объяснение:

^                         Start anchor
(?=.*[A-Z].*[A-Z])        Ensure string has two uppercase letters.
(?=.*[!@#$&*])            Ensure string has one special case letter.
(?=.*[0-9].*[0-9])        Ensure string has two digits.
(?=.*[a-z].*[a-z].*[a-z]) Ensure string has three lowercase letters.
.{8}                      Ensure string is of length 8.
$                         End anchor.
10 голосов
/ 28 февраля 2011

Вы можете использовать положительные упреждения нулевой длины, чтобы указать каждое из ваших ограничений отдельно:

(?=.{8,})(?=.*\p{Lu}.*\p{Lu})(?=.*[!@#$&*])(?=.*[0-9])(?=.*\p{Ll}.*\p{Ll})

Если ваш механизм регулярных выражений не поддерживает нотацию \p, и достаточно чистого ASCII,Вы можете заменить \p{Lu} на [A-Z] и \p{Ll} на [a-z].

5 голосов
/ 29 марта 2016

Ответы, данные выше, прекрасны, но я предлагаю использовать несколько меньших регулярных выражений, а не больших.
Расщепление длинного регулярного выражения имеет ряд преимуществ:

  • легкость писать и читать
  • легкость в отладке
  • простота добавления / удаления части регулярного выражения

Обычно этот подход позволяет легко поддерживать код .

Сказав это, я делюсь фрагментом кода, который я пишу на 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 []
        }
    }
}
2 голосов
/ 14 апреля 2016

Я бы предложил добавить

(?!.*pass|.*word|.*1234|.*qwer|.*asdf) exclude common passwords
1 голос
/ 01 сентября 2016

Решение 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)

Классы с отрицательными символами поглощают все до нужного символа за один шаг, требуя нулевого возврата.(Решение «точка-звезда» работает просто отлично, но требует некоторого возврата.) Конечно, с короткими целевыми строками, такими как пароли, это повышение эффективности будет незначительным.

0 голосов
/ 09 августа 2018

Пароль должен соответствовать как минимум 3 из следующих 4 правил сложности,

[как минимум 1 заглавный символ (A-Z) как минимум 1 строчный символ (a-z) хотя бы 1 цифра (0-9) хотя бы 1 специальный символ - не забывайте также относиться к пробелу как к специальным символам]

не менее 10 символов

максимум 128 символов

не более 2 одинаковых символов подряд (например, 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])). {10127} $ '

(?!. * (.) \ 1 {2})

(? =. [а-г]) (? =. [A-Z]) (? =. * [0-9])

(? =. * * Одна тысяча тридцать одна [а-г]) (? =. * * Тысяча тридцать два [A-Z]) (? =. * [^ А-Za-z0-9])

(? =. [A-Z]) (? =. [0-9]) (? =. * [^ А-Za-z0-9])

(? =. [а-г]) (? =. [0-9]) (? =. * [^ А-Za-z0-9])

. {10,127}

0 голосов
/ 12 мая 2018

Другое решение:

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()
0 голосов
/ 21 февраля 2018

Для PHP это отлично работает!

 if(preg_match("/^(?=(?:[^A-Z]*[A-Z]){2})(?=(?:[^0-9]*[0-9]){2}).{8,}$/", 
 'CaSu4Li8')){
    return true;
 }else{
    return fasle;
 }

в этом случае результат верен

Thsks для @ ridgerunner

0 голосов
/ 05 января 2018
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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...