判断密码强弱
V1.0
案例描述:
- 密码强度:是指一个密码对抗猜测或时暴力破解的有效程度;一般是指一个未授权的访问者得到正确密码的平均尝试次数
- 强密码可以降低安全漏洞的整体风险
- 简易版(常用)规则:
- 密码长度至少8位
- 密码含有数字
- 密码含有字母
案例分析:
- 设置一个变量strength_level用于记录密码的强度,初始为0。满足一个条件,对其加1
- 长度判断:使用len()方法
- 包含数字判断:使用snumeric()方法
- 包含字母判断:使用salpha()方法
- 如果strength_level等于3,密码强度合格,否则不合格
上机实验:
1 """ 2 作者:王鑫正 3 版本:1.0 4 日期:2018/9/26 5 功能:判断密码强弱 6 """ 7 8 9 def check_number_exist(password_str): 10 """ 11 判断字符串中是否含有数字 12 """ 13 for c in password_str: 14 if c.isnumeric(): 15 return True 16 return False 17 18 19 def check_letter_exist(password_str): 20 """ 21 判断字符串中是否含有字母 22 """ 23 for c in password_str: 24 if c.isalpha(): 25 return True 26 return False 27 28 29 def main(): 30 """ 31 主函数 32 """ 33 password = input('请输入密码:') 34 35 # 密码强度 36 strength_level = 0 37 38 # 规则1:密码长度大于8 39 if len(password) >= 8: 40 strength_level += 1 41 else: 42 print('密码长度要求至少8位') 43 44 # 规则2:密码长达包含数字 45 if check_number_exist(password): 46 strength_level += 1 47 else: 48 print('密码要求包含数字') 49 50 # 规则3:密码长达包含字母 51 if check_letter_exist(password): 52 strength_level += 1 53 else: 54 print('密码要求包含字母') 55 56 if strength_level == 3: 57 print('恭喜!密码强度合格') 58 else: 59 print('密码强度不合格') 60 61 62 if __name__ == '__main__': 63 main()
补充说明:
1. Python字符串
- str.isnumeric():检测字符串是否只由数字组成
- str.isalpha():检测字符串是否只由字母组成
- str.islower():检测字符串中所有的字母是否都为小写
- str.isupper():检测字符串中所有的字母是否都为大写
V2.0增加功能:限制密码设置次数;循环的终止
案例分析:
- 如果用户在规定次数内设置符合要求的密码,则终止循环
上机实验:
1 """ 2 作者:王鑫正 3 版本:2.0 4 日期:2018/9/26 5 功能:判断密码强弱 6 2.0增加功能:限制密码设置次数;循环的终止 7 """ 8 9 10 def check_number_exist(password_str): 11 """ 12 判断字符串中是否含有数字 13 """ 14 has_number = False 15 16 for c in password_str: 17 if c.isnumeric(): 18 has_number = True 19 break 20 21 return has_number 22 23 24 def check_letter_exist(password_str): 25 """ 26 判断字符串中是否含有字母 27 """ 28 has_letter = False 29 30 for c in password_str: 31 if c.isalpha(): 32 has_letter = True 33 break 34 35 return has_letter 36 37 38 def main(): 39 """ 40 主函数 41 """ 42 try_timer = 5 43 44 while try_timer > 0: 45 password = input('请输入密码:') 46 47 # 密码强度 48 strength_level = 0 49 50 # 规则1:密码长度大于8 51 if len(password) >= 8: 52 strength_level += 1 53 else: 54 print('密码长度要求至少8位') 55 56 # 规则2:密码长达包含数字 57 if check_number_exist(password): 58 strength_level += 1 59 else: 60 print('密码要求包含数字') 61 62 # 规则3:密码长达包含字母 63 if check_letter_exist(password): 64 strength_level += 1 65 else: 66 print('密码要求包含字母') 67 68 if strength_level == 3: 69 print('恭喜!密码强度合格') 70 break 71 else: 72 print('密码强度不合格') 73 try_timer -= 1 74 75 print() 76 77 if try_timer <= 0: 78 print('尝试次数过多,密码设置失败!') 79 80 81 if __name__ == '__main__': 82 main()
补充说明:
1. 循环的终止
- break语句:终止整个循环
- continue语句:只终止本次循环,而不终止整个循环的执行
V3.0增加功能: 保存设置的密码及其对用的强度到文件中
上机实验:
1 """ 2 作者:王鑫正 3 版本:3.0 4 日期:2018/9/26 5 功能:判断密码强弱 6 3.0增加功能: 保存设置的密码及其对用的强度到文件中 7 """ 8 9 10 def check_number_exist(password_str): 11 """ 12 判断字符串中是否含有数字 13 """ 14 has_number = False 15 16 for c in password_str: 17 if c.isnumeric(): 18 has_number = True 19 break 20 21 return has_number 22 23 24 def check_letter_exist(password_str): 25 """ 26 判断字符串中是否含有字母 27 """ 28 has_letter = False 29 30 for c in password_str: 31 if c.isalpha(): 32 has_letter = True 33 break 34 35 return has_letter 36 37 38 def main(): 39 """ 40 主函数 41 """ 42 try_timer = 5 43 44 while try_timer > 0: 45 password = input('请输入密码:') 46 47 # 密码强度 48 strength_level = 0 49 50 # 规则1:密码长度大于8 51 if len(password) >= 8: 52 strength_level += 1 53 else: 54 print('密码长度要求至少8位') 55 56 # 规则2:密码长达包含数字 57 if check_number_exist(password): 58 strength_level += 1 59 else: 60 print('密码要求包含数字') 61 62 # 规则3:密码长达包含字母 63 if check_letter_exist(password): 64 strength_level += 1 65 else: 66 print('密码要求包含字母') 67 68 f = open('password_3.0.txt', 'a') 69 f.write('密码:{},强度:{}\n'.format(password, strength_level)) 70 f.close() 71 72 if strength_level == 3: 73 print('恭喜!密码强度合格') 74 break 75 else: 76 print('密码强度不合格') 77 try_timer -= 1 78 79 print() 80 81 if try_timer <= 0: 82 print('尝试次数过多,密码设置失败!') 83 84 85 if __name__ == '__main__': 86 main()
补充说明:
1. 文件的基础
- 文件:存储在外部介质(如:硬盘)上的数据或信息的集合
- 文本文件:一般指只有字符编码存储的文件,能够被最简单的文本编辑器直接读取
- 编码:信息从一种形式转换为另一种形式的过程
- 常用的编码:ASCⅡ,Unicode,UTF-8
- 多行文本,用\n表示换行
2. 文件的操作
- 步骤:打开文件->操作文件(读、写等)->关闭文件
- 打开文件:建立文件与程序的关联
- open(filename,mode)
- filename:文件名(包括路径)
- mode:打开模式
- r:只读,文件不存在则报错
- w:只写,文件不存在则自动创建
- a:在文件末尾附加
- r+:读写
- 操作文件:写入、读取等
- 写入操作:从计算机内存向文件写入数据
- write():将文本数据写入文件中
- writelines():将字符串列表写入文件中
- 关闭文件:终止程序与文件的关联
- close()
V4.0增加功能:读取保存的密码
上机实验:
1 def main(): 2 """ 3 主函数 4 """ 5 6 # 读取文件 7 f = open('password_3.0.txt', 'r') 8 9 # 1. read() 10 content = f.read() 11 print(content) 12 13 # 2. readline() 14 line = f.readline() 15 print(line) 16 17 # 3. readlines() 18 for line in f: 19 print('read:{}'.format(line)) 20 21 for line in f.readlines(): 22 print('read:{}'.format(line)) 23 24 f.close() 25 26 27 if __name__ == '__main__': 28 main()
补充说明:
1. 文件的操作
- 读取操作:从文件中读取数据到计算机内存中
- read():返回值为包含整个文件内容的一个字符串
- readline():返回值为文件下一行内容的字符串
- readlines():返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串
2. 文件的遍历:
1 for line in f: 2 print('read:{}'.format(line)) 3 4 for line in f.readlines(): 5 print('read:{}'.format(line))
V5.0增加功能:将相关方法封装成一个整体:面向对象编程
上机实验:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/9/26 5 6 7 """ 8 作者:王鑫正 9 版本:5.0 10 日期:2018/9/26 11 功能:判断密码强弱 12 5.0增加功能:定义一个password工具类 13 """ 14 15 16 class PasswordTool: 17 """ 18 密码工具类 19 """ 20 def __init__(self, password): 21 # 类的属性 22 self.password = password 23 self.strength_level = 0 24 25 # 类的方法 26 def process_password(self): 27 # 规则1:密码长度大于8 28 if len(self.password) >= 8: 29 self.strength_level += 1 30 else: 31 print('密码长度要求至少8位') 32 33 # 规则2:密码长达包含数字 34 if self.check_number_exist(): 35 self.strength_level += 1 36 else: 37 print('密码要求包含数字') 38 39 # 规则3:密码长达包含字母 40 if self.check_letter_exist(): 41 self.strength_level += 1 42 else: 43 print('密码要求包含字母') 44 45 def check_number_exist(self): 46 """ 47 判断字符串中是否含有数字 48 """ 49 has_number = False 50 51 for c in self.password: 52 if c.isnumeric(): 53 has_number = True 54 break 55 56 return has_number 57 58 def check_letter_exist(self): 59 """ 60 判断字符串中是否含有字母 61 """ 62 has_letter = False 63 64 for c in self.password: 65 if c.isalpha(): 66 has_letter = True 67 break 68 69 return has_letter 70 71 72 def main(): 73 """ 74 主函数 75 """ 76 try_timer = 5 77 78 while try_timer > 0: 79 password = input('请输入密码:') 80 81 # 实例化密码工具对象 82 password_tool = PasswordTool(password) 83 password_tool.process_password() 84 85 f = open('password_5.0.txt', 'a') 86 f.write('密码:{},强度:{}\n'.format(password, password_tool.strength_level)) 87 f.close() 88 89 if password_tool.strength_level == 3: 90 print('恭喜!密码强度合格') 91 break 92 else: 93 print('密码强度不合格') 94 try_timer -= 1 95 96 print() 97 98 if try_timer <= 0: 99 print('尝试次数过多,密码设置失败!') 100 101 102 if __name__ == '__main__': 103 main()
补充说明:
1. 面向过程 vs 面向对象
- 面向过程(POP):以程序执行过程为设计流程的编程思想
- 面向对象(OOP):以事物为中心的编程思想
- 什么是对象(Object)?
- 现实世界中的对象:属性,行为
- 对象例子:
- 波斯猫,属性:品种、颜色、大小;行为:叫、捉老鼠
- 吉普车,属性:类型、用途;行为:发动、停车
- 类(class):某种类型集合的描述
- 属性:类本身的一些特性
- 方法:类所能实现的行为
- 类的定义:
- class ClassName
- __init__(self) 构造函数:初始化对象的各属性
- self代表类的实例
V6.0增加功能:将文件操作封装到一个类中
上机实验:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/9/26 5 6 7 """ 8 作者:王鑫正 9 版本:6.0 10 日期:2018/9/26 11 功能:判断密码强弱 12 6.0增加功能:将文件操作封装到一个类中 13 """ 14 15 16 class FileTools: 17 """ 18 文件工具类 19 """ 20 def __init__(self,filepath): 21 self.filepath = filepath 22 23 def write_to_file(self, line): 24 f = open(self.filepath, 'a') 25 f.write(line) 26 f.close() 27 28 def read_form_file(self): 29 f = open(self.filepath, 'r') 30 lines = f.readlines() 31 f.close() 32 return lines 33 34 35 class PasswordTool: 36 """ 37 密码工具类 38 """ 39 def __init__(self, password): 40 # 类的属性 41 self.password = password 42 self.strength_level = 0 43 44 # 类的方法 45 def process_password(self): 46 # 规则1:密码长度大于8 47 if len(self.password) >= 8: 48 self.strength_level += 1 49 else: 50 print('密码长度要求至少8位') 51 52 # 规则2:密码长达包含数字 53 if self.check_number_exist(): 54 self.strength_level += 1 55 else: 56 print('密码要求包含数字') 57 58 # 规则3:密码长达包含字母 59 if self.check_letter_exist(): 60 self.strength_level += 1 61 else: 62 print('密码要求包含字母') 63 64 def check_number_exist(self): 65 """ 66 判断字符串中是否含有数字 67 """ 68 has_number = False 69 70 for c in self.password: 71 if c.isnumeric(): 72 has_number = True 73 break 74 75 return has_number 76 77 def check_letter_exist(self): 78 """ 79 判断字符串中是否含有字母 80 """ 81 has_letter = False 82 83 for c in self.password: 84 if c.isalpha(): 85 has_letter = True 86 break 87 88 return has_letter 89 90 91 def main(): 92 """ 93 主函数 94 """ 95 try_timer = 5 96 file_path = 'password_6.0.txt' 97 # 实例化文件工具对象 98 file_tool = FileTools(file_path) 99 100 while try_timer > 0: 101 password = input('请输入密码:') 102 103 # 实例化密码工具对象 104 password_tool = PasswordTool(password) 105 password_tool.process_password() 106 107 line = '密码:{},强度:{}\n'.format(password, password_tool.strength_level) 108 # 写文件 109 file_tool.write_to_file(line) 110 111 if password_tool.strength_level == 3: 112 print('恭喜!密码强度合格') 113 break 114 else: 115 print('密码强度不合格') 116 try_timer -= 1 117 118 print() 119 120 if try_timer <= 0: 121 print('尝试次数过多,密码设置失败!') 122 123 # 读操作 124 lines = file_tool.read_form_file() 125 print(lines) 126 127 128 if __name__ == '__main__': 129 main()
补充说明:
1. 面向对象的特点
- 封装
- 将数据及相关操作打包在一起
- 支持代码复用
- 继承
- 子类(subclass)借用父类(superclass)的行为
- 避免重复操作,提升代码复用程度
- 定义 class ClassName(SuperClassName)
- 多态
- 在不同情况下用一个函数名启用不同方法
- 灵活性