Python小程序(6)--判断密码强弱

密码强度:是指一个密码对抗猜测或时暴力破解的有效程度;一般是指一个未授权的访问者得到正确密码的平均尝试次数
• 强密码可以降低安全漏洞的整体风险
• 简易版(常用)规则:
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版本

'''
功能:判断密码强度
版本: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()

2.0版本

增加功能:限制密码设置次数;循环的终止

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

Python小程序(6)--判断密码强弱_第1张图片

 

'''
功能:判断密码强度
版本: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()

3.0版本

增加功能:保存设置的密码及其对应的强度到文件中

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

 

文件的操作
• 步骤:打开文件 -> 操作文件(读、写等)-> 关闭文件
• 1. 打开文件:建立文件与程序的关联
open(filename, mode)
filename:文件名(包括路径);mode: 打开模式

Python小程序(6)--判断密码强弱_第2张图片

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

 4.0版本

增加功能:读取保存的密码

文件的操作
• 读取操作:从文件中读取数据到计算机内存中
• read(): 返回值为包含整个文件内容的一个字符串
• readline(): 返回值为文件下一行内容的字符串
• readlines(): 返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串

Python小程序(6)--判断密码强弱_第3张图片

 

'''
功能:判断密码强度
版本: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()

5.0版本

增加功能:将相关方法(函数)封装成一个整体:面向对象编程 。定义一个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版本

增加功能:将文件操作封装到一个类中

'''
功能:判断密码强度
版本: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)
• 多态
在不同情况下用一个函数名启用不同方法
灵活性

你可能感兴趣的:(Python学习教程)