案例6——判断密码强弱

案例描述

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

案例分析

  • 设置一个变量strength_level用于记录密码的强度,初始为0。满足一个条件,对其加1
  • 长度判断:使用len()方法
  • 包含数字判断: 使用isnumeric()方法
  • 包含字母判断:使用isalpha()方法
  • 如果strength_level等于3,密码强度合格,否则不合格

项目实现

  • str. isnumeric()
    检测字符串是否只由数字组成
  • str. isalpha()
    检测字符串是否只由字母组成
  • str.islower()
    检测字符串中所有的字母是否都为小写
  • str.isupper()
    检测字符串中所有的字母是否都为大写
  • 更多isxxx()方法请参考:
    https://docs.python.org/3/library/stdtypes.html#string-methods

V1.0——判断密码强弱

由于isnumeric()判断字符串是否只由数字组成,isalpha()判断字符串是否只由字母组成。考虑使用循环判断每个字符是否为字母或者数字,如果满足则强度加1。
代码实现:

def check_number_exist(password_str):
    """
        功能:判断密码中是否包含数字
    """
    for x in password_str:
        if x.isnumeric():
            return True
    return False


def check_letter_exist(password_str):
    """
        功能:判断密码中是否包含字母
    """
    for x in password_str:
        if x.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()

V2.0——跳出循环(break),设置循环输入密码次数

  • break语句
    终止整个循环
  • continue语句
    只终止本次循环,而不终止整个循环的执行

代码实现:

def check_number_exist(password_str):
    """
        功能:判断密码中是否包含数字
    """
    is_number_exist = False

    for x in password_str:
        if x.isnumeric():
            is_number_exist = True
            break

    return is_number_exist


def check_letter_exist(password_str):
    """
        功能:判断密码中是否包含字母
    """
    is_letter_exist = False

    for x in password_str:
        if x.isalpha():
            is_letter_exist = True
            break

    return is_letter_exist


def main():
    """
        主函数
    """
    try_times = 5
    while try_times > 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_times -= 1
            print()

    if try_times <= 0:
        print('***********************************************')
        print('尝试次数过多,密码设置失败!')


if __name__ == '__main__':
    main()

V3.0——保存设置的密码及其对应的强度到文件中

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

文件的操作
打开文件 -> 操作文件(读、写等)-> 关闭文件

  1. 打开文件:建立文件与程序的关联
    open(filename, mode)
    filename:文件名(包括路径);mode: 打开模式
打开模式 含义
r 只读,文件不存在则报错
w 只写,文件不存在则自动创建
a 在文件末尾附加
r+ 读写
  1. 操作文件:写入,读取,等
    •写入操作:从计算机内存向文件写入数据
    •write(): 将文本数据写入文件中
    •writelines(): 将字符串列表写入文件中
  2. 关闭文件:终止程序与文件的关联
    •close()

密码强度三条规则判断完成后,添加如下代码来实现将密码及强度保存至文件中
代码实现:

# 根据密码强度级别设置强弱,以用户可知的样式显示密码强弱
level = '弱'
if strength_level == 2:
    level = '中'
elif strength_level == 3:
    level = '强'
# 将密码以及密码强度写入文件
f = open('password_3.0.txt', 'a')
f.write('密码:{},强度:{}\n'.format(password, level))
f.close()

V4.0——读取文件中的密码

读取操作:从文件中读取数据到计算机内存中

  • read(): 返回值为包含整个文件内容的一个字符串
  • readline(): 返回值为文件下一行内容的字符串
  • readlines(): 返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串

文件的遍历:

f = open('password_3.0.txt', 'r')
for line in f.readlines():
    print(line)
f.close()

或者

f = open('password_3.0.txt', 'r')
for line in f:
    print(line)
f.close()

V5.0——定义一个password相关工具类

  • 类(class):某种类型集合的描述
  • 属性:类本身的一些特性
  • 方法:类所能实现的行为
  • 类的定义
    class ClassName
    _init_(self)构造函数:初始化对象的各属性
    self代表类的实例

将password的相关属性以及函数封装到password工具类(PasswordTool)中
代码实现:

"""
    作者:
    功能:判断密码强弱
    版本:v4.0
    日期:07/01/2019
    2.0新增功能:循环的终止;设置循环次数
    3.0新增功能:保存设置的密码及其对应的强度到文件中
    4.0新增功能:读取文件中的密码
    5.0新增功能:定义一个password工具类
"""


class PasswordTool:
    """
        密码工具类
    """
    def __init__(self, password):
        # 类的属性
        self.password = password
        self.strength_level = 0
        self.level = '弱'

    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('密码中必须包含字母!')

        self.get_level_description()

    # 类的方法
    def check_number_exist(self):
        """
            功能:判断密码中是否包含数字
        """
        is_number_exist = False

        for x in self.password:
            if x.isnumeric():
                is_number_exist = True
                break

        return is_number_exist

    def check_letter_exist(self):
        """
            功能:判断密码中是否包含字母
        """
        is_letter_exist = False

        for x in self.password:
            if x.isalpha():
                is_letter_exist = True
                break

        return is_letter_exist

    def get_level_description(self):
        """
            根据密码强度级别设置强弱,以用户可知的样式显示密码强弱
        """
        if self.strength_level == 2:
            self.level = '中'
        elif self.strength_level == 3:
            self.level = '强'


def main():
    """
        主函数
    """
    try_times = 5
    f = open('password_5.0.txt', 'w')
    while try_times > 0:
        password = input('请输入密码:')

        # 实例化密码工具对象
        password_tool = PasswordTool(password)
        password_tool.process_password()

        # 将密码以及密码强度写入文件
        f.write('密码:{},强度:{}\n'.format(password, password_tool.level))

        if password_tool.strength_level == 3:
            print('密码强度合格!')
            break
        else:
            print('密码强度不符合要求!')
            try_times -= 1
            print()

    f.close()

    if try_times <= 0:
        print('***********************************************')
        print('尝试次数过多,密码设置失败!')


if __name__ == '__main__':
    main()

V6.0——定义一个文件工具类

将操作文件的方法封装到文件工具类(FileTool)中
封装和调用代码实现:

class FileTool:
    def __init__(self, file_path):
        self.file_path = file_path

    def write_to_file(self, line):
        f = open(self.file_path, 'a')
        f.write(line)
        f.close()

    def read_from_file(self):
        f = open(self.file_path, 'r')
        lines = f.readlines()
        f.close()
        return lines


def main():
    """
        主函数
    """
    try_times = 5
    file_path = 'password_6.0.txt'

    # 实例化文件工具类
    file_tool = FileTool(file_path)

    while try_times > 0:
        password = input('请输入密码:')

        # 实例化密码工具对象
        password_tool = PasswordTool(password)
        password_tool.process_password()

        line = '密码:{},强度:{}\n'.format(password, password_tool.level)
        file_tool.write_to_file(line)

        if password_tool.strength_level == 3:
            print('密码强度合格!')
            break
        else:
            print('密码强度不符合要求!')
            try_times -= 1
            print()

    if try_times <= 0:
        print('***********************************************')
        print('尝试次数过多,密码设置失败!')

    lines = file_tool.read_from_file()
    for line in lines:
        print(line)

面向对象的特点

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

你可能感兴趣的:(Python学习积累)