关于密码验证:密码验证-Python

Validation of a Password - Python

因此,我必须创建验证密码是否有效的代码:

  • 至少8个字符长
  • 包含至少1个数字
  • 包含至少1个大写字母

这是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def validate():
    while True:
        password = input("Enter a password:")
        if len(password) < 8:
            print("Make sure your password is at lest 8 letters")
        elif not password.isdigit():
            print("Make sure your password has a number in it")
        elif not password.isupper():
            print("Make sure your password has a capital letter in it")
        else:
            print("Your password seems fine")
            break

validate()

我不确定出什么问题,但是当我输入包含数字的密码时-它会一直告诉我我需要一个带有数字的密码。 有什么办法吗?


您可以将re模块用于正则表达式。

有了它,您的代码将如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import re

def validate():
    while True:
        password = raw_input("Enter a password:")
        if len(password) < 8:
            print("Make sure your password is at lest 8 letters")
        elif re.search('[0-9]',password) is None:
            print("Make sure your password has a number in it")
        elif re.search('[A-Z]',password) is None:
            print("Make sure your password has a capital letter in it")
        else:
            print("Your password seems fine")
            break

validate()


1
r_p = re.compile('^(?=\\S{6,20}$)(?=.*?\\d)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^A-Za-z\\s0-9])')

