Python 中的密码检查器 - 无法满足某些条件

Password Checker in Python - unable to satisfy certain conditions

提问人:Sebastian 提问时间:10/23/2023 最后编辑:Sebastian 更新时间:10/23/2023 访问量:52

问:

我必须编写一个 python 代码,根据以下条件对密码的强度进行分类: (a) 如果出现以下任一情况,则字符串为非法密码:

  • 它是一个英语单词(在一组ENGLISH_WORDS中定义)
  • 它包含任何不可见字符(空格、制表符、换行符)

(b) 如果字符串不是非法的,并且

  • 它的长度少于 8 个字符。
  • 它是一个英语单词,后跟一个或多个十进制数字字符

(c) 如果字符串不是非法的,并且:

  • 它至少包含 12 个字符
  • 并且它至少包含 1 个小写字母
  • 并且它至少包含 1 个大写字母
  • 并且它至少包含 1 个数字
  • 并且它包含至少 1 个特殊字符(任何不是字母或数字的可见 ASCII 字符)

(d) 如果字符串不是非法密码,也不是弱密码,也不是强密码,则该字符串是中等密码。

该问题要求我编写一个函数password_strength该函数接受字符串参数并将函数的强度返回为 ILLEGAL、STRONG、WEAK 或 MEDIUM。假设输入密码仅由 ASCII 字符组成,即:字母、数字、特殊可见字符、空格、制表符和换行符。特殊可见字符包括:

~'!@#$%^&*(){}[]|/:;";<>.?

注意:ENGLISH_WORDS是一组常见的英语单词(全部为小写),已经导入到我的笔记本中。我想在不导入模块的情况下继续它

这是我的代码:

def password_strength( password ):

    *#Checking if a string (password in this case) is an ILLEGAL password*
    if password.lower().strip() in ENGLISH_WORDS or " " in password or "\t" in password  or "\n" in password:
        return "ILLEGAL"

    *#Checking if a string is a WEAK Password*
    elif len(password) < 8 or (any(password[:-i].lower().strip() in ENGLISH_WORDS for i in range(1, len(password))) and any(char.isdigit() for char in password)):
        return "WEAK"

    *#Checking if a string is a STRONG Password*
    elif len(password) >= 12 and any(c.islower() for c in password) and any(c.isupper() for c in password) and any(c.isdigit() for c in password) and any(c in "~`!@#$%^&*(){}[]|\/:;\";<>.?" for c in password):
        return "STRONG"

    *#If three conditions outlined above are not met, then the string is a MEDIUM password*
    else:
        return "MEDIUM"

*对于输入密码“Secret999!”,该函数将其返回为“WEAK”,而预期答案为“MEDIUM” *

python 列表 if 语 语句

评论

0赞 Barmar 10/23/2023
它很弱,因为它以英语单词开头并包含数字。secret
0赞 Barmar 10/23/2023
顺便说一句,如果您在开始时将密码转换为较低,而不是重复调用,效率会更高.lower()
0赞 Sebastian 10/23/2023
@Barmar我应该如何继续为 WEAK 密码获取正确的条件?我目前正在修复中,但无法获得正确的解决方案
0赞 Barmar 10/23/2023
我想你想要在争论中。这将测试单词后面的其余密码是否全部为数字。and password[i:].isdigit()any()
0赞 Sebastian 10/23/2023
@Barmar 以听起来很愚蠢为代价(我是 Python 新手),我如何将其合并到我的 any() 参数中?这是正确的吗?: elif len(password) < 8 或 (any(password[:-i].lower().strip() and password[i:].isdigit() in ENGLISH_WORDS for i in range(1, len(password))) and any(char.isdigit() for char in password)):

答:

0赞 Barmar 10/23/2023 #1

测试会查找密码中任意位置的数字。规范说数字跟在单词后面。因此,请检查单词后面的密码切片是否全是数字。WEAK

    elif len(password) < 8 or (any(password[:-i].lower().strip() in ENGLISH_WORDS and password[-i:].isdigit() for i in range(1, len(password)))):
        return "WEAK"

评论

0赞 Sebastian 10/23/2023
先生,感谢您提供正确的代码行。在使用某些用例进行测试时,对于输入“secret99”,代码返回 MEDIUM,而正确的输出列为 WEAK。我还应该查看其他内容以获得正确的结果吗?
0赞 Barmar 10/23/2023
对不起,本来应该的password[i:]password[-i:]