判断密码强弱

V1.0

案例描述:

  • 密码强度:是指一个密码对抗猜测或时暴力破解的有效程度;一般是指一个未授权的访问者得到正确密码的平均尝试次数
  • 强密码可以降低安全漏洞的整体风险
  • 简易版(常用)规则:
    1. 密码长度至少8位
    2. 密码含有数字
    3. 密码含有字母

案例分析:

  • 设置一个变量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()
View Code

补充说明:

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()
View Code

补充说明:

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()
View Code

补充说明:

1. 文件的基础

  • 文件:存储在外部介质(如:硬盘)上的数据或信息的集合
  • 文本文件:一般指只有字符编码存储的文件,能够被最简单的文本编辑器直接读取
  • 编码:信息从一种形式转换为另一种形式的过程
  • 常用的编码:ASCⅡ,Unicode,UTF-8
  • 多行文本,用n表示换行

2. 文件的操作

  • 步骤:打开文件->操作文件(读、写等)->关闭文件
  • 打开文件:建立文件与程序的关联
    • open(filename,mode)
    • filename:文件名(包括路径)
    • mode:打开模式
      1. r:只读,文件不存在则报错
      2. w:只写,文件不存在则自动创建
      3. a:在文件末尾附加
      4. 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()
View Code

补充说明:

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()
View Code

补充说明:

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()
View Code

补充说明:

1. 面向对象的特点

  • 封装
    • 将数据及相关操作打包在一起
    • 支持代码复用
  • 继承
    • 子类(subclass)借用父类(superclass)的行为
    • 避免重复操作,提升代码复用程度
    • 定义 class ClassName(SuperClassName)
  • 多态
    • 在不同情况下用一个函数名启用不同方法
    • 灵活性

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!