概述
小时候申请QQ账号时,经常被密码设置难住,设置高强度密码咋就这么难呢。今天,就着手写一个判断密码强度的程序。
通常密码设置有以下三点要求:1、字符长度需在8-16位之间;2、不能使用空格、中文字符;3、至少含有数字/字母/字符2种组合。另外,针对密码强度,笔者就不设置太复杂的规则了,在满足上述3个条件的基础上,密码有数字/字母/字符2种组合为密码强度中,有数字/字母/字符3种组合为密码强度高。
下面就开始吧= ^ =
思路
1、首先可以分别编写三个函数,分别判断密码中的字符类型(数字/字母/字符);
2、然后编写一个判断合法性程序,判断密码长度、字符类型以及组合形式是否合法;
3、最后编写主程序,按密码要求思路调用上述1和2中函数,即可完成密码强度判断
代码解析
1、数字判断
def check_number(password): for c in password: if c.isnumeric(): # str.isnumeric()用于判断字符串是否只包含数字字符 return True break # 遍历密码,遇到数字字符及函数返回True并结束遍历;若遍历完所有字符无数字字符,则函数返回为None(假)
2、字母判断
def check_letter(password):
for c in password:
if 'a'<=c<='z' or 'A'<=c<='Z':
return True
break
3、字符判断
def check_mark(password):
for c in password:
if not (c.isnumeric() or 'a'<=c<='z' or 'A'<=c<='Z'):
return True
break
4、合法性判断
def check_legal(password):
if len(password)<8 or len(password)>16:
print('长度需为8-16个字符,请重新输入。')
return False
else:
for i in password:
if 0x4e00<=ord(i)<=0x9fa5 or ord(i)==0x20: # Ox4e00等十六进制数分别为中文字符和空格的Unicode编码
print('不能使用空格、中文,请重新输入。') # ord(c)用于返回一个字符c的Unicode数值
return False
else:
key = 0
key += 1 if check_number(password) else 0
key += 1 if check_letter(password) else 0
key += 1 if check_mark(password) else 0
if key >= 2:
return True
else:
print('至少含数字/字母/字符2种组合,请重新输入。')
return False
5、主程序
def main():
while True:
password = input('请输入密码:')
if check_legal(password):
strength_level = 0
strength_level += 1 if check_number(password) else 0
strength_level += 1 if check_letter(password) else 0
strength_level += 1 if check_mark(password) else 0
if strength_level == 2:
print('密码设置成功!'+'*'*10+'强度等级中'+'*'*10)
break
else:
print('密码设置成功!'+'*'*10+'强度等级高'+'*'*10)
break
else:
continue
完整代码、效果展示
def check_number(password):
for c in password:
if c.isnumeric():
return True
break
def check_letter(password):
for c in password:
if 'a'<=c<='z' or 'A'<=c<='Z':
return True
break
def check_mark(password):
for c in password:
if not (c.isnumeric() or 'a'<=c<='z' or 'A'<=c<='Z'):
return True
break
def check_legal(password):
if len(password)<8 or len(password)>16:
print('长度需为8-16个字符,请重新输入。')
return False
else:
for i in password:
if 0x4e00<=ord(i)<=0x9fa5 or ord(i)==0x20: # Ox4e00等十六进制数分别为中文字符和空格的Unicode编码
print('不能使用空格、中文,请重新输入。')
return False
else:
key = 0
key += 1 if check_number(password) else 0
key += 1 if check_letter(password) else 0
key += 1 if check_mark(password) else 0
if key >= 2:
return True
else:
print('至少含数字/字母/字符2种组合,请重新输入。')
return False
def main():
while True:
password = input('请输入密码:')
if check_legal(password):
strength_level = 0
strength_level += 1 if check_number(password) else 0
strength_level += 1 if check_letter(password) else 0
strength_level += 1 if check_mark(password) else 0
if strength_level == 2:
print('密码设置成功!'+'*'*10+'强度等级中'+'*'*10)
break
else:
print('密码设置成功!'+'*'*10+'强度等级高'+'*'*10)
break
else:
continue
if __name__ == '__main__':
main()