此代码将使用以下命令验证您的密码:

  • 最小长度为6,最大长度为20
  • 至少包含一个数字,
  • 至少一个大写字母和一个小写字母
  • 至少一个特殊字符

  • password.isdigit()不检查密码是否包含数字,而是根据以下条件检查所有字符:

    str.isdigit(): Return true if all characters in the string are digits
    and there is at least one character, false otherwise.

    password.isupper()不检查密码中是否包含大写字母,而是根据以下条件检查所有字符:

    str.isupper(): Return true if all cased characters in the string are
    uppercase and there is at least one cased character, false otherwise.

    对于解决方案,请在检查字符串是否包含数字时检查问题和可接受的答案。

    您可以构建自己的hasNumbers()函数(从链接的问题复制):

    1
    2
    def hasNumbers(inputString):
        return any(char.isdigit() for char in inputString)

    hasUpper()函数:

    1
    2
    def hasUpper(inputString):
        return any(char.isupper() for char in inputString)


    您正在检查整个密码字符串对象的isdigit和isupper方法,而不是字符串的每个字符。以下是检查密码是否符合您的特定要求的功能。它不使用任何正则表达式的东西。它还会打印输入密码的所有缺陷。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/usr/bin/python3
    def passwd_check(passwd):
       """Check if the password is valid.

        This function checks the following conditions
        if its length is greater than 6 and less than 8
        if it has at least one uppercase letter
        if it has at least one lowercase letter
        if it has at least one numeral
        if it has any of the required special symbols
       """

        SpecialSym=['$','@','#']
        return_val=True
        if len(passwd) < 6:
            print('the length of password should be at least 6 char long')
            return_val=False
        if len(passwd) > 8:
            print('the length of password should be not be greater than 8')
            return_val=False
        if not any(char.isdigit() for char in passwd):
            print('the password should have at least one numeral')
            return_val=False
        if not any(char.isupper() for char in passwd):
            print('the password should have at least one uppercase letter')
            return_val=False
        if not any(char.islower() for char in passwd):
            print('the password should have at least one lowercase letter')
            return_val=False
        if not any(char in SpecialSym for char in passwd):
            print('the password should have at least one of the symbols $@#')
            return_val=False
        if return_val:
            print('Ok')
        return return_val

    print(passwd_check.__doc__)
    passwd = input('enter the password : ')
    print(passwd_check(passwd))


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    uppercase_letter = ['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']

    number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

    import re

    info ={}

    while True:

        user_name = input('write your username: ')

        if len(user_name) > 15:
            print('username is too long(must be less than 16 character)')
        elif len(user_name) < 3 :
            print('username is short(must be more than 2 character)')
        else:
            print('your username is', user_name)
            break


    while True:  

        password= input('write your password: ')

        if len(password) < 8 :
            print('password is short(must be more than 7 character)')

        elif len(password) > 20:
            print('password is too long(must be less than 21 character)')

        elif re.search(str(uppercase_letter), password ) is None :
            print('Make sure your password has at least one uppercase letter in it')

        elif re.search(str(number), password) is None :
            print('Make sure your password has at least number in it')

        else:
            print('your password is', password)
            break

    info['user name'] = user_name

    info['password'] = password

    print(info)


    例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class Password:
        def __init__(self, password):
            self.password = password

        def validate(self):        
            vals = {
            'Password must contain an uppercase letter.': lambda s: any(x.isupper() for x in s),
            'Password must contain a lowercase letter.': lambda s: any(x.islower() for x in s),
            'Password must contain a digit.': lambda s: any(x.isdigit() for x in s),
            'Password must be at least 8 characters.': lambda s: len(s) >= 8,
            'Password cannot contain white spaces.': lambda s: not any(x.isspace() for x in s)            
            }
            valid = True  
            for n, val in vals.items():                        
               if not val(self.password):                  
                   valid = False
                   return n
            return valid                

        def compare(self, password2):
            if self.password == password2:
                return True


    if __name__ == '__main__':
        input_password = input('Insert Password: ')
        input_password2 = input('Repeat Password: ')
        p = Password(input_password)
        if p.validate() is True:
            if p.compare(input_password2) is True:
                print('OK')
        else:
           print(p.validate())

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    ''' Minimum length is 5;
     - Maximum length is 10;
     - Should contain at least one number;
     - Should contain at least one special character (such as &, +, @, $, #, %, etc.);
     - Should not contain spaces.
    '''


    import string

    def checkPassword(inputStr):
        if not len(inputStr):
            print("Empty string was entered!")
            exit(0)

        else:
            print("Input:","\"",inputStr,"\"")

        if len(inputStr) < 5 or len(inputStr) > 10:
            return False

        countLetters = 0
        countDigits = 0
        countSpec = 0
        countWS = 0

        for i in inputStr:
            if i in string.ascii_uppercase or i in string.ascii_lowercase:
                 countLetters += 1
            if i in string.digits:
                countDigits += 1
            if i in string.punctuation:
                countSpec += 1
            if i in string.whitespace:
                countWS += 1

        if not countLetters:
            return False
        elif not countDigits:
            return False
        elif not countSpec:
            return False
        elif countWS:
            return False
        else:
            return True


    print("Output:",checkPassword(input()))

    使用正则表达式

    1
    2
    3
    s = input("INPUT:")
    print("{}\
    {}"
    .format(s, 5 <= len(s) <= 10 and any(l in"0123456789" for l in s) and any(l in"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" for l in s) and not"" in s))

    模块导入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    from string import digits, punctuation

    def validate_password(p):
        if not 5 <= len(p) <= 10:
            return False

        if not any(c in digits for c in p):
            return False

        if not any(c in punctuation for c in p):
            return False

        if ' ' in p:
            return False

        return True

    for p in ('DJjkdklkl', 'John Doe'
    , '$kldfjfd9'):
        print(p, ': ', ('invalid', 'valid')[validate_password(p)], sep='')

    Python 2.7
    for循环将为每个字符分配一个条件编号。即列表中的Pa $$ w0rd = 1,2,4,4,2,3,2,2,5。由于集合仅包含唯一值,因此该集合= 1,2,3,4,5;因此,因为所有条件都满足,所以该集合的len =5。如果它是pa $$ w,则该集合= 2,4,而len = 2,因此无效

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    name = raw_input("Enter a Password:")
    list_pass=set()
    special_char=['#','$','@']
    for i in name:
        if(i.isupper()):
          list_pass.add('1')
      elif (i.islower()):
          list_pass.add('2')
      elif(i.isdigit()) :
          list_pass.add('3')
      elif(i in special_char):
          list_pass.add('4')
    if len(name) >=6 and len(name) <=12:
        list_pass.add('5')
    if len(list_pass) is 5:
        print ("Password valid")
    else: print("Password invalid")


    也许您可以使用正则表达式:

    1
    re.search(r"[A-Z]", password)

    检查大写字母。

    1
    re.search(r"[0-9]", password)

    检查密码中的数字。


    • isdigit()检查整个字符串是否为数字,而不是如果字符串包含数字

      Return true if all characters in the string are digits and there is at least one character, false otherwise.

    • isupper()检查整个字符串是大写的,而不是如果字符串包含至少一个大写字符。

      Return true if all cased characters in the string are uppercase and there is at least one cased character, false otherwise.

    您需要使用any内置函数:

    • 如果password中至少存在一位数字,则any([x.isdigit() for x in password])将返回True。
    • 如果至少一个字符被视为大写,则any([x.isupper() for x in password])将返回True。

    或者,您可以使用它来检查它是否至少有一位数字:

    1
    min(passwd).isdigit()