【发布时间】:2017-07-19 00:30:30
【问题描述】:
我有以下代码来测试密码强度:
import string
def golf(password):
if len(password) >= 10:
if any(char.isdigit() for char in password):
if any(string.punctuation for char in password):
if any(char.isalpha() for char in password):
if any(char.isupper() for char in password):
if any(char.islower() for char in password):
return True
return False
我知道它可以做得更好!它需要测试以下...
如果密码足够强 至少有 10 个字符 至少包含一位数字 至少包含一个大写字母 至少包含一个小写字母。密码只能包含 ASCII 拉丁字母或数字,但没有标点符号。
编辑
其他任何人都可以,我使用正则表达式将其归结为以下内容。
import re
def golf(password):
return re.match( r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.{10,30}).+$', password)
显然它还可以更短......
【问题讨论】:
-
你不能用
and吗? -
if any(string.punctuation for char in password):看起来不对 -
你考虑过正则表达式匹配吗?
-
我知道这可能只是一个练习,但如果你真的在使用它来保护人们的安全,请考虑使用像 zxcvbn 这样的库。这是他们在 DropBox 使用的。甚至还有一个 Python 端口 github.com/dwolfhub/zxcvbn-python。它是专门为箔饼干而设计的,这很困难。
-
如果你想走@DavidHoelzer 提到的正则表达式路线:stackoverflow.com/q/1559751/4996248
标签: python