用Python写密码强度测试程序!原理居然就是这样!

概述

小时候申请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()



代码量很少,如果需要源码的可加下我的交流群:1136192749

 

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值