案例(6):判斷密碼強(qiáng)弱

本章通過判斷密碼強(qiáng)弱的6個(gè)案例來進(jìn)行學(xué)習(xí)基礎(chǔ)的Python程序

案例描述

密碼強(qiáng)度:是指一個(gè)密碼對(duì)抗猜測(cè)或時(shí)暴力破解的有效程度;一般是
1.指一個(gè)未授權(quán)的訪問者得到正確密碼的平均嘗試次數(shù)
2.強(qiáng)密碼可以降低安全漏洞的整體風(fēng)險(xiǎn)
3.簡(jiǎn)易版(常用)規(guī)則:(1)密碼長(zhǎng)度至少8位;(2)密碼含有數(shù)字;(3)密碼含有字母

案例分析

根據(jù)以下函數(shù)判斷密碼強(qiáng)度并輸出:
1.設(shè)置一個(gè)變量strength_level用于記錄密碼的強(qiáng)度,初始為0。滿足一個(gè)條件,對(duì)其加1;
2.長(zhǎng)度判斷:使用len()方法;
3.包含數(shù)字判斷:對(duì)密碼字符串遍歷,使用isnumeric()方法;
4.包含字母判斷:對(duì)密碼字符串遍歷,使用isalpha()方法;
5.如果strength_level等于3,密碼強(qiáng)度合格,否則不合格

v1.0

新建一個(gè)簡(jiǎn)單的Python程序,將判斷是否有數(shù)字和字幕的語(yǔ)句分別封裝成2個(gè)函數(shù),調(diào)用函數(shù)時(shí)傳遞密碼,返回結(jié)果,若有則返回True,否則False。
主函數(shù)則實(shí)現(xiàn)用戶輸入密碼,初始化密碼強(qiáng)度,依次判斷長(zhǎng)度、字母、數(shù)字,最后根據(jù)密碼強(qiáng)度stength_level判斷密碼是否合格并輸出結(jié)果。

知識(shí)點(diǎn):

1.Python字符串
(1)str.isnumeric():檢測(cè)字符串是否只由數(shù)字組成
(2)str.isalpha():檢測(cè)字符串是否只由字母組成
(3)str.islower():檢測(cè)字符串中所有的字母是否都為小寫
(4)str.isupper():檢測(cè)字符串中所有的字母是否都為大寫


PS:更多isxxx()方法請(qǐng)參考:https://docs.python.org/3/library/stdtypes.html#string-methods

判斷函數(shù):

def check_num_exist(passwd_input):
    """
        檢查字符串是否有數(shù)字,有就返回true
    """
    for c in passwd_input:
        if c.isnumeric():
            return True
    return False

def check_letter_exist(passwd_input):
    """
        檢查字符串是否有字母,有就返回true
    """
    for c in passwd_input:
        if c.isalpha():
            return True
    return False

主體代碼:

def main():
    """
        主函數(shù)
    """
    # 輸入密碼
    passwd_input = input("請(qǐng)輸入密碼:")
    # 密碼強(qiáng)度
    stength_level = 0
    # 判斷密碼長(zhǎng)度
    if len(passwd_input) > 8:
        stength_level += 1
    else:
        print("輸入的密碼不夠長(zhǎng)!")
    # 判斷密碼是否有數(shù)字,然后操作
    if check_num_exist(passwd_input):
        stength_level += 1
    else:
        print("輸入的密碼沒有數(shù)字!")
    # 判斷密碼是否有字母,然后操作
    if check_letter_exist(passwd_input):
        stength_level += 1
    else:
        print("輸入的密碼沒有字母!")
    # 輸出結(jié)果——密碼強(qiáng)度
    if stength_level >= 3:
        print("恭喜!輸入的密碼合格!")
    else:
        print("輸入的密碼不合格!")

結(jié)果如圖所示:

合格圖

不合格

v2.0

在v1.0的基礎(chǔ)上,2.0增加功能:限制密碼設(shè)置次數(shù);循環(huán)的終止。當(dāng)用戶在規(guī)定次數(shù)內(nèi)設(shè)置符合要求的密碼,則使用continue語(yǔ)句或者break語(yǔ)句終止循環(huán)。循環(huán)使用while,通過判斷 try_times是否達(dá)到5次來判斷是否繼續(xù),若超過次數(shù)則提示次數(shù)過多。若密碼合格也中斷循環(huán),符合日常使用,中斷使用break。

知識(shí)點(diǎn):

1.循環(huán)的終止:
(1)break語(yǔ)句:終止整個(gè)循環(huán)
(2)continue語(yǔ)句:只終止本次循環(huán),而不終止整個(gè)循環(huán)的執(zhí)行

循環(huán)終止操作示例:


判斷函數(shù):

