python 3.3密码检查器

时间:2017-12-01 13:27:15

标签: python

我正在创建一个程序来检查密码是否足够强大:

  • 他们需要上限,
  • 小写,
  • 数字,
  • 符号和
  • 不能包含简单的密码。

正如你在下面看到的,这只是我的一些代码,我有一个菜单和一个密码检查器,唯一的问题是,当我输入密码时,检查器似乎没有工作,总是说它是一个强密码,即使它不包含任何大写字母或数字或符号。以下是我的代码。

import random #importing random
import time #importing time
global Menu

def Menu():
    global optionchoice #globalising variable optionchoice so that it can be used inside of another def of the code
    print("Hey, Welcome to PassWordChecker.")
    time.sleep(2) #delaying the next line for 2 seconds
    print("Please choose one of the options below." )
    time.sleep(1)
    print("MENU:")
    print("***")
    print("    press 1 once for              :           password checker  ")
    print("    press 2 twice for             :           password generator")
    print("    press 3 two or three times to :           Quit              ")
    print("                                                                 ***") #creating a basic menu
    optionchoice = (input("which option would you like to choose?"))

def checkpasswordandinput():
    global optionchoice
    optionchoice = optionchoice
    if optionchoice == '1':
        print(" please enter a password. ")
        UserPassword = input("")
        if len(UserPassword) <= 8 or len(UserPassword) >= 24 or UserPassword == UserPassword.isupper() or UserPassword == UserPassword.isdigit() or UserPassword == UserPassword.islower() or UserPassword == UserPassword.isalpha():
            print("make sure your password includes numbers and upper and lower case letters  ")
            UserPassword = input('please enter a new password')
        else:
            print('your password is a very good one that is difficult to crack')
            return Menu()

对未来读者的说明:

请不要在上面的表格中写代码:

  1. 不要导入您不需要的模块
  2. 不要使用全局变量
  3. 使用循环:例如while True:
  4. 从其他功能调用功能
  5. 将值从一个函数返回给调用者:optionchoice = menu()
  6. 上述代码在这种形式下会更好:

    import time
    
    def menu():
        print("    press 1 for password checker  ")
        print("    press 2 for password generator")
        print("    press 3 to Quit")
        return input("which option would you like to choose?")
    
    def checkpasswordandinput():
        while True:
            optionchoice = menu()
            if optionchoice == '1':
                #Enter password and validate
                pass
            # detect other options
            if optionchoice == '3':
                break
    
    
    checkpasswordandinput()
    

2 个答案:

答案 0 :(得分:1)

UserPassword == UserPassword.isupper()形式的检查不起作用。在这里,您将字符串(密码)与布尔值(isX()的结果)进行比较。因此,所有这些检查都是False,然后您到达else分支(如果长度可以接受)。

对于大写和小写字符,您可以使用UserPassword == UserPassword.upper()代替upper,而不是isupper,类似于lower()),即比较密码它的上/下版本,但对于数字这不起作用。相反,您可以使用any检查是否有任何字符是数字:any(c.isdigit() for c in UserPassword)

编辑:您可以使用UserPassword == UserPassword.upper()检查密码是否包含任何小写字母,这有点不直观。相反,我建议使用any进行所有检查并反转条件,这样“正”情况在if体内,而“负”在其他情况下。像这样:

up = UserPassword
if 8 <= len(up) <= 24 and any(c.isupper() for c in up) and any(c.islower() for c in up) and any(c.isdigit() for c in up) and any(c.isalpha() for c in up):

或者稍微短一点,使用一系列功能:

if 8 <= len(up) <= 24 and all(any(f(c) for c in up) for f in (str.islower, str.isupper, str.isdigit, str.isalpha)):

答案 1 :(得分:0)

所以你需要做以下的事情:

hasUpper = False
hasLower = False
hasDigit = False

等等

然后,请输入密码&#39;一次一个字符: 即。 string [1],string [2],string [3]

在它上面运行你的布尔结果(isupper,islower等) 如果为true,则将hasUpper,hasLower,hasDigit更改为True

然后,一旦完成整个字符串,请根据您的要求检查您的布尔结果。即:

如果要求是上限,下限和数字。

if hasUpper = True and hasLower = True and hasDigit = True:

那么它是一个很好的密码等等。

有意义吗?