鱼C论坛

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

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

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

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

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

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

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


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

  8. #使用for in的筛选方法,对每个元素判断,从三个元组中,分别是数字集合、字母集合、特殊符号集合
  9. #列出数字、字母、特殊符号三个元组
  10. #保留记录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')
  11. #tuple2 = ('0','1','2','3','4','5','6','7','8','9')
  12. #tuple3 = ('~','!','@','#',','%','^','&','*','(',')','_','=','/',',','.','?','<','>',';',':','[',']','{','}','|','\\')
  13. #上方根本不用每个元素都加单引号手动捂脸
  14.     tuple1 = ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') #题目没有说大小写所以这个元组囊括了大写和小写字母
  15.     tuple2 = ('0123456789')
  16.     tuple3 = (r'~!@#$%^&*()_=/,.?<>;:[]{}|\\') #因为\放在字符串最后会报错,所以网上查到这种情况要放置偶数个\
  17.     count1 = 0 #如果不设置初始值都为0,那么当密码中没有字母时,下方语句if count1 + count2 + count3会报错,以此类推
  18.     count2 = 0
  19.     count3 = 0
  20.     for each in enter:
  21.         if each in tuple1:
  22.             count1 = 1 #统计密码中是否有字母 只要有字母即使最后一个字符不是字母,那么count1值也会为1(这句话为什么不是红色了)
  23.         if each in tuple2:
  24.             count2 = 1 #统计密码中是否有数字
  25.         if each in tuple3:
  26.             count3 = 1 #统计密码中是否有特殊符号
  27.     if count1 + count2 + count3 == 2:  #如果密码有任意两种组合
  28.         if len(enter) >= 8: #如果密码长度大于等于8
  29.             print('密码强度:中')
  30.         else: #如果密码长度小于8
  31.             print('密码由数字、字母和特殊符号中的两种元素组成,而且密码长度小于8位')
  32.     if count1 + count2 + count3 == 3:  #如果密码三种元素都包含
  33.         if enter[0] in tuple1:  #如果密码首位为字母
  34.             if len(enter) >= 16:    #如果密码长度大于等于16
  35.                 print('密码强度:高')
  36.             else:   #如果密码长度小于16位
  37.                 print('密码由三种元素组成,密码强度小于16位')
  38.         else:   #如果密码首位不是字母
  39.             print('密码由三种元素组成,而且密码首位不是字母')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-13 10:57:01 | 显示全部楼层
第一次发学习笔记帖哈哈,继续核对答案改代码去。。。
感谢鱼C平台
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  5. #判断长度
  6. length = len(passwd)

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

  9. if length <= 8:
  10.     flag_len = 1
  11. elif 8 < length < 16:
  12.     flag_len = 2
  13. else:
  14.     flag_len = 3

  15. flag_con = 0

  16. #判断是否包含特殊字符
  17. for each in passwd:
  18.     if each in symbols:
  19.         flag_con += 1
  20.         break

  21. #判断是否包含字母
  22. for each in passwd:
  23.     if each in chars:
  24.         flag_con += 1
  25.         break

  26. #判断是否包含数字
  27. for each in passwd:
  28.     if each in nums:
  29.         flag_con += 1
  30.         break

  31. #打印结果
  32. while 1:
  33.     print('您的密码安全级别评定为:', end='')
  34.     if flag_len == 1 or flag_con == 1:
  35.         print('低')
  36.     elif flag_len == 2 or flag_con ==2:
  37.         print('中')
  38.     else:
  39.         print('高')
  40.         print('请继续保持')
  41.         break

  42.     print('请按以下方式提升您的密码安全级别:\n\
  43.     \t1.密码必须由数字、字母及特殊字符三种组合\n\
  44.     \t2.密码只能由字母开头\n\
  45.     \t3.密码长度不能低于16位')
  46.     break
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

我觉得自己弄懂为什么这个的判断结果为‘低’了,想法如下:
当密码输入为123456789,运行至第43,44行代码时:
  1.     if flag_len == 1 or flag_con == 1:
  2.         print('低')
复制代码

此时flag+len == 2, 同时flag_con == 1
即上述IF条件为真; 而且上述语句先运行的,所以不进行45行的elif
小甲鱼最新课程 -> https://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行的内容。

等下次有空再对比一下自己的代码,看看哪些地方需要修改的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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