def check_num_exist(passwd_input):
    """
        檢查字符串是否有數(shù)字,有就返回true
    """
    has_number = False
    for c in passwd_input:
        if c.isnumeric():
            has_number = True
    return has_number

def check_letter_exist(passwd_input):
    """
        檢查字符串是否有字母,有就返回true
    """
    has_letter = False
    for c in passwd_input:
        if c.isalpha():
            has_letter = True
    return has_letter

具體代碼:

def main():
    """
        主函數(shù)
    """
    # 密碼循環(huán)設(shè)置次數(shù)
    try_times = 5
    while try_times > 0:
        # 輸入密碼
        passwd_input = input("請(qǐng)輸入密碼:")
        # 密碼強(qiáng)度
        stength_level = 0
        # 判斷密碼長(zhǎng)度
        if len(passwd_input) > 8:
            stength_level += 1
        else:
            print("輸入的密碼要求長(zhǎng)度過8位!")
        # 判斷密碼是否有數(shù)字,然后操作
        if check_num_exist(passwd_input):
            stength_level += 1
        else:
            print("輸入的密碼要求包含數(shù)字!")
        # 判斷密碼是否有字母,然后操作
        if check_letter_exist(passwd_input):
            stength_level += 1
        else:
            print("輸入的密碼要求包含字母!")
        # 輸出結(jié)果——密碼強(qiáng)度
        if stength_level >= 3:
            print("恭喜!輸入的密碼合格!")
            break
        else:
            print("輸入的密碼不合格!請(qǐng)重新輸入!")
            try_times -= 1
            print()

    if try_times <= 0:
        print("嘗試次數(shù)過多,終止密碼設(shè)置!")

運(yùn)行結(jié)果:

v3.0

在2.0的基礎(chǔ)上,3.0增加功能:保存設(shè)置的密碼及其對(duì)應(yīng)的強(qiáng)度到文件中。文件操作需要先用open()打開,然后寫入模式使用“a”避免覆蓋。每次寫入完成后都用戶close()關(guān)閉。其他細(xì)節(jié)與上一案例一致。

知識(shí)點(diǎn):

1.文件的基礎(chǔ)
(1)文件:存儲(chǔ)在外部介質(zhì)(如:硬盤)上的數(shù)據(jù)或信息的集合
(2)文本文件:一般指只有字符編碼存儲(chǔ)的文件,能夠被最簡(jiǎn)單的文本編輯器直接讀取
(3)編碼:信息從一種形式轉(zhuǎn)換為另一種形式的過程;常用的編碼:ASCII, Unicode, UTF-8…
(4)多行文本,用 \n 表示換行
2.文件的操作
(1)步驟:打開文件 -> 操作文件(讀、寫等)-> 關(guān)閉文件
(2)

  1. 打開文件:建立文件與程序的關(guān)聯(lián):
    ? open(filename, mode);filename:文件名(包括路徑);mode: 打開模式
  2. 操作文件:寫入,讀取,等
    ? 寫入操作:從計(jì)算機(jī)內(nèi)存向文件寫入數(shù)據(jù)
    ? write(): 將文本數(shù)據(jù)寫入文件中
    ? writelines(): 將字符串列表寫入文件中
  3. 關(guān)閉文件:終止程序與文件的關(guān)聯(lián)
    ? close()

PS:文件使用完畢后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限的。
具體文件操作參考鏈接:https://www.cnblogs.com/xinchrome/p/5011304.html


例子主要代碼如下:

def check_num_exist(passwd_input):
    """
        檢查字符串是否有數(shù)字,有就返回true
    """
    has_number = False
    for c in passwd_input:
        if c.isnumeric():
            has_number = True
    return has_number

def check_letter_exist(passwd_input):
    """
        檢查字符串是否有字母,有就返回true
    """
    has_letter = False
    for c in passwd_input:
        if c.isalpha():
            has_letter = True
    return has_letter

def main():
    """
        主函數(shù)
    """
    # 密碼循環(huán)設(shè)置次數(shù)
    try_times = 5
    while try_times > 0:
        # 輸入密碼
        passwd_input = input("請(qǐng)輸入密碼:")
        # 密碼強(qiáng)度
        stength_level = 0

        # 判斷密碼長(zhǎng)度
        if len(passwd_input) > 8:
            stength_level += 1
        else:
            print("輸入的密碼要求長(zhǎng)度過8位!")
        # 判斷密碼是否有數(shù)字,然后操作
        if check_num_exist(passwd_input):
            stength_level += 1
        else:
            print("輸入的密碼要求包含數(shù)字!")
        # 判斷密碼是否有字母,然后操作
        if check_letter_exist(passwd_input):
            stength_level += 1
        else:
            print("輸入的密碼要求包含字母!")

        f = open("password_v3.0.txt", "a")
        f.write("密碼:{},強(qiáng)度:{}\n".format(passwd_input, stength_level))
        f.close()

        # 輸出結(jié)果——密碼強(qiáng)度
        if stength_level >= 3:
            print("恭喜!輸入的密碼合格!")
            break
        else:
            print("輸入的密碼不合格!請(qǐng)重新輸入!")
            try_times -= 1
            print()

    if try_times <= 0:
        print("嘗試次數(shù)過多,終止密碼設(shè)置!")

