检查密码的强度(如何检查条件)

2024-05-05 05:57:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个需要您输入密码的系统。如果全部是lower、upper或num,则打印弱,如果是两个条件,则为med,如果全部满足,则为强。只是好像没用。

弱者和强者起作用,然而媒介不起作用。

我不知道我错在哪里了。

def password():

    print ('enter password')
    print ()
    print ()
    print ('the password must be at least 6, and no more than 12 characters long')
    print ()

    password = input ('type your password    ....')


    weak = 'weak'
    med = 'medium'
    strong = 'strong'

    if len(password) >12:
        print ('password is too long It must be between 6 and 12 characters')

    elif len(password) <6:
        print ('password is too short It must be between 6 and 12 characters')


    elif len(password)    >=6 and len(password) <= 12:
        print ('password ok')

        if password.lower()== password or password.upper()==password or password.isalnum()==password:
            print ('password is', weak)

        elif password.lower()== password and password.upper()==password or password.isalnum()==password:
            print ('password is', med)

        else:
            password.lower()== password and password.upper()==password and password.isalnum()==password
            print ('password is', strong)

Tags: orandlenismedpasswordbeupper
3条回答

荷拉
最好的方法是使用正则表达式搜索
这是我当前使用的函数

def password_check(password):
    """
    Verify the strength of 'password'
    Returns a dict indicating the wrong criteria
    A password is considered strong if:
        8 characters length or more
        1 digit or more
        1 symbol or more
        1 uppercase letter or more
        1 lowercase letter or more
    """

    # calculating the length
    length_error = len(password) < 8

    # searching for digits
    digit_error = re.search(r"\d", password) is None

    # searching for uppercase
    uppercase_error = re.search(r"[A-Z]", password) is None

    # searching for lowercase
    lowercase_error = re.search(r"[a-z]", password) is None

    # searching for symbols
    symbol_error = re.search(r"[ !#$%&'()*+,-./[\\\]^_`{|}~"+r'"]', password) is None

    # overall result
    password_ok = not ( length_error or digit_error or uppercase_error or lowercase_error or symbol_error )

    return {
        'password_ok' : password_ok,
        'length_error' : length_error,
        'digit_error' : digit_error,
        'uppercase_error' : uppercase_error,
        'lowercase_error' : lowercase_error,
        'symbol_error' : symbol_error,
    }

编辑:
卢卡斯的一个建议是对特殊符号条件验证的一个更新

symbol_error = re.search(r"\W", password) is None

password.isalnum()返回布尔值,因此password.isalnum()==password将始终False

只要省略==password部分:

if password.lower()== password or password.upper()==password or password.isalnum():
    # ...

下一步,它可以从不同时是所有的上和下,或者所有的上和数,或者所有的下和所有的数,所以第二个条件(中)是不可能的。也许你应该寻找一些大写、小写和数字的存在?

然而,首先要解决的是另一个问题。您正在测试密码是否为字母数字,仅由字符和/或数字组成。如果只想测试数字,请使用^{}

您可能需要熟悉string methods。有一些方便的.islower().isupper()方法可供您尝试,例如:

>>> 'abc'.islower()
True
>>> 'abc123'.islower()
True
>>> 'Abc123'.islower()
False
>>> 'ABC'.isupper()
True
>>> 'ABC123'.isupper()
True
>>> 'Abc123'.isupper()
False

这比使用password.upper() == password更快、更简洁,下面将测试相同的内容:

if password.isupper() or password.islower() or password.isdigit():
    # very weak indeed

下一个需要学习的技巧是在字符串上循环,这样就可以测试单个字符:

>>> [c.isdigit() for c in 'abc123']
[False, False, False, True, True, True]

如果将其与any()函数结合使用,则可以测试是否有一些字符是数字:

>>> any(c.isdigit() for c in 'abc123')
True
>>> any(c.isdigit() for c in 'abc')
False

我认为在测试密码强度时,你会发现这些技巧很方便。

以下是你所写内容的翻版:

import re

def password():
    print ('Enter a password\n\nThe password must be between 6 and 12 characters.\n')

    while True:
        password = input('Password: ... ')
        if 6 <= len(password) < 12:
            break
        print ('The password must be between 6 and 12 characters.\n')

    password_scores = {0:'Horrible', 1:'Weak', 2:'Medium', 3:'Strong'}
    password_strength = dict.fromkeys(['has_upper', 'has_lower', 'has_num'], False)
    if re.search(r'[A-Z]', password):
        password_strength['has_upper'] = True
    if re.search(r'[a-z]', password):
        password_strength['has_lower'] = True
    if re.search(r'[0-9]', password):
        password_strength['has_num'] = True

    score = len([b for b in password_strength.values() if b])

    print ('Password is %s' % password_scores[score])

输出(示例):

>>> password()
Enter a password

The password must be between 6 and 12 characters.

Password: ... ghgG234
Password is Strong

相关问题 更多 >