密码强度:是指一个密码对抗猜测或时暴力破解的有效程度;一般是指一个未授权的访问者得到正确密码的平均尝试次数
• 强密码可以降低安全漏洞的整体风险
• 简易版(常用)规则:
1. 密码长度至少8位
2. 密码含有数字
3. 密码含有字母
案例分析
• 设置一个变量strength_level用于记录密码的强度,初始为0。满足一个条件,对其加1
• 长度判断:使用len()方法
• 包含数字判断: 使用isnumeric()方法
• 包含字母判断:使用isalpha()方法
• 如果strength_level等于3,密码强度合格,否则不合格
Python字符串
• str. isnumeric()
检测字符串是否只由数字组成
• str. isalpha()
检测字符串是否只由字母组成
• str.islower()
检测字符串中所有的字母是否都为小写
• str.isupper()
检测字符串中所有的字母是否都为大写
• 更多isxxx()方法请参考:
https://docs.python.org/3/library/stdtypes.html#string-methods
'''
功能:判断密码强度
版本:1.0
'''
def check_number_exist(password_str):
'''
判断字符串中是否含有数字
'''
for c in password_str:
if c.isnumeric():
return True #有数字的话直接return True 就不往下运行了,遍历完没有数字的话才往下运行,遇到return即终止函数
return False
def check_letter_exist(password_str):
'''
判断字符串中是否含有字母
'''
for c in password_str:
if c.isalpha():
return True
return False
def main():
password = input("请输入密码")
#密码强度
strength_level = 0
#规则1:密码长度大于8
if len(password ) >= 8:
strength_level += 1
else:
print("密码长度要求至少8位")
#规则2:包含数字
if check_number_exist(password):
strength_level += 1
else :
print("密码要求包含数字")
#规则3:包含字母
if check_letter_exist(password):
strength_level += 1
else :
print("密码要求包含字母")
if strength_level == 3:
print("恭喜!密码强度合格!")
else:
print("密码强度不合格!!")
if __name__ == '__main__':
main()
增加功能:限制密码设置次数;循环的终止
循环的终止
• break语句
终止整个循环
• continue语句
只终止本次循环,而不终止整个循环的执行/ 继续下一次循环
'''
功能:判断密码强度
版本:2.0
'''
def check_number_exist(password_str):
'''
判断字符串中是否含有数字
'''
has_number = False
for c in password_str:
if c.isnumeric():
has_number = True
break
return has_number
def check_letter_exist(password_str):
'''
判断字符串中是否含有字母
'''
has_letter = False
for c in password_str:
if c.isalpha():
has_letter = True
break
return has_letter
def main():
#设置输入次数上限
try_time = 5
while try_time >0:
password = input("请输入密码")
#密码强度
strength_level = 0
#规则1:密码长度大于8
if len(password ) >= 8:
strength_level += 1
else:
print("密码长度要求至少8位")
#规则2:包含数字
if check_number_exist(password):
strength_level += 1
else :
print("密码要求包含数字")
#规则3:包含字母
if check_letter_exist(password):
strength_level += 1
else :
print("密码要求包含字母")
if strength_level == 3:
print("恭喜!密码强度合格!")
break
else:
print("密码强度不合格!!")
try_time -= 1
print("****************")
if try_time <=0:
print('尝试次数过多,请明天再试!')
if __name__ == '__main__':
main()
增加功能:保存设置的密码及其对应的强度到文件中
文件的基础
• 文件:存储在外部介质(如:硬盘)上的数据或信息的集合
• 文本文件:一般指只有字符编码存储的文件,能够被最简单的文本编辑
器直接读取
• 编码:信息从一种形式转换为另一种形式的过程
• 常用的编码:
• ASCII, Unicode, UTF-8…
• 多行文本,用 \n 表示换行
文件的操作
• 步骤:打开文件 -> 操作文件(读、写等)-> 关闭文件
• 1. 打开文件:建立文件与程序的关联
open(filename, mode)
filename:文件名(包括路径);mode: 打开模式
2. 操作文件:写入,读取,等
• 写入操作:从计算机内存向文件写入数据
• write(): 将文本数据写入文件中
• writelines(): 将字符串列表写入文件中
• 3. 关闭文件:终止程序与文件的关联
• close()
'''
功能:判断密码强度
版本:3.0
'''
def check_number_exist(password_str):
'''
判断字符串中是否含有数字
'''
has_number = False
for c in password_str:
if c.isnumeric():
has_number = True
break
return has_number
def check_letter_exist(password_str):
'''
判断字符串中是否含有字母
'''
has_letter = False
for c in password_str:
if c.isalpha():
has_letter = True
break
return has_letter
def main():
#设置输入次数上限
try_time = 5
while try_time >0:
password = input("请输入密码")
#密码强度
strength_level = 0
#规则1:密码长度大于8
if len(password ) >= 8:
strength_level += 1
else:
print("密码长度要求至少8位")
#规则2:包含数字
if check_number_exist(password):
strength_level += 1
else :
print("密码要求包含数字")
#规则3:包含字母
if check_letter_exist(password):
strength_level += 1
else :
print("密码要求包含字母")
# 写入文件 (路径,打开模式)
f = open('D:\Study\python practice\pwd_save\password3.0.txt', 'a')
f.write('密码:{},强度:{}\n'.format(password,strength_level))
f.close()
if strength_level == 3:
print("恭喜!密码强度合格!")
break
else:
print("密码强度不合格!!")
try_time -= 1
print("****************")
if try_time <=0:
print('尝试次数过多,请明天再试!')
if __name__ == '__main__':
main()
增加功能:读取保存的密码
文件的操作
• 读取操作:从文件中读取数据到计算机内存中
• read(): 返回值为包含整个文件内容的一个字符串
• readline(): 返回值为文件下一行内容的字符串
• readlines(): 返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串
'''
功能:判断密码强度
版本:4.0
'''
def check_number_exist(password_str):
'''
判断字符串中是否含有数字
'''
has_number = False
for c in password_str:
if c.isnumeric():
has_number = True
break
return has_number
def check_letter_exist(password_str):
'''
判断字符串中是否含有字母
'''
has_letter = False
for c in password_str:
if c.isalpha():
has_letter = True
break
return has_letter
def main():
# #设置输入次数上限
# try_time = 5
# while try_time >0:
# password = input("请输入密码")
#
# #密码强度
# strength_level = 0
#
# #规则1:密码长度大于8
# if len(password ) >= 8:
# strength_level += 1
# else:
# print("密码长度要求至少8位")
#
# #规则2:包含数字
# if check_number_exist(password):
# strength_level += 1
# else :
# print("密码要求包含数字")
#
# #规则3:包含字母
# if check_letter_exist(password):
# strength_level += 1
# else :
# print("密码要求包含字母")
#
# # 写入文件 (路径,打开模式)
# f = open('D:\Study\python practice\pwd_save\password3.0.txt', 'a')
# f.write('密码:{},强度:{}\n'.format(password,strength_level))
# f.close()
#
# if strength_level == 3:
# print("恭喜!密码强度合格!")
# break
# else:
# print("密码强度不合格!!")
# try_time -= 1
#
# print("****************")
#
# if try_time <=0:
# print('尝试次数过多,请明天再试!')
#读取文件
f = open('D:\Study\python practice\pwd_save\password3.0.txt','r')
# #1.read()
# content = f.read()
# print(content)
# #2.readline() 每次读一行
# line = f.readline()
# print(line)
# line = f.readline()
# print(line)
#3.readlines() 输出列表形式
lines = f.readlines()
print(lines)
for line in lines :
print('read:{}'.format(line))
f.close()
if __name__ == '__main__':
main()
增加功能:将相关方法(函数)封装成一个整体:面向对象编程 。定义一个password工具类
面向过程vs面向对象
• 面向过程(POP):以程序执行过程为设计流程的编程思想
• 面向对象(OOP):以事物为中心的编程思想
• 什么是对象(Object)?
• 现实世界中的对象:属性,行为
• 对象例子:
• 波斯猫,属性:品种、颜色、大小;行为:叫、捉老鼠
• 吉普车,属性:类型、用途;行为:发动、停车
类(class):某种类型集合的描述
• 属性:类本身的一些特性
• 方法:类所能实现的行为
• 类的定义
class ClassName
__init__(self)构造函数:初始化对象的各属性
self代表类的实例
'''
功能:判断密码强度
版本:5.0
'''
#
class PasswordTool:
"""
密码工具类
"""
def __init__(self, password):
# 类的属性
self.password = password
self.strength_level = 0
def process_password(self):
#规则1:密码长度大于8
if len(self.password) >= 8:
self.strength_level += 1
else:
print("密码长度要求至少8位")
#规则2:包含数字
if self.check_number_exist():
self.strength_level += 1
else :
print("密码要求包含数字")
#规则3:包含字母
if self.check_letter_exist():
self.strength_level += 1
else :
print("密码要求包含字母")
#类的方法
def check_number_exist(self):
'''
判断字符串中是否含有数字
'''
has_number = False
for c in self.password :
if c.isnumeric():
has_number = True
break
return has_number
def check_letter_exist(self):
'''
判断字符串中是否含有字母
'''
has_letter = False
for c in self.password:
if c.isalpha():
has_letter = True
break
return has_letter
def main():
#设置输入次数上限
try_time = 5
while try_time >0:
password = input("请输入密码")
#实例化密码工具对象,调用类
password_tool = PasswordTool(password)
password_tool.process_password()
# 写入文件 (路径,打开模式)
f = open('D:\Study\python practice\pwd_save\password3.0.txt', 'a')
f.write('密码:{},强度:{}\n'.format(password, password_tool.strength_level))
f.close()
if password_tool.strength_level == 3:
print("恭喜!密码强度合格!")
break
else:
print("密码强度不合格!!")
try_time -= 1
print("****************")
if try_time <=0:
print('尝试次数过多,请明天再试!')
if __name__ == '__main__':
main()
增加功能:将文件操作封装到一个类中
'''
功能:判断密码强度
版本:6.0
'''
#
class PasswordTool:
"""
密码工具类
"""
def __init__(self, password):
# 类的属性
self.password = password
self.strength_level = 0
def process_password(self):
#规则1:密码长度大于8
if len(self.password) >= 8:
self.strength_level += 1
else:
print("密码长度要求至少8位")
#规则2:包含数字
if self.check_number_exist():
self.strength_level += 1
else :
print("密码要求包含数字")
#规则3:包含字母
if self.check_letter_exist():
self.strength_level += 1
else :
print("密码要求包含字母")
#类的方法
def check_number_exist(self):
'''
判断字符串中是否含有数字
'''
has_number = False
for c in self.password :
if c.isnumeric():
has_number = True
break
return has_number
def check_letter_exist(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
def write_to_file(self,line):
f = open(self.filepath,'a')
f.write(line)
f.close()
def read_from_file(self):
f = open(self.filepath,'r')
lines = f.readlines()
f.close()
return lines
def main():
#设置输入次数上限
try_time = 5
# 实例化文件操作类
file_path = 'D:\Study\python practice\pwd_save\password3.0.txt'
file_tool = FileTool(file_path)
while try_time >0:
password = input("请输入密码")
#实例化密码工具对象,调用类
password_tool = PasswordTool(password)
password_tool.process_password()
#写操作
line = ('密码:{},强度:{}\n'.format(password, password_tool.strength_level))
file_tool.write_to_file(line)
if password_tool.strength_level == 3:
print("恭喜!密码强度合格!")
break
else:
print("密码强度不合格!!")
try_time -= 1
print("****************")
if try_time <=0:
print('尝试次数过多,请明天再试!')
#读操作
lines = file_tool.read_from_file()
print(lines)
if __name__ == '__main__':
main()
面向对象的特点
• 封装
将数据及相关操作打包在一起
支持代码复用
• 继承
子类(subclass)借用父类(superclass)的行为
避免重复操作,提升代码复用程度
定义 class ClassName(SuperClassName)
• 多态
在不同情况下用一个函数名启用不同方法
灵活性