在Python中测试密码的强度

时间:2018-11-12 21:26:50

标签: python python-3.x data-science data-analysis

在以下情况下,字符串是弱密码: 少于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 :(得分:3)

您的代码有很多问题;值得注意的是,在调用x 之前,您要用y替换小写字符,用n替换大写字符,用is_english_word替换数字,这意味着{{{ 1}}将以is_english_word()而非英语单词来调用。那就是使您的密码不是'Xyyyyyyyyyyyyyy'

由于它也不是'WEAK',所以最终是'STRONG'

为便于记录,这是一个正确代码的示例,可用于执行您想要的操作:

'MEDIUM'

答案 1 :(得分:2)

如果考虑到使用字符串方法执行的同一操作(检查至少一个字符是否正确)对字母类型的这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'