繁体   English   中英

Python密码检查器

[英]Python Password Checker

我需要一些帮助来弄清楚如何使函数检查一堆条件的字符串。

  • 密码必须至少5个字符长

  • 密码必须包含至少一个大写字母

  • 密码必须至少包含两个数字

  • 密码中不得包含字符“ E”或“ e”

  • 密码必须至少包含一个特殊符号:!,@,#,$,%,^,&

现在这就是我所拥有的

def passwordChecker(password):
    '''
    '''
    caps = sum(1 for c in password if c.isupper())
    nums = sum(1 for c in password if c.isdigit())
    symb = any(c in password for c in '!@#$%^&')
    note = any(c in password for c in 'Ee')
    if len(password) <5:
        return False
    elif caps < 1:
        return False
    elif nums < 1:
        return False
    elif symb == False:
        return False
    else:
        return True

编辑**

刚刚意识到,我还必须检查是否存在诸如“ password”或“ 111111”之类的常用密码,而我真的不知道该如何处理。

只是使用正则表达式的一种替代方法:

import re
def passwordChecker(password):
    return all(re.search(pattern, password) for pattern in
               ('.{5}', '[A-Z]', '\d.*\d', '^[^Ee]*$', '[!@#$%^&]'))

演示使用五个几乎无效和五个几乎无效的测试(五个规则中的每个规则一个无效和一个有效):

for password in ('1A!',   '12!34', 'A1bc!', 'A12E!', 'A12bc',
                 '1A!2.', 'A2!34', 'A12c!', 'A12b!', 'A12b@'):
    print(passwordChecker(password))

前五个打印为False ,后五个打印为True

你只是想念一个分支

elif note:
    return False

else:之前else:

这是谈论装饰者的好时机! 喜欢使用装饰器来验证数据, 可能太多了 您可以对所有内容进行验证,并将其包装在get_password方法周围。

def v_length(password):
    return len(password) >= 5
def v_upper(password):
    return password.lower() != password
def v_2_nums(password):
    return sum(c.isdigit() for c in password) >= 2
def v_no_e(password):
    return "e" not in password.lower()
def v_specialchar(password):
    any(s in password for s in "!@#$%^&")

def validator(*tests):
    def wrap(func):
        def wrapped(*args, **kwargs):
            result = func(*args, **kwargs)
            if not all(test(result) for test in tests):
                # fail the input somehow -- how??
            return result
        return wrapped
    return wrap

@validator(v_length, v_upper, v_2_nums, v_no_e, v_specialchar)
def get_password():
    pwd = input("Enter your password: ")

当我用真实代码执行此操作时,我喜欢将验证器包装在自己的工厂中,以便更轻松地针对每个应用程序进行更改

def v_length(min_length):
    def wrapped(password):
        return len(password) >= min_length
    return wrapped

@validator(v_length(8))
def get_weak_password():
    input("Enter your wussy password: ")

@validator(v_length(64))
def get_strong_password():
    input("Enter your Herculean password: ")

第二种方法很好地用于检查常用密码。

def v_common(common_pwd_set):
    def wrapped(password):
        return password not in common_pwd_set
    return wrapped

COMMON_PASSWORDS = {"hunter2", "111111", "password"}
@validator(v_common(COMMON_PASSWORDS))
def get_password():
    pwd = input("Use a tricksy one! ")

以下检查每个故障情况是否短路(一旦发现故障,它将停止检查)。 “通用”密码并不是很常见,但是我想要可以通过其余检查的值。

def passwordChecker(password):
    '''
    A password checker. Returns True if the password is acceptable; False otherwise.
    '''
    if (len(password) < 5 or
        not any(c.isupper() for c in password) or
        sum(c.isdigit() for c in password) < 2 or
        'e' in password.lower() or
        not (set(password) & set('!@#$%^&')) or
        password in {'Password12!', 'Passwd12!'}):
        return False
    return True

>>> passwordChecker('Password12!')
False
>>> passwordChecker('hi')
False
>>> passwordChecker('H12!')
False
>>> passwordChecker('Hi12!')
True

还有另一种方式...

def passwordChecker(password):
    return (len(password) > 4 and
            len(filter(str.isupper, password)) > 0 and
            len(filter(str.isdigit, password)) > 1 and
            'e' not in password.lower() and
            any(special in password for special in '!@#$%^&') and
            password not in ('password', '111111'))

我认为我的解决方案中最有趣的部分是使用filter 有些人喜欢它,另一些人讨厌它。 无论如何,所有其他解决方案也能正常工作。 只是以为我会为了完整性而把这一个混在一起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM