Проверьте надежность пароля в Python - PullRequest
0 голосов
/ 13 ноября 2018

Строка является СЛАБЫМ паролем, если: либо длиной менее 8 символов, или это английское слово, для которого is_english_word () имеет значение True.

Строка является СИЛЬНЫМ паролем, если: содержит не менее 11 символов И он содержит как минимум 1 строчную букву И содержит не менее 1 заглавной буквы И он содержит как минимум 1 цифру.

Строка - это СРЕДНИЙ пароль, если это НЕ СЛАБОЙ пароль и НЕ СИЛЬНЫЙ пароль.

def is_english_word( string ):
    with open("english_words.txt") as f:
        word_list = []
        for line in f.readlines():
            word_list.append(line.strip())
        if string in word_list: 
            return True
        elif string == string.upper() and string.lower() in word_list:
            return True
        elif string == string.title() and string.lower() in word_list:
            return True
        else:
            return False

def password_strength( string ):
    lower = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    upper = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
    for item in string:
        if item in lower:
            string = string.replace(item, "x")
        elif item in upper:
            string = string.replace(item, "y")
        elif item.isnumeric():
            string = string.replace(item, "n")      
    for item in string:        
        if len( string ) < 8 or is_english_word( string ) :
            return 'WEAK'
        elif len( string ) >= 11 and string.count("x") >= 1 and string.count("y") >= 1 and string.count("n") >= 1: 
            return 'STRONG'
        else:
            return 'MEDIUM'

print( password_strength( 'Unimaginatively' ) )

Этот пароль должен быть "СЛАБОЙ", но вывод - "СРЕДНИЙ", я не знаю, в чем проблема моих кодов. Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Если вы думаете об этих 3 ограничениях на типы букв в терминах одной и той же операции (проверяющей, что это верно хотя бы для одного символа), выполняемой с использованием строковых методов, вы можете значительно упростить свой код:

def is_weak(word):
    return len(word < 8 or is_english_word(word)

def is_strong(word):
    return len(word) >= 11 and all(any(method(c) for c in word) 
                                   for method in (str.islower, str.isupper, str.isdigit))

def password_strength(password):
    if is_weak(password):
        return 'WEAK'
    elif is_strong(password):
        return 'STRONG'
    else:
        return 'MEDIUM'
0 голосов
/ 13 ноября 2018

Есть ряд проблем с вашим кодом; Примечательно, что вы заменяете строчные буквы на x, прописные на y и цифры на n, перед вызовом is_english_word - это означает, что is_english_word() будет вызываться с 'Xyyyyyyyyyyyyyy', что это не английское слово. Это делает ваш пароль не 'WEAK'.

Поскольку это также не 'STRONG', в конечном итоге оно становится 'MEDIUM'.

Для справки, вот пример правильного кода для того, что вы хотите:

import string
def password_strength(string):
    if len(string) < 8 or is_english_word(string):
        return 'WEAK'
    elif (len(string) > 11 and 
            any(ch in string.ascii_lowercase for ch in string) and
            any(ch in string.ascii_uppercase for ch in string) and
            any(ch.isdigit() for ch in string)):
        return 'STRONG'
    else:
        return 'MEDIUM'   
...