代碼部分運(yùn)行結(jié)果:


圖1

圖2

v4.0

在v3.0的基礎(chǔ)上,4.0增加功能:讀取保存的密碼。文件讀取操作分3種:read()、readline()、readlines(),具體作用如下所示。

知識(shí)點(diǎn):

1.文件的操作
(1)讀取操作:從文件中讀取數(shù)據(jù)到計(jì)算機(jī)內(nèi)存中
(2)read(): 返回值為包含整個(gè)文件內(nèi)容的一個(gè)字符串
(3)readline(): 返回值為文件下一行內(nèi)容的字符串
(4)readlines(): 返回值為整個(gè)文件內(nèi)容的列表,每項(xiàng)是以換行符為結(jié)尾的一行字符串
(5)文件的遍歷


主要代碼:

# 密碼循環(huán)設(shè)置次數(shù)
    try_times = 5
    while try_times > 0:
        # 輸入密碼
        passwd_input = input("請(qǐng)輸入密碼:")
        # 密碼強(qiáng)度
        stength_level = 0

        # 判斷密碼長(zhǎng)度
        if len(passwd_input) > 8:
            stength_level += 1
        else:
            print("輸入的密碼要求長(zhǎng)度過8位!")
        # 判斷密碼是否有數(shù)字,然后操作
        if check_num_exist(passwd_input):
            stength_level += 1
        else:
            print("輸入的密碼要求包含數(shù)字!")
        # 判斷密碼是否有字母,然后操作
        if check_letter_exist(passwd_input):
            stength_level += 1
        else:
            print("輸入的密碼要求包含字母!")

        f = open("password_v4.0.txt", "a")
        f.write("密碼:{},強(qiáng)度:{}\n".format(passwd_input, stength_level))
        f.close()

        # 輸出結(jié)果——密碼強(qiáng)度
        if stength_level >= 3:
            print("恭喜!輸入的密碼合格!")
            break
        else:
            print("輸入的密碼不合格!請(qǐng)重新輸入!")
            try_times -= 1
            print()

    if try_times <= 0:
        print("嘗試次數(shù)過多,終止密碼設(shè)置!")

    f = open("password_v3.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 l in lines:
        print(l)

    f.close()

執(zhí)行結(jié)果:


v5.0

在v4.0的基礎(chǔ)上,5.0增加功能:將相關(guān)方法封裝成一個(gè)整體:面向?qū)ο缶幊?。因?yàn)镻ython是面向?qū)ο笳Z(yǔ)言,所以可以將密碼操作封裝成一個(gè)工具類,方法包含判斷是否有數(shù)字、字母和輸出密碼強(qiáng)度。主函數(shù)可以直接創(chuàng)建一個(gè)密碼類的對(duì)象,然后進(jìn)行相應(yīng)的處理。

知識(shí)點(diǎn):

1.面向過程vs面向?qū)ο?br> (1)面向過程(POP):以程序執(zhí)行過程為設(shè)計(jì)流程的編程思想
(2)面向?qū)ο?OOP):以事物為中心的編程思想
(3)現(xiàn)實(shí)世界中的對(duì)象:屬性,行為
? 對(duì)象例子:
? 波斯貓,屬性:品種、顏色、大?。恍袨椋航?、捉老鼠
? 吉普車,屬性:類型、用途;行為:發(fā)動(dòng)、停車
2.類(class):某種類型集合的描述
(1)屬性:類本身的一些特性
(2)方法:類所能實(shí)現(xiàn)的行為
(3)類的定義:
class ClassName
init(self)構(gòu)造函數(shù):初始化對(duì)象的各屬性,可以傳參數(shù)進(jìn)來
self代表類的實(shí)例:屬性和方法的調(diào)用

類的創(chuàng)建示例:


PS:總結(jié):http://www.runoob.com/python/python-object.html

密碼類代碼:

class Password_tool:
    def __init__(self, password):
        self.password = password
        self.stength_level = 0

    def check_num_exist(self):
        """
            檢查字符串是否有數(shù)字,有就返回true
        """
        has_number = False
        for c in self.password:
            if c.isnumeric():
                has_number = True
        return has_number

    def check_letter_exist(self):
        """
            檢查字符串是否有字母,有就返回true
        """
        has_letter = False
        for c in self.password:
            if c.isalpha():
                has_letter = True
        return has_letter

    def passwd_process(self):
        # 判斷密碼長(zhǎng)度
        if len(self.password) > 8:
            self.stength_level += 1
        else:
            print("輸入的密碼要求長(zhǎng)度過8位!")
        # 判斷密碼是否有數(shù)字,然后操作
        if self.check_num_exist():
            self.stength_level += 1
        else:
            print("輸入的密碼要求包含數(shù)字!")
        # 判斷密碼是否有字母,然后操作
        if self.check_letter_exist():
            self.stength_level += 1
        else:
            print("輸入的密碼要求包含字母!")

