鱼C论坛

 找回密码
 立即注册
查看: 2727|回复: 6

[学习笔记] 密码检查脚本自己的作答 -'P15 字符串:各种奇葩的内置方法' 课后题动动手0

[复制链接]
发表于 2019-12-13 10:53:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 WilsonWolf2333 于 2019-12-13 10:59 编辑

题目:请写一个密码安全性检查的脚本 check.py
题目给出的条件:
#密码安全性检查代码
#
#低级密码要求:
#1.密码由单纯的数字或字母组成
#2.密码长度小于等于8位
#
#中级密码的要求:
#1.密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=/,.?<>;:[]{}|\)任意两种组合
#2.密码长度不能低于8位
#
#高级密码要求:
#1.密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=/,.?<>;:[]{}|\)三种组合
#2.密码只能由字母开头
#3.密码长度不能低于16位

我自己的思路和代码:
enter = input('请设置密码:')
if enter.isalpha() or enter.isdecimal():  #密码由单纯的数字 或者 单纯的字母组成  
    if len(enter) <= 8: #如果密码小于等于8位
        print('密码强度:低')
    else:   #如果密码大于8位
        print('检测到密码为纯字母或者纯数字组合,而且密码长度大于8位')
else:   #如果密码不是由纯数字 或者 密码不是由纯字母组成

#使用for in的筛选方法,对每个元素判断,从三个元组中,分别是数字集合、字母集合、特殊符号集合
#列出数字、字母、特殊符号三个元组
#保留记录tuple1 = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')
#tuple2 = ('0','1','2','3','4','5','6','7','8','9')
#tuple3 = ('~','!','@','#',','%','^','&','*','(',')','_','=','/',',','.','?','<','>',';',':','[',']','{','}','|','\\')
#上方根本不用每个元素都加单引号手动捂脸
    tuple1 = ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') #题目没有说大小写所以这个元组囊括了大写和小写字母
    tuple2 = ('0123456789')
    tuple3 = (r'~!@#$%^&*()_=/,.?<>;:[]{}|\\') #因为\放在字符串最后会报错,所以网上查到这种情况要放置偶数个\
    count1 = 0 #如果不设置初始值都为0,那么当密码中没有字母时,下方语句if count1 + count2 + count3会报错,以此类推
    count2 = 0
    count3 = 0
    for each in enter:
        if each in tuple1:
            count1 = 1 #统计密码中是否有字母 只要有字母即使最后一个字符不是字母,那么count1值也会为1(这句话为什么不是红色了)
        if each in tuple2:
            count2 = 1 #统计密码中是否有数字
        if each in tuple3:
            count3 = 1 #统计密码中是否有特殊符号
    if count1 + count2 + count3 == 2:  #如果密码有任意两种组合
        if len(enter) >= 8: #如果密码长度大于等于8
            print('密码强度:中')
        else: #如果密码长度小于8
            print('密码由数字、字母和特殊符号中的两种元素组成,而且密码长度小于8位')
    if count1 + count2 + count3 == 3:  #如果密码三种元素都包含
        if enter[0] in tuple1:  #如果密码首位为字母
            if len(enter) >= 16:    #如果密码长度大于等于16
                print('密码强度:高')
            else:   #如果密码长度小于16位
                print('密码由三种元素组成,密码强度小于16位')
        else:   #如果密码首位不是字母
            print('密码由三种元素组成,而且密码首位不是字母')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-13 10:57:01 | 显示全部楼层
第一次发学习笔记帖哈哈,继续核对答案改代码去。。。
感谢鱼C平台
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-13 17:25:55 | 显示全部楼层
以下是小甲鱼答案。我正在研究“当密码为12345679时,为什么结果为低”
代码:
symbols = r'~!@#$%^&*()_=/,.?<>;:[]{}\|'
chars = ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
nums = ('0123456789')

passwd = input('请输入需要检查的密码组合:')

#判断长度
length = len(passwd)

while (passwd.isspace() or length == 0):
    passwd = input('您输入的密码为空(或空格),请重新输入:')

if length <= 8:
    flag_len = 1
elif 8 < length < 16:
    flag_len = 2
else:
    flag_len = 3

flag_con = 0

#判断是否包含特殊字符
for each in passwd:
    if each in symbols:
        flag_con += 1
        break

#判断是否包含字母
for each in passwd:
    if each in chars:
        flag_con += 1
        break

#判断是否包含数字
for each in passwd:
    if each in nums:
        flag_con += 1
        break

