案例描述:
- 密码强度:是指一个密码对抗猜测或暴力破解的有效程度;一般是指一个未授权的访问者得到正确密码的平均尝试次数。
- 强密码可以降低安全漏洞的整体风险
- 简易版(常用)规则:
1. 密码长度至少8位
2. 密码含有数字
3. 密码含有字母
案例分析:
- 设置一个变量strength_level用于记录密码的强弱,初始为0.满足一个条件,对其加1
- 长度判断:使用len()方法
- 包含数字判断:使用isnumeric()方法
- 包含字母判断:使用isalpha()方法
- 如果strength_level等于3,密码强度合格,否则不合格。
Python字符串:
- str.isnumeric() 检测字符串是否只由数字组成
- str.isalpha() 检测字符串是否只由字母组成tr
- str.islower() 检测字符串中所有的字母是否都为小写
- str.isupper() 检测字符串中所有的字母是否都为大写
- 更多isxxxx()方法请参考: https://docs.python.org/3/library/stdtypes.html#string-methods
代码:
- 1.0版本:
'''
判断密码强弱
版本1.0
'''
def check_number(pass_word):
for i in pass_word:
if i.isnumeric():
return True
return False
def check_letter(pass_word):
for i in pass_word:
if i.isalpha():
return True
return False
def main():
pass_word = input('请输入密码:')
strength_level = 0 #密码强度
if len(pass_word) < 7:
print('密码长度不足7位')
else:
strength_level += 1
if check_number(pass_word):
strength_level += 1
else:
print('要求包含数字')
if check_letter(pass_word):
strength_level += 1
else:
print('要求包含字母')
if strength_level == 3 :
print('密码强度合格')
else:
print('不合格')
if __name__ == '__main__':
main()
- 版本2.0:(1)限制密码次数,比如最多尝试5次。(2)如何终止循环
'''
判断密码强弱
版本2.0
'''
def check_number(pass_word):
has_number = False
for i in pass_word:
if i.isnumeric():
has_number = True
break
return has_number
def check_letter(pass_word):
has_letter = False
for i in pass_word:
if i.isalpha():
has_letter = True
break
return has_letter
def main():
try_times = 5
while try_times > 0:
pass_word = input('请输入密码:')
strength_level = 0 #密码强度
if len(pass_word) < 7:
print('密码长度不足7位')
else:
strength_level += 1
if check_number(pass_word):
strength_level += 1
else:
print('要求包含数字')
if check_letter(pass_word):
strength_level += 1
else:
print('要求包含字母')
if strength_level == 3 :
print('密码强度合格')
break
else:
print('不合格')
try_times -= 1
if try_number <= 0 :
print('尝试超过5次。退出')
if __name__ == '__main__':
main()
- 版本3.0:保存设置的密码及其对应的强度到文件中。
文件的基础:
- 文本文件:一般指只有字符编码存储的文件,能够被最简单的文本编辑器直接读取。
- 编码:信息从一种形式转换为另一种形式的过程
- 常用的编码:
ASCII,Unicode,UTF-8....
- 多行文本,用\n表示换行。
文件的操作:
- 步骤:打开文件 -> 操作文件(读、写等) -> 关闭文件
- 1.打开文件:建立文件与程序的关联
open(filename,mode)
filename:文件名(包括途径);mode:打开模式
打开模式: r 只读,文件不存在则报错
w 只写,文件不存在则自动创建
a 在文件末尾附加
r+ 读写
- 2.操作文件:写入,读取,等
写入操作:从计算机内存向文件写入数据
write():将文本数据写入文件中
writelines():将字符串列表写入文件中
- 3.关闭文件:终止程序与文件的关联 close()
具体代码:(1)只在密码合格时存储:
if strength_level == 3 :
print('密码强度合格')
#写入文件中
f = open('password_3.0_txt','a')
f.write(pass_word)
f.close()
break
其他不变。
(2)无论是否合格,都进行存储。
# 写入文件中
f = open('password_3.0_txt', 'a')
f.write(pass_word + '\n')
f.close()
if strength_level == 3 :
print('密码强度合格')
break
其他不变。
(2.1)不仅存储密码,还存储强度。
# 写入文件中
f = open('password_3.0_txt', 'a')
f.write('密码是{},强度是{}\n'.format(pass_word,strength_level))
f.close()
if strength_level == 3 :
print('密码强度合格')
break
其他不变。
- 版本4.0:读取保存的密码
文件的操作:
- 读取操作:从文件中读取数据到计算机内存中
- read():返回值为包含整个文件内容的一个字符串
- readline():返回值为文件下一行内容的字符串
- readlines():返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串
- 文件的遍历:
f = open ('tmp.txt','r')
for line in f.readlines(): #或 for line in f:
#处理一行数据
pass
f.close()
- 代码:(1)
#读取文件
f = open('password_3.0_txt','r')
#1.read()
content = f.read()
print(content)
f.close()
- 代码:(2)
#读取文件
f = open('password_3.0_txt','r')
#2. readline()
line = f.readline()
print(line)
line = f.readline()
print(line)
f.close()
只读两行。readline一次只读一行。
- 代码:(3)
#读取文件
f = open('password_3.0_txt','r')
#3. readlines()
lines = f.readlines()
print(lines)
f.close()
输出为:(以列表的形式)
- 代码(4):读入:以列表形式读取文件,遍历:以行的形式遍历
#读取文件
f = open('password_3.0_txt','r')
#3. readlines()
lines = f.readlines()
for line in lines:
print('read:{}'.format(line))
f.close()
输出为:
- 具体代码实现:因为已经将密码保存到文件中。所以不需要再输入。
'''
判断密码强弱
4.0
'''
def check_number(pass_word):
has_number = False
for c in pass_word:
if c.isnumeric():
has_number = True
break
return has_number
def check_letter(pass_word):
has_letter = False
for c in pass_word:
if c.isalpha():
has_letter = True
break
return has_letter
def main():
# try_number = 5 #限制密码尝试次数
#
# while try_number > 0:
# pass_word = input('请输入密码:')
# strength_level = 0 #设置密码强度
# #规则1
# if len(pass_word) >= 8:
# strength_level += 1
# else:
# print('密码位数至少为8位')
# #规则2
# if check_number(pass_word):
# strength_level += 1
# else:
# print('密码应该包含数字')
# #规则3
# if check_letter(pass_word):
# strength_level += 1
# else:
# print('密码应该包含字母')
#
# #写文件
# f = open('password_3.0_txt','a')
# f.write('密码是{},密码强度是{}\n'.format(pass_word,strength_level))
# f.close()
#
# if strength_level == 3:
# print('密码合格')
# break
# else:
# print('密码不合格')
# try_number -= 1
# if strength_level != 3:
# print('密码设置次数过多。')
# 读取文件
f = open('password_3.0_txt', 'r')
lines = f.readlines()
for line in lines:
print('read{}'.format(line))
f.close()
if __name__ == '__main__':
main()
- 版本5.0:这些方法都是与‘密码操作’相关的,能否将这些方法封装成一个整体?
- 即,将相关方法封装成一个整体:面向对象编程
'''
判断密码强弱
5.0
'''
class PasswordTool:
'''
密码工具类
'''
#定义类的属性
def __init__(self,password):
self.password = password
self.strength_level = 0
# 定义类的行为
def process_password(self):
# 规则1
if len(self.password) >= 8:
self.strength_level += 1
else:
print('密码位数至少为8位')
# 规则2
if self.check_number():
self.strength_level += 1
else:
print('密码应该包含数字')
# 规则3
if self.check_letter():
self.strength_level += 1
else:
print('密码应该包含字母')
#类的方法
def check_number(self): #检查是否有数字
has_number = False
for c in self.password:
if c.isnumeric():
has_number = True
break
return has_number
def check_letter(self): #检查是否有字母
has_letter = False
for c in self.password:
if c.isalpha():
has_letter = True
break
return has_letter
def main():
try_number = 5 #限制密码尝试次数
while try_number > 0:
pass_word = input('请输入密码:')
#实例化密码工具对象
password_tool = PasswordTool(pass_word) #完成初始化
password_tool.process_password() #调用类
#写文件
f = open('password_5.0_txt','a')
f.write('密码是{},密码强度是{}\n'.format(pass_word,password_tool.strength_level))
f.close()
if password_tool.strength_level == 3:
print('密码合格')
break
else:
print('密码不合格')
try_number -= 1
if try_number <= 0 :
print('密码设置次数过多。')
if __name__ == '__main__':
main()
- 版本6.0:将文件操作封装到一个类中
代码:
'''
判断密码强弱
6.0
'''
class PasswordTool:
'''
密码工具类
'''
#定义类的属性
def __init__(self,password):
self.password = password
self.strength_level = 0
# 定义类的行为
def process_password(self):
# 规则1
if len(self.password) >= 8:
self.strength_level += 1
else:
print('密码位数至少为8位')
# 规则2
if self.check_number():
self.strength_level += 1
else:
print('密码应该包含数字')
# 规则3
if self.check_letter():
self.strength_level += 1
else:
print('密码应该包含字母')
#类的方法
def check_number(self): #检查是否有数字
has_number = False
for c in self.password:
if c.isnumeric():
has_number = True
break
return has_number
def check_letter(self): #检查是否有字母
has_letter = False
for c in self.password:
if c.isalpha():
has_letter = True
break
return has_letter
class fileTool:
'''
文件工具类
'''
#定义属性
def __init__(self,filepath): #传入文件路径
self.filepath = filepath #传入文件路径
#定义方法
#1写操作
def write_to_file(self,line): #按行来写
f = open(self.filepath,'a')
f.write(line)
f.close()
#读操作
def reade_from_file(self):
f = open(self.filepath,'r')
lines = f.readlines()
f.close()
return lines
def main():
try_number = 5 #限制密码尝试次数
filepath = 'password_6.0.txt'
# 实例化文件工具对象
file_tool = fileTool(filepath)
while try_number > 0:
pass_word = input('请输入密码:')
#实例化密码工具对象
password_tool = PasswordTool(pass_word) #完成初始化
password_tool.process_password() #调用类
# 写操作
line = '密码是{},密码强度是{}\n'.format(pass_word,password_tool.strength_level)
file_tool.write_to_file(line)
if password_tool.strength_level == 3:
print('密码合格')
break
else:
print('密码不合格')
try_number -= 1
if try_number <= 0 :
print('密码设置次数过多。')
#读操作
lines = file_tool.reade_from_file()
print(lines)
if __name__ == '__main__':
main()