【每天学点Python】案例六:判断密码

发布时间:2019-03-13 22:47:03编辑:auto阅读(2046)

    判断密码强弱

    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)
    • 多态
      • 在不同情况下用一个函数名启用不同方法
      • 灵活性

     

关键字