零基礎(chǔ)帶你使用Python實(shí)現(xiàn)簡(jiǎn)單的安全密碼生成器
在數(shù)字化時(shí)代,賬號(hào)密碼是我們保護(hù)個(gè)人信息與資產(chǎn)安全的第一道防線。使用重復(fù)、簡(jiǎn)單的密碼(如生日、手機(jī)號(hào))極易遭受破解,而手動(dòng)構(gòu)思復(fù)雜密碼又容易遺忘。對(duì)于編程新手而言,親手實(shí)現(xiàn)一款密碼生成器,不僅能解決日常密碼需求,還能鞏固 Python 字符串處理、隨機(jī)數(shù)生成與函數(shù)封裝的核心知識(shí)點(diǎn)。本文將帶領(lǐng)大家使用 Python 內(nèi)置庫(kù),打造一款支持自定義長(zhǎng)度、可選字符集、批量生成且可本地保存的安全密碼生成器,代碼原創(chuàng)無(wú)版權(quán),可自由修改、分發(fā)與商用。
一、核心功能設(shè)計(jì)
本次實(shí)現(xiàn)的密碼生成器以「安全、靈活、實(shí)用」為核心,聚焦日常密碼使用場(chǎng)景,規(guī)劃了以下 5 項(xiàng)核心功能:
- 自定義密碼長(zhǎng)度:支持 8-64 位密碼生成(符合主流平臺(tái)密碼長(zhǎng)度要求),默認(rèn)生成 16 位高強(qiáng)度密碼
- 可選字符集組合:支持勾選「大寫字母、小寫字母、數(shù)字、特殊符號(hào)」四種字符集,按需組合
- 高強(qiáng)度隨機(jī)生成:避免偽隨機(jī)數(shù)漏洞,生成無(wú)規(guī)律、難破解的安全密碼
- 批量生成密碼:支持一次性生成多個(gè)密碼,滿足多賬號(hào)注冊(cè)的批量需求
- 本地保存結(jié)果:將生成的密碼列表保存到本地文本文件,方便查閱與記錄
二、環(huán)境準(zhǔn)備
本次開發(fā)無(wú)需安裝任何第三方庫(kù),僅依賴 Python 內(nèi)置標(biāo)準(zhǔn)庫(kù),環(huán)境要求如下:
- Python 3.6 及以上版本(兼容 Windows/macOS/Linux 所有主流平臺(tái))
- 無(wú)額外依賴庫(kù),直接使用
random、string、os三個(gè)內(nèi)置庫(kù)
驗(yàn)證 Python 環(huán)境是否就緒:打開終端 / 命令提示符,輸入以下命令,若正常顯示版本號(hào)則說(shuō)明環(huán)境可用。
python --version # Windows 系統(tǒng) # 或 python3 --version # macOS/Linux 系統(tǒng)
三、代碼實(shí)現(xiàn)(例子)
本次密碼生成器采用「函數(shù)化編程」思路,將字符集配置、密碼生成、批量處理、文件保存等功能拆分為獨(dú)立函數(shù),代碼可讀性強(qiáng)、易于修改擴(kuò)展。所有生成的密碼最終可保存至 generated_passwords.txt 文件,方便后續(xù)查閱。
import random
import string
import os
# 定義默認(rèn)配置(可直接修改,適配個(gè)人使用習(xí)慣)
DEFAULT_PASSWORD_LENGTH = 16 # 默認(rèn)密碼長(zhǎng)度
MIN_LENGTH = 8 # 最小密碼長(zhǎng)度限制
MAX_LENGTH = 64 # 最大密碼長(zhǎng)度限制
DEFAULT_BATCH_COUNT = 5 # 默認(rèn)批量生成數(shù)量
def get_char_set(include_upper=True, include_lower=True, include_digits=True, include_symbols=True):
"""
構(gòu)建密碼字符集:根據(jù)用戶選擇組合對(duì)應(yīng)的字符類型
:param include_upper: 是否包含大寫字母(bool)
:param include_lower: 是否包含小寫字母(bool)
:param include_digits: 是否包含數(shù)字(bool)
:param include_symbols: 是否包含特殊符號(hào)(bool)
:return: 組合后的字符集字符串
"""
char_set = ""
# 拼接對(duì)應(yīng)字符集
if include_upper:
char_set += string.ascii_uppercase # 大寫字母 A-Z
if include_lower:
char_set += string.ascii_lowercase # 小寫字母 a-z
if include_digits:
char_set += string.digits # 數(shù)字 0-9
if include_symbols:
char_set += string.punctuation # 特殊符號(hào) !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
# 驗(yàn)證字符集是否為空
if not char_set:
raise ValueError("字符集不能為空!至少需要選擇一種字符類型用于生成密碼")
return char_set
def generate_single_password(length=DEFAULT_PASSWORD_LENGTH, char_set=None):
"""
生成單個(gè)安全密碼
:param length: 密碼長(zhǎng)度(int)
:param char_set: 密碼字符集(str)
:return: 生成的密碼字符串
"""
# 驗(yàn)證密碼長(zhǎng)度是否合法
if not (MIN_LENGTH <= length <= MAX_LENGTH):
raise ValueError(f"密碼長(zhǎng)度不合法!請(qǐng)輸入 {MIN_LENGTH}-{MAX_LENGTH} 之間的整數(shù)")
# 若未傳入字符集,使用默認(rèn)完整字符集
if char_set is None:
char_set = get_char_set()
# 生成隨機(jī)密碼:使用 random.choices 從字符集中隨機(jī)選取指定長(zhǎng)度的字符
# 加入 random.shuffle 打亂字符順序,提升密碼隨機(jī)性
password_chars = random.choices(char_set, k=length)
random.shuffle(password_chars) # 打亂字符排列,避免固定順序漏洞
password = ''.join(password_chars)
return password
def batch_generate_passwords(count=DEFAULT_BATCH_COUNT, length=DEFAULT_PASSWORD_LENGTH, char_set=None):
"""
批量生成密碼
:param count: 生成數(shù)量(int)
:param length: 單個(gè)密碼長(zhǎng)度(int)
:param char_set: 密碼字符集(str)
:return: 密碼列表
"""
# 驗(yàn)證批量生成數(shù)量是否合法
if count <= 0 or not isinstance(count, int):
raise ValueError("生成數(shù)量不合法!請(qǐng)輸入大于 0 的整數(shù)")
password_list = []
for _ in range(count):
password = generate_single_password(length, char_set)
password_list.append(password)
return password_list
def save_passwords_to_file(password_list, filename="generated_passwords.txt"):
"""
將生成的密碼列表保存到本地文本文件
:param password_list: 密碼列表(list)
:param filename: 保存文件名(str)
"""
if not password_list:
print("? 無(wú)有效密碼可保存!")
return
# 以追加模式寫入文件,避免覆蓋原有數(shù)據(jù),同時(shí)添加時(shí)間戳便于區(qū)分
with open(filename, 'a', encoding='utf-8') as f:
# 寫入文件分隔符與時(shí)間戳
current_time = str(random.random()) # 簡(jiǎn)化時(shí)間戳,新手易理解(可替換為 datetime 精確時(shí)間)
f.write(f"\n========== 密碼生成記錄 - {current_time} ==========\n")
for index, password in enumerate(password_list, start=1):
f.write(f"{index}. {password}\n")
print(f"? 密碼已成功保存至 {filename},共 {len(password_list)} 條記錄")
def main_interactive():
"""
交互式主菜單,提供用戶友好的操作入口
"""
print("?? 歡迎使用 Python 安全密碼生成器")
print(f"?? 默認(rèn)配置:密碼長(zhǎng)度 {DEFAULT_PASSWORD_LENGTH} 位,包含大小寫字母、數(shù)字、特殊符號(hào)")
print(f"?? 密碼長(zhǎng)度限制:{MIN_LENGTH}-{MAX_LENGTH} 位,批量生成默認(rèn) {DEFAULT_BATCH_COUNT} 個(gè)\n")
while True:
# 打印主菜單
print("========== 密碼生成器主菜單 ==========")
print("1. 生成單個(gè)密碼")
print("2. 批量生成密碼")
print("3. 自定義字符集生成密碼")
print("4. 退出程序")
print("======================================")
# 獲取用戶選擇
try:
choice = int(input("請(qǐng)輸入您的操作選擇(1-4):"))
except ValueError:
print("? 輸入無(wú)效!請(qǐng)輸入 1-4 之間的整數(shù)\n")
continue
# 處理用戶選擇
if choice == 1:
# 生成單個(gè)密碼
try:
length = int(input(f"請(qǐng)輸入密碼長(zhǎng)度(默認(rèn) {DEFAULT_PASSWORD_LENGTH},范圍 {MIN_LENGTH}-{MAX_LENGTH}):").strip() or DEFAULT_PASSWORD_LENGTH)
password = generate_single_password(length)
print(f"\n? 單個(gè)密碼生成成功:{password}\n")
# 詢問是否保存
save_choice = input("是否將該密碼保存到文件?(y/n,默認(rèn) n):").strip().lower()
if save_choice == 'y':
save_passwords_to_file([password])
except Exception as e:
print(f"? 生成失敗:{str(e)}\n")
elif choice == 2:
# 批量生成密碼
try:
count = int(input(f"請(qǐng)輸入生成數(shù)量(默認(rèn) {DEFAULT_BATCH_COUNT},大于 0):").strip() or DEFAULT_BATCH_COUNT)
length = int(input(f"請(qǐng)輸入密碼長(zhǎng)度(默認(rèn) {DEFAULT_PASSWORD_LENGTH},范圍 {MIN_LENGTH}-{MAX_LENGTH}):").strip() or DEFAULT_PASSWORD_LENGTH)
password_list = batch_generate_passwords(count, length)
print(f"\n? 批量密碼生成成功,共 {count} 個(gè):")
for index, pwd in enumerate(password_list, start=1):
print(f"{index}. {pwd}")
print()
# 詢問是否保存
save_choice = input("是否將這些密碼保存到文件?(y/n,默認(rèn) n):").strip().lower()
if save_choice == 'y':
save_passwords_to_file(password_list)
except Exception as e:
print(f"? 生成失敗:{str(e)}\n")
elif choice == 3:
# 自定義字符集生成密碼
print("\n請(qǐng)選擇需要包含的字符類型(輸入 y 表示包含,n 表示不包含,直接回車默認(rèn) y)")
try:
upper_choice = input("是否包含大寫字母(A-Z)?:").strip().lower() or 'y'
lower_choice = input("是否包含小寫字母(a-z)?:").strip().lower() or 'y'
digits_choice = input("是否包含數(shù)字(0-9)?:").strip().lower() or 'y'
symbols_choice = input("是否包含特殊符號(hào)(!@#$ 等)?:").strip().lower() or 'y'
# 轉(zhuǎn)換為布爾值
include_upper = (upper_choice == 'y')
include_lower = (lower_choice == 'y')
include_digits = (digits_choice == 'y')
include_symbols = (symbols_choice == 'y')
# 構(gòu)建自定義字符集
char_set = get_char_set(include_upper, include_lower, include_digits, include_symbols)
# 選擇生成單個(gè)或批量
gen_type = input("\n請(qǐng)選擇生成類型(1-單個(gè),2-批量,默認(rèn) 1):").strip() or '1'
if gen_type == '1':
length = int(input(f"請(qǐng)輸入密碼長(zhǎng)度(默認(rèn) {DEFAULT_PASSWORD_LENGTH},范圍 {MIN_LENGTH}-{MAX_LENGTH}):").strip() or DEFAULT_PASSWORD_LENGTH)
password = generate_single_password(length, char_set)
print(f"\n? 自定義字符集密碼生成成功:{password}\n")
save_choice = input("是否將該密碼保存到文件?(y/n,默認(rèn) n):").strip().lower()
if save_choice == 'y':
save_passwords_to_file([password])
elif gen_type == '2':
count = int(input(f"請(qǐng)輸入生成數(shù)量(默認(rèn) {DEFAULT_BATCH_COUNT},大于 0):").strip() or DEFAULT_BATCH_COUNT)
length = int(input(f"請(qǐng)輸入密碼長(zhǎng)度(默認(rèn) {DEFAULT_PASSWORD_LENGTH},范圍 {MIN_LENGTH}-{MAX_LENGTH}):").strip() or DEFAULT_PASSWORD_LENGTH)
password_list = batch_generate_passwords(count, length, char_set)
print(f"\n? 自定義字符集批量密碼生成成功,共 {count} 個(gè):")
for index, pwd in enumerate(password_list, start=1):
print(f"{index}. {pwd}")
print()
save_choice = input("是否將這些密碼保存到文件?(y/n,默認(rèn) n):").strip().lower()
if save_choice == 'y':
save_passwords_to_file(password_list)
else:
print("? 生成類型選擇無(wú)效!\n")
except Exception as e:
print(f"? 生成失?。簕str(e)}\n")
elif choice == 4:
# 退出程序
print("?? 程序已退出,感謝使用!生成的密碼已保存至 generated_passwords.txt(若選擇保存)")
break
else:
print("? 選擇無(wú)效!請(qǐng)輸入 1-4 之間的整數(shù)\n")
# 程序入口
if __name__ == "__main__":
main_interactive()四、代碼核心解析
字符集構(gòu)建(get_char_set):借助 string 內(nèi)置庫(kù)的預(yù)置常量(ascii_uppercase、ascii_lowercase 等)快速獲取各類字符,無(wú)需手動(dòng)輸入字符集;加入非空校驗(yàn),避免生成空密碼,提升程序健壯性。
單個(gè)密碼生成(generate_single_password):
- 先校驗(yàn)密碼長(zhǎng)度是否在
8-64位的合理區(qū)間,符合主流平臺(tái)密碼要求。 - 使用
random.choices()從字符集中隨機(jī)選取指定長(zhǎng)度的字符,支持字符重復(fù)選?。ǜ险鎸?shí)密碼場(chǎng)景)。 - 加入
random.shuffle()打亂字符排列順序,避免出現(xiàn)「先大寫、再小寫、后數(shù)字」的固定規(guī)律,提升密碼隨機(jī)性與安全性。
批量密碼生成(batch_generate_passwords):通過(guò)循環(huán)調(diào)用單個(gè)密碼生成函數(shù),收集結(jié)果到列表中,返回批量密碼;加入生成數(shù)量校驗(yàn),避免無(wú)效批量生成。
文件保存(save_passwords_to_file):采用「追加模式(a)」寫入文件,避免覆蓋原有密碼記錄;添加簡(jiǎn)易時(shí)間戳分隔符,方便區(qū)分不同批次生成的密碼,提升文件可讀性。
交互式主菜單(main_interactive):通過(guò) while True 實(shí)現(xiàn)循環(huán)交互,支持用戶自定義配置;加入多層 try-except 異常處理,避免用戶輸入無(wú)效值導(dǎo)致程序崩潰;提供「是否保存」的可選操作,提升用戶體驗(yàn)。
五、使用教程
運(yùn)行程序:將上述代碼保存為 password_generator.py,打開終端 / 命令提示符,進(jìn)入文件所在目錄,輸入以下命令運(yùn)行程序:
python password_generator.py # Windows 系統(tǒng) # 或 python3 password_generator.py # macOS/Linux 系統(tǒng)
操作流程:
- 運(yùn)行后直接進(jìn)入主菜單,默認(rèn)配置為「16 位密碼、包含所有字符類型」。
- 選擇「1」:輸入自定義密碼長(zhǎng)度(或直接回車使用默認(rèn)),生成單個(gè)密碼,可選擇保存到本地文件。
- 選擇「2」:輸入生成數(shù)量和密碼長(zhǎng)度,批量生成多個(gè)密碼,可查看所有結(jié)果并選擇保存。
- 選擇「3」:自定義勾選需要包含的字符類型(如不包含特殊符號(hào)),再選擇單個(gè) / 批量生成,滿足特殊平臺(tái)的密碼要求。
- 選擇「4」:退出程序,所有保存的密碼均存儲(chǔ)在
generated_passwords.txt中。
結(jié)果查看:直接用記事本 / 文本編輯器打開 generated_passwords.txt,即可查看所有保存的密碼記錄,不同批次的密碼以分隔符區(qū)分,格式清晰易查閱。
密碼強(qiáng)度檢測(cè):添加密碼強(qiáng)度評(píng)分功能(從長(zhǎng)度、字符類型豐富度、無(wú)規(guī)律程度三個(gè)維度評(píng)分),標(biāo)注「弱 / 中 / 強(qiáng)」等級(jí),幫助用戶篩選更安全的密碼。
剪貼板自動(dòng)復(fù)制:結(jié)合 pyperclip 第三方庫(kù),生成密碼后自動(dòng)復(fù)制到剪貼板,無(wú)需手動(dòng)選中復(fù)制,提升使用便捷性。
避免常見弱密碼:構(gòu)建常見弱密碼字典(如 123456、admin 等),生成密碼后進(jìn)行比對(duì),排除與弱密碼重復(fù)或相似的結(jié)果。
圖形化界面:使用 Python 內(nèi)置 tkinter 庫(kù)或第三方庫(kù) PyQt,打造可視化操作界面,添加「一鍵生成」「一鍵保存」「清空記錄」等按鈕,降低非編程用戶使用門檻。
加密存儲(chǔ):對(duì)本地保存的密碼進(jìn)行加密處理(如使用 cryptography 庫(kù)進(jìn)行 AES 加密),避免他人查看本地文件獲取明文密碼,提升數(shù)據(jù)安全性。
六、總結(jié)
本次密碼生成器核心支持「單個(gè)生成、批量生成、自定義字符集」三大功能,且支持密碼本地持久化保存。
代碼采用函數(shù)化編程拆分功能,加入多層異常處理與參數(shù)校驗(yàn),提升程序健壯性,同時(shí)保證密碼的隨機(jī)性與安全性。
工具無(wú)第三方依賴可直接運(yùn)行,具備清晰的擴(kuò)展方向,方便新手后續(xù)進(jìn)階優(yōu)化,提升工具的實(shí)用性與安全性。
到此這篇關(guān)于零基礎(chǔ)帶你使用Python實(shí)現(xiàn)簡(jiǎn)單的安全密碼生成器的文章就介紹到這了,更多相關(guān)Python密碼生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python抽樣方法解讀及實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了python抽樣方法解讀及實(shí)現(xiàn)過(guò)程講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python3.7將普通圖片(png)轉(zhuǎn)換為SVG圖片格式(網(wǎng)站logo圖標(biāo))動(dòng)起來(lái)
這篇文章主要介紹了Python3.7將普通圖片(png)轉(zhuǎn)換為SVG圖片格式并且讓你的網(wǎng)站Logo(圖標(biāo))從此”動(dòng)”起來(lái),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Python中isinstance()函數(shù)原理解釋及詳細(xì)用法示例
isinstance()是Python內(nèi)置的一個(gè)非常有用的函數(shù),用于檢查一個(gè)對(duì)象是否屬于指定的類型或類型元組中的某一個(gè)類型,它是Python類型檢查的核心工具之一,比傳統(tǒng)的type()函數(shù)更加靈活和安全,本文給大家介紹Python中isinstance()函數(shù)原理解釋及詳細(xì)用法,感興趣的朋友一起看看吧2025-09-09
對(duì)python xlrd讀取datetime類型數(shù)據(jù)的方法詳解
今天小編就為大家分享一篇對(duì)python xlrd讀取datetime類型數(shù)據(jù)的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Pytorch:dtype不一致問題(expected dtype Double but&
這篇文章主要介紹了Pytorch:dtype不一致問題(expected dtype Double but got dtype Float),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python使用PyAutoGUI實(shí)現(xiàn)桌面自動(dòng)化的實(shí)戰(zhàn)指南
在現(xiàn)代辦公和開發(fā)環(huán)境中,我們常常被大量重復(fù)性的桌面操作所困擾,本文主要和大家詳細(xì)介紹一下Python如何使用PyAutoGUI實(shí)現(xiàn)桌面自動(dòng)化功能,感興趣的小伙伴可以了解下2026-01-01
python利用smtplib實(shí)現(xiàn)QQ郵箱發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python利用smtplib實(shí)現(xiàn)QQ郵箱發(fā)送郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Python實(shí)現(xiàn)結(jié)構(gòu)體代碼實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)結(jié)構(gòu)體代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

