提问人:Sebastian 提问时间:10/23/2023 最后编辑:Sebastian 更新时间:10/23/2023 访问量:52
Python 中的密码检查器 - 无法满足某些条件
Password Checker in Python - unable to satisfy certain conditions
问:
我必须编写一个 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” *
答:
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:]
评论
secret
.lower()
and password[i:].isdigit()
any()