Python密码强度

4

我正在使用Python编写密码强度代码,想要判断我的密码(p)是否包含数字。我已经知道如何通过p.isupper()p.islower()来查看它是否包含大写或小写字母,并且我已经将它们放在一起了。我的朋友告诉我如何判断密码是否只包含数字,但现在我需要你的帮助。

running=True
while running:
    p=raw_input("What is your Password? ")
    if len(p) <6:
        print "Your Password is too short"
    if len(p) >12:
        print "Your Password is too long"
    if len(p) == 6 or 7 or 8 or 9 or 10 or 11 or 12:
        print "Password Length OK"
        running=False

print "Loop Broken" #this will be deleted, only for my help now

if p.isupper():
    print "Your Password is weak as it only contains capital letters"

if p.islower():
    print "Your Password is weak as it only contains lower case letters"

if p.isupper and p.islower:
    print "Your Password is of medium strength, try adding some numbers"

try:
    int(p)
    print "Your Password is weak as it only contains numbers"
except (ValueError, TypeError):
    pass

现在我需要的代码是,如果密码包含大小写字母和数字。

1
len(p) == 6 or 7 or 8 or 9 or 10 or 11 or 12: 应该改为 6<=len(p)<=12 - Ashwini Chaudhary
2
你们为什么在密码中设置了12个字符的上限? - 1615903
@user1615903 任务要求制作一个密码检查器,并检查其长度是否在6到12个字符之间。 - Anonymous
2个回答

6

对我来说,正则表达式绝对是处理这个问题最简单的方法。

给定一个示例密码password,您需要检查它的方法是:

import re
# Check if contains at least one digit
if re.search(r'\d', password):
    print "Has a digit"
# Check if contains at least one uppercase letter
if re.search(r'[A-Z]', password):
    print "Has uppercase letter"
# Check if contains at least one lowercase letter
if re.search(r'[a-z]', password):
    print "Has lowercase letter"

对于您的其他代码片段,您可以继续使用.isupper().islower()函数。

顺便提一下,您代码中的这部分内容:

if p.isupper and p.islower:
    print "Your Password is of medium strength, try adding some numbers"

这段代码无法按照您的期望工作。首先,您没有正确调用方法,因为您没有加上括号--您需要写成if p.isupper() and p.islower():。其次,这并不能实现您想要的功能。您试图检查它是否同时包含小写字母大写字母。相反,您正在检查它是完全大写字母还是完全小写字母,显然它不能同时满足两个条件,所以那个if语句将始终返回False。您需要使用类似以下的代码:

if re.search(r'[a-z]', password) and re.search(r'[A-Z]', password):

或者,另一种选择是不使用re:

import string
if any(letter in string.ascii_lowercase for letter in password) and \
  any(letter in string.ascii_uppercase for letter in password):

或者:

if any(letter.islower() for letter in password) and \
  any(letter.isupper() for letter in password):

我倾向于使用re,因为它更加简洁。

谢谢,伙计,你帮了我一个大忙 :) - Anonymous

1
我猜你想检查你的密码是否包含以下内容:小写字母、大写字母和数字。
>>> from string import ascii_lowercase, ascii_uppercase, digits
>>> s_lc = set(ascii_lowercase)
>>> s_uc = set(ascii_uppercase)
>>> s_d = set(digits)
def func(strs):
    s = set(strs)
    return all(s & x for x in (s_lc,s_uc,s_d ))
... 
>>> func('fooBar09')
True
>>> func('fooBar')
False
>>> func('900')
False
>>> func('900aB')
True

其次,len (p) == 6 or 7 or 8 or 9 or 10 or 11 or 12将被评估为:(len(p) == 6) or 7, 因此如果len(p)等于6,则返回True,否则返回7(也是一个Truthy值)。应该是:if 6 <= len(p) <= 12
>>> 7 or 8 or 9 or 10 or 11 or 12
    7

使用while True代替使用标志变量,并且此处需要使用if-elif-else条件,而不是if-if

while True:
    p=raw_input("What is your Password? ")
    le = len(p)
    if le <6:
        print "Your Password is too short"
    elif le >12:
        print "Your Password is too long"
    elif 6 <= le <= 12:
        print "Password Length OK"
        break

我会说是6或7...将返回7,这是True,除非len(p)实际上是6,在这种情况下它将直接返回True。它被评估为(len(p) == 6) or 7 - njzk2
@njzk2 我完全错过了 len(p) == 部分,正在修复。 :| - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接