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



мои критерии надежности пароля, как показано ниже :




  • длина 8 символов

  • 2 буквы в верхнем регистре

  • 1 Спецсимвол (!@#$&*)

  • 2 цифры (0-9)

  • 3 буквы в нижнем регистре


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

808   9  

9 ответов:

вы можете сделать эти проверки с помощью положительных прогнозных утверждений:

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

Rubular link

объяснение:

^                         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.

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

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

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

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

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

обычно этот подход сохраняет код легко ремонтопригодны.

сказав это, я разделяю кусок кода, который я пишу в Свифт например:

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(.range)}
        } catch let error as NSError {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
    }
}

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

(?!.*pass|.*word|.*1234|.*qwer|.*asdf) exclude common passwords

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

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

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;
 }

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

Thsks для @ridgerunner

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

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 заглавный символ (A-Z) по крайней мере 1 строчный символ (a-z) по крайней мере 1 цифра (0-9) по крайней мере 1 специальный символ - не забудьте рассматривать пространство как специальные символы тоже]

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

не более 128 символов

не более 2 одинаковых символов в строке (например, 111 не допускается)

Comments

    Ничего не найдено.