密码检查脚本自己的作答 -'P15 字符串:各种奇葩的内置方法' 课后题动动手0
本帖最后由 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 in tuple1:#如果密码首位为字母
if len(enter) >= 16: #如果密码长度大于等于16
print('密码强度:高')
else: #如果密码长度小于16位
print('密码由三种元素组成,密码强度小于16位')
else: #如果密码首位不是字母
print('密码由三种元素组成,而且密码首位不是字母') 第一次发学习笔记帖哈哈,继续核对答案改代码去。。。
感谢鱼C平台{:5_91:} 以下是小甲鱼答案。我正在研究“当密码为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
我暂时觉得,这个密码判断结果应该为中吧。思路卡在这里,分析过程如下,是从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
>>> 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
WilsonWolf2333 发表于 2019-12-13 17:25
以下是小甲鱼答案。我正在研究“当密码为12345679时,为什么结果为低”
代码:
我理解这个代码的密码的具体判断标准为:(按下述123的顺序判断)
1.当密码长度小于等于8 或者 密码只包含一种元素时,强度判定为低;
2.当密码长度大于8小于16 或者 密码包含2中元素时,强度判定为中;
3.当密码长度大于等于16时 或者 密码包含三种元素时,强度判定为高。
第42-50行的eilf , else, break语句真的很妙啊,节省内存(反正就是省时间),还有break的位置保证了判定为高时,不会打印出第52行的内容。
等下次有空再对比一下自己的代码,看看哪些地方需要修改的。 结合答案和网络资源,最终写出了如下代码,可以实现的判定标准为:
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 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('测试结束。')
页:
[1]