#打印结果
while 1:
    print('您的密码安全级别评定为:', end='')
    if flag_len == 1 or flag_con == 1:
        print('低')
    elif flag_len == 2 or flag_con ==2:
        print('中')
    else:
        print('高')
        print('请继续保持')
        break

    print('请按以下方式提升您的密码安全级别:\n\
    \t1.密码必须由数字、字母及特殊字符三种组合\n\
    \t2.密码只能由字母开头\n\
    \t3.密码长度不能低于16位')
    break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-13 17:28:27 | 显示全部楼层
我暂时觉得,这个密码判断结果应该为中吧。思路卡在这里,分析过程如下,是从IDLE Shell里直接复制粘贴的代码。
请输入需要检查的密码组合:123456789
您的密码安全级别评定为:低
请按以下方式提升您的密码安全级别:
            1.密码必须由数字、字母及特殊字符三种组合
            2.密码只能由字母开头
            3.密码长度不能低于16位
>>> flag_len
2
>>> flag_con
1
>>> flag_len == 2
True
>>> flag_con == 2
False
>>> True or False
True
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-14 16:38:21 | 显示全部楼层
WilsonWolf2333 发表于 2019-12-13 17:28
我暂时觉得,这个密码判断结果应该为中吧。思路卡在这里,分析过程如下,是从IDLE Shell里直接复制粘贴的代 ...

我觉得自己弄懂为什么这个的判断结果为‘低’了,想法如下:
当密码输入为123456789,运行至第43,44行代码时:
    if flag_len == 1 or flag_con == 1:
        print('低')
此时flag+len == 2, 同时flag_con == 1
即上述IF条件为真; 而且上述语句先运行的,所以不进行45行的elif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-14 16:47:52 | 显示全部楼层
WilsonWolf2333 发表于 2019-12-13 17:25
以下是小甲鱼答案。我正在研究“当密码为12345679时,为什么结果为低”
代码:

我理解这个代码的密码的具体判断标准为:(按下述123的顺序判断)
1.当密码长度小于等于8 或者 密码只包含一种元素时,强度判定为低;
2.当密码长度大于8小于16 或者 密码包含2中元素时,强度判定为中;
3.当密码长度大于等于16时 或者 密码包含三种元素时,强度判定为高。

第42-50行的eilf , else, break语句真的很妙啊,节省内存(反正就是省时间),还有break的位置保证了判定为高时,不会打印出第52行的内容。

等下次有空再对比一下自己的代码,看看哪些地方需要修改的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-16 17:22:28 | 显示全部楼层
结合答案和网络资源,最终写出了如下代码,可以实现的判定标准为:
1.当密码长度小于等于8 或者 密码只包含一种元素时,强度判定为低;
2.当密码长度大于8小于16 或者 密码包含2中元素时,强度判定为中;
3.当密码长度大于等于16时 或者 密码包含三种元素时,强度判定为高
4.当判定为高强度密码、同时首字母不为字母时,出现提示“如果密码以字母开头就更完美了”
5.判定结束出现是否继续的提示。
tuple1 = ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') #题目没有说大小写所以这个元组囊括了大写和小写字母
tuple2 = ('0123456789')
tuple3 = (r'~!@#$%^&*()_=/,.?<>;:[]{}|\\')
cou_len = 0
t = 'y'
while t == 'y':
        passwd = input('请输入密码来检查密码强度:')
        while passwd.isspace() or len(passwd) == 0:
                passwd = input('密码不能为空,请重新输入:')
        if len(passwd) <= 8:
                cou_len = 1
        elif 8 < len(passwd) < 16 :
                cou_len = 2
        elif len(passwd) >= 16:
                cou_len = 3
        count1 = 0
        for each in passwd:
                if each in tuple1:
                        count1 += 1
                        break
        for each in passwd:
                if each in tuple2:
                        count1 += 1
                        break
        for each in passwd:        
                if each in tuple3:
                        count1 += 1
                        break
        while 1:
                if cou_len == 1 or count1 == 1:
                        print('密码强度:低')
                elif cou_len == 2 or count1 == 2:
                        print('密码强度:中')
                elif (passwd[0] not in tuple1) and ( cou_len == 3 or count1 == 3):
                        print('密码强度:高')
                        print('如果密码以字母开头就更完美了')
                        break
                else:
                        print('密码强度:高')
                        print('请继续保持')
                        break
                print('''请按以下方式提升您的密码安全级别:
                \t1.密码必须由数字、字母及特殊字符三种组合
                \t2.密码只能由字母开头
                \t3.密码长度不能低于16位''')
                break
        t = input('还要继续吗?(输入y继续,其它退出)')
if t != 'y':
        print('测试结束。')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 16:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表