主函數(shù)代碼

# 密碼循環(huán)設(shè)置次數(shù)
    try_times = 5
    while try_times > 0:
        # 輸入密碼
        passwd_input = input("請(qǐng)輸入密碼:")

        # 實(shí)例化密碼工具對(duì)象
        password_tool = Password_tool(passwd_input)
        password_tool.passwd_process()

        f = open("password_v5.0.txt", "a")
        f.write("密碼:{},強(qiáng)度:{}\n".format(passwd_input, password_tool.stength_level))
        f.close()

        # 輸出結(jié)果——密碼強(qiáng)度
        if password_tool.stength_level >= 3:
            print("恭喜!輸入的密碼合格!")
            break
        else:
            print("輸入的密碼不合格!請(qǐng)重新輸入!")
            try_times -= 1
            print()

    if try_times <= 0:
        print("嘗試次數(shù)過多,終止密碼設(shè)置!")

    f = open("password_v5.0.txt", "r")
    # 3.readlines()
    lines = f.readlines()
    print(lines)
    for l in lines:
        print(l)
    f.close()

執(zhí)行結(jié)果:


v6.0

在v5.0的基礎(chǔ)上,6.0增加功能:將文件操作封裝到一個(gè)類中。這里和密碼類一樣,新建一個(gè)文件操作的類,把讀和寫操作,參數(shù)是文件路徑。

知識(shí)點(diǎn):

1.面向?qū)ο蟮奶攸c(diǎn)
(1)封裝
? 將數(shù)據(jù)及相關(guān)操作打包在一起
? 支持代碼復(fù)用
(2)繼承
? 子類(subclass)借用父類(superclass)的行為
? 避免重復(fù)操作,提升代碼復(fù)用程度
? 定義 class ClassName(SuperClassName)
(3)多態(tài)
? 在不同情況下用一個(gè)函數(shù)名啟用不同方法
? 靈活性

具體示例參考:https://blog.csdn.net/qq_29287973/article/details/77868474
密碼類代碼:

class Password_tool:
    def __init__(self, password):
        self.password = password
        self.stength_level = 0

    def check_num_exist(self):
        """
            檢查字符串是否有數(shù)字,有就返回true
        """
        has_number = False
        for c in self.password:
            if c.isnumeric():
                has_number = True
        return has_number

    def check_letter_exist(self):
        """
            檢查字符串是否有字母,有就返回true
        """
        has_letter = False
        for c in self.password:
            if c.isalpha():
                has_letter = True
        return has_letter

    def passwd_process(self):
        # 判斷密碼長(zhǎng)度
        if len(self.password) > 8:
            self.stength_level += 1
        else:
            print("輸入的密碼要求長(zhǎng)度過8位!")
        # 判斷密碼是否有數(shù)字,然后操作
        if self.check_num_exist():
            self.stength_level += 1
        else:
            print("輸入的密碼要求包含數(shù)字!")
        # 判斷密碼是否有字母,然后操作
        if self.check_letter_exist():
            self.stength_level += 1
        else:
            print("輸入的密碼要求包含字母!")

文件操作類

class File_tool:
    """
        文件操作類
    """

    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

主要代碼

# 密碼循環(huán)設(shè)置次數(shù)
    try_times = 5
    filepath = "password_v6.0.txt"
    file_tool = File_tool(filepath)
    while try_times > 0:
        # 輸入密碼
        passwd_input = input("請(qǐng)輸入密碼:")

        # 實(shí)例化密碼工具對(duì)象
        password_tool = Password_tool(passwd_input)
        password_tool.passwd_process()

        line = "密碼:{},強(qiáng)度:{}\n".format(passwd_input, password_tool.stength_level)
        file_tool.write_to_file(line)

        # 輸出結(jié)果——密碼強(qiáng)度
        if password_tool.stength_level >= 3:
            print("恭喜!輸入的密碼合格!")
            break
        else:
            print("輸入的密碼不合格!請(qǐng)重新輸入!")
            try_times -= 1
            print()

    if try_times <= 0:
        print("嘗試次數(shù)過多,終止密碼設(shè)置!")

    contents = file_tool.read_from_file()
    print(contents)

執(zhí)行結(jié)果:


總結(jié)

判斷密碼強(qiáng)弱的6個(gè)例子,知識(shí)點(diǎn)歸納如下:


完整代碼查看碼云

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容