Python密码检查器

时间:2015-06-03 21:32:41

标签: python

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

  • 密码长度必须至少为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

编辑**

我意识到我还要检查是否有常用的密码,如'密码'或'111111',我真的不知道如何处理这个问题。

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

you are just missing a branch

elif note:
    return False

before the else:

答案 2 :(得分:1)

这是谈论装饰者的好时机!我喜欢使用装饰器验证数据probably too much。您可以为所有这些创建验证器,并将其包裹在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! ")

答案 3 :(得分:0)

以下检查每个故障情况,并进行短路检查(一旦找到某些东西,它将停止检查)。 “常见”密码并不常见,但我想要通过其余检查的值。

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

答案 4 :(得分:0)

另一种方法......

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;有些人喜欢它,有些人讨厌它。无论如何,所有其他解决方案也同样有效。我以为我会把这个扔进混合中以保持完整。