python 测试密码强度_关于python:检查密码强度(如何检查条件)

我正在尝试创建一个系统,要求您输入密码。如果全部较低,较高或编号,则打印较弱;如果是两个条件,则将其显示为med,如果满足所有条件,则显示为较强。看来似乎行不通。

弱而强的作品,但媒介却没有。

我不知道哪里出了问题。

def password():

print ('enter password')

print ()

print ()

print ('the password must be at least 6, and no more than 12 characters long')

print ()

password = input ('type your password    ....')

weak = 'weak'

med = 'medium'

strong = 'strong'

if len(password) >12:

print ('password is too long It must be between 6 and 12 characters')

elif len(password) <6:

print ('password is too short It must be between 6 and 12 characters')

elif len(password)    >=6 and len(password) <= 12:

print ('password ok')

if password.lower()== password or password.upper()==password or password.isalnum()==password:

print ('password is', weak)

elif password.lower()== password and password.upper()==password or password.isalnum()==password:

print ('password is', med)

else:

password.lower()== password and password.upper()==password and password.isalnum()==password

print ('password is', strong)

afaik isalnum()返回一个布尔值,因此它永远不会等于密码

你好吗?

最好的方法是使用正则表达式搜索

这是我当前正在使用的功能

def password_check(password):

"""

Verify the strength of 'password'

Returns a dict indicating the wrong criteria

A password is considered strong if:

8 characters length or more

1 digit or more

1 symbol or more

1 uppercase letter or more

1 lowercase letter or more

"""

# calculating the length

length_error = len(password) < 8

# searching for digits

digit_error = re.search(r"\\d", password) is None

# searching for uppercase

uppercase_error = re.search(r"[A-Z]", password) is None

# searching for lowercase

lowercase_error = re.search(r"[a-z]", password) is None

# searching for symbols

symbol_error = re.search(r"[ !#$%&'()*+,-./[\\\\\\]^_`{|}~"+r'"]', password) is None

# overall result

password_ok = not ( length_error or digit_error or uppercase_error or lowercase_error or symbol_error )

return {

'password_ok' : password_ok,

'length_error' : length_error,

'digit_error' : digit_error,

'uppercase_error' : uppercase_error,

'lowercase_error' : lowercase_error,

'symbol_error' : symbol_error,

}

编辑:

以下是Lukasz的建议,它是对特殊符号条件验证的更新

symbol_error = re.search(r"\\W", password) is None

对于symbol_error是否有使用'\\\\ W * \\\\ s'的方法?列出符号似乎效率不高。例如,您提供的列表省略了?,以及许多其他内容。

感谢您的评论Lukasz。使用特殊序列\\\\ W可以简化符号搜索。不需要包含\\\\,因为\\\\ W中已经包含空格。因此,"搜索符号"的代码必须更改为:symbol_error = re.search(r" \\\\ W",password)为None

我喜欢这种方法。清晰,简单且可读性强。不确定是否要在密码中保留空格?尽管对此的意见似乎有所不同:security.stackexchange.com/questions/32691/…

至少前导和尾随空格应错误:o.whitespace_error = len(pwd.strip()) != len(pwd)

password.isalnum()返回一个布尔值,因此password.isalnum()==password始终为False。

只需省略==password部分:

if password.lower()== password or password.upper()==password or password.isalnum():

# ...

接下来,它永远不能同时是所有上限和下限,也不能全部是上限和下限,也不能全部是下限和所有数,因此第二个条件(中)是不可能的。也许您应该寻找一些大写,小写和数字的出现?

但是,首先要解决的另一个问题。您正在测试密码是否为字母数字,仅由字符和/或数字组成。如果只想测试数字,请使用.isdigit()。

您可能想熟悉字符串方法。您可以尝试使用方便的.islower()和.isupper()方法,例如:

>>> 'abc'.islower()

True

>>> 'abc123'.islower()

True

>>> 'Abc123'.islower()

False

>>> 'ABC'.isupper()

True

>>> 'ABC123'.isupper()

True

>>> 'Abc123'.isupper()

False

与使用password.upper() == password相比,这些命令更快且更详细,以下将对其进行测试:

if password.isupper() or password.islower() or password.isdigit():

# very weak indeed

您要学习的下一个技巧是遍历字符串,以便可以测试各个字符:

>>> [c.isdigit() for c in 'abc123']

[False, False, False, True, True, True]

如果将其与any()函数结合使用,则可以测试是否有一些数字字符:

>>> any(c.isdigit() for c in 'abc123')

True

>>> any(c.isdigit() for c in 'abc')

False

我认为您在测试密码强度时会发现这些技巧很方便。

这里是您写的内容的重拍:

import re

def password():

print ('Enter a password\

\

The password must be between 6 and 12 characters.\

')

while True:

password = input('Password: ... ')

if 6 <= len(password) < 12:

break

print ('The password must be between 6 and 12 characters.\

')

password_scores = {0:'Horrible', 1:'Weak', 2:'Medium', 3:'Strong'}

password_strength = dict.fromkeys(['has_upper', 'has_lower', 'has_num'], False)

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

password_strength['has_upper'] = True

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

password_strength['has_lower'] = True

if re.search(r'[0-9]', password):

password_strength['has_num'] = True

score = len([b for b in password_strength.values() if b])

print ('Password is %s' % password_scores[score])

输出(样本):

>>> password()

Enter a password

The password must be between 6 and 12 characters.

Password: ... ghgG234

Password is Strong

将raw_input切换为input,您可以使用,如果使用python 2,也可以,反之亦然。(我已经编辑了答案,所以应该可以使用)

我也在寻找一些密码强度检查功能,并发现了很多半途而废的建议。我基于该函数组装了自己的函数。

希望能提供帮助

def get_pw_strength( pw ):

s_lc = set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z'])

s_uc = set(['A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'Q', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Y', 'X', 'Z'])

s_dg = set(['1', '0', '3', '2', '5', '4', '7', '6', '9', '8'])

s_sp = set(['+', ',', '.', '-', '?', ':', '_', '(', ')', '*', '/', ';', '+', '!'])

pw_s = 0

pw_steps = (5, 8, 12)

pw_l = len(pw)

if ( pw_l < 4 ):

return 0

for l in pw_steps :

if ( pw_l > l ):

pw_s += 1

#print"length over", l," giving point", pw_s

c_lc = c_uc = c_dg = c_sp = 0

for c in pw :

if ( c in s_lc ) :

c_lc += 1

if ( c in s_uc ) :

c_uc += 1

if ( c in s_dg ) :

c_dg += 1

if ( c in s_sp ) :

c_sp += 1

if ( c_lc + c_uc + c_dg + c_sp  <> pw_l ):

#print c_lc, c_uc, c_dg, c_sp, pw_l

#raise Exception"Forbidden chracter"

return -1

charset = 0

if ( c_lc ) :

pw_s += 1

charset = len(s_lc)

if ( c_uc ) :

pw_s += 1

charset = len(s_uc)

if ( c_dg ) :

pw_s += 1

charset = len(s_dg)

if ( c_sp ) :

pw_s += 2

charset = len(s_sp)

entropy = log(pow(charset,pw_l),2)

return pw_s, entropy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值