目录
在数字化时代,账号密码是我们保护个人信息与资产安全的第一道防线。使用重复、简单的密码(如生日、手机号)极易遭受暴力破解,而手动构思复杂密码又容易遗忘。对于编程新手而言,亲手实现一款密码生成器,不仅能解决日常密码需求,还能巩固 Python 字符串处理、随机数生成与函数封装的核心知识点。本文将带领大家使用 Python 内置库,打造一款支持自定义长度、可选字符集、批量生成且可本地保存的安全密码生成器,代码原创无版权,可自由修改、分发与商用。
一、核心功能设计
本次实现的密码生成器以「安全、灵活、实用」为核心,聚焦日常密码使用场景,规划了以下 5 项核心功能:
- 自定义密码长度:支持 8-64 位密码生成(符合主流平台密码长度要求),默认生成 16 位高强度密码
- 可选字符集组合:支持勾选「大写字母、小写字母、数字、特殊符号」四种字符集,按需组合
- 高强度随机生成:避免伪随机数漏洞,生成无规律、难破解的安全密码
- 批量生成密码:支持一次性生成多个密码,满足多账号注册的批量需求
- 本地保存结果:将生成的密码列表保存到本地文本文件,方便查阅与记录
二、环境准备
本次开发无需安装任何第三方库,仅依赖 Python 内置标准库,环境要求如下:
- Python 3.6 及以上版本(兼容 Windows/macOS/Linux 所有主流平台)
- 无额外依赖库,直接使用
random、string、os三个内置库
验证 Python 环境是否就绪:打开终端 / 命令提示符,输入以下命令,若正常显示版本号则说明环境可用。
bash
python --version # Windows 系统
# 或
python3 --version # macOS/Linux 系统
三、代码实现(例子)
本次密码生成器采用「函数化编程」思路,将字符集配置、密码生成、批量处理、文件保存等功能拆分为独立函数,代码可读性强、易于修改扩展。所有生成的密码最终可保存至 generated_passwords.txt 文件,方便后续查阅。
bash
import random
import string
import os
# 定义默认配置(可直接修改,适配个人使用习惯)
DEFAULT_PASSWORD_LENGTH = 16 # 默认密码长度
MIN_LENGTH = 8 # 最小密码长度限制
MAX_LENGTH = 64 # 最大密码长度限制
DEFAULT_BATCH_COUNT = 5 # 默认批量生成数量
def get_char_set(include_upper=True, include_lower=True, include_digits=True, include_symbols=True):
"""
构建密码字符集:根据用户选择组合对应的字符类型
:param include_upper: 是否包含大写字母(bool)
:param include_lower: 是否包含小写字母(bool)
:param include_digits: 是否包含数字(bool)
:param include_symbols: 是否包含特殊符号(bool)
:return: 组合后的字符集字符串
"""
char_set = ""
# 拼接对应字符集
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 # 数字 0-9
if include_symbols:
char_set += string.punctuation # 特殊符号 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
# 验证字符集是否为空
if not char_set:
raise ValueError("字符集不能为空!至少需要选择一种字符类型用于生成密码")
return char_set
def generate_single_password(length=DEFAULT_PASSWORD_LENGTH, char_set=None):
"""
生成单个安全密码
:param length: 密码长度(int)
:param char_set: 密码字符集(str)
:return: 生成的密码字符串
"""
# 验证密码长度是否合法
if not (MIN_LENGTH <= length <= MAX_LENGTH):
raise ValueError(f"密码长度不合法!请输入 {MIN_LENGTH}-{MAX_LENGTH} 之间的整数")
# 若未传入字符集,使用默认完整字符集
if char_set is None:
char_set = get_char_set()
# 生成随机密码:使用 random.choices 从字符集中随机选取指定长度的字符
# 加入 random.shuffle 打乱字符顺序,提升密码随机性
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: 生成数量(int)
:param length: 单个密码长度(int)
:param char_set: 密码字符集(str)
:return: 密码列表
"""
# 验证批量生成数量是否合法
if count <= 0 or not isinstance(count, int):
raise ValueError("生成数量不合法!请输入大于 0 的整数")
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("❌ 无有效密码可保存!")
return
# 以追加模式写入文件,避免覆盖原有数据,同时添加时间戳便于区分
with open(filename, 'a', encoding='utf-8') as f:
# 写入文件分隔符与时间戳
current_time = str(random.random()) # 简化时间戳,新手易理解(可替换为 datetime 精确时间)
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"📌 默认配置:密码长度 {DEFAULT_PASSWORD_LENGTH} 位,包含大小写字母、数字、特殊符号")
print(f"📌 密码长度限制:{MIN_LENGTH}-{MAX_LENGTH} 位,批量生成默认 {DEFAULT_BATCH_COUNT} 个\n")
while True:
# 打印主菜单
print("========== 密码生成器主菜单 ==========")
print("1. 生成单个密码")
print("2. 批量生成密码")
print("3. 自定义字符集生成密码")
print("4. 退出程序")
print("======================================")
# 获取用户选择
try:
choice = int(input("请输入您的操作选择(1-4):"))
except ValueError:
print("❌ 输入无效!请输入 1-4 之间的整数\n")
continue
# 处理用户选择
if choice == 1:
# 生成单个密码
try:
length = int(input(f"请输入密码长度(默认 {DEFAULT_PASSWORD_LENGTH},范围 {MIN_LENGTH}-{MAX_LENGTH}):").strip() or DEFAULT_PASSWORD_LENGTH)
password = generate_single_password(length)
print(f"\n✅ 单个密码生成成功:{password}\n")
# 询问是否保存
save_choice = input("是否将该密码保存到文件?(y/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"请输入生成数量(默认 {DEFAULT_BATCH_COUNT},大于 0):").strip() or DEFAULT_BATCH_COUNT)
length = int(input(f"请输入密码长度(默认 {DEFAULT_PASSWORD_LENGTH},范围 {MIN_LENGTH}-{MAX_LENGTH}):").strip() or DEFAULT_PASSWORD_LENGTH)
password_list = batch_generate_passwords(count, length)
print(f"\n✅ 批量密码生成成功,共 {count} 个:")
for index, pwd in enumerate(password_list, start=1):
print(f"{index}. {pwd}")
print()
# 询问是否保存
save_choice = input("是否将这些密码保存到文件?(y/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请选择需要包含的字符类型(输入 y 表示包含,n 表示不包含,直接回车默认 y)")
try:
upper_choice = input("是否包含大写字母(A-Z)?:").strip().lower() or 'y'
lower_choice = input("是否包含小写字母(a-z)?:").strip().lower() or 'y'
digits_choice = input("是否包含数字(0-9)?:").strip().lower() or 'y'
symbols_choice = input("是否包含特殊符号(!@#$ 等)?:").strip().lower() or 'y'
# 转换为布尔值
include_upper = (upper_choice == 'y')
include_lower = (lower_choice == 'y')
include_digits = (digits_choice == 'y')
include_symbols = (symbols_choice == 'y')
# 构建自定义字符集
char_set = get_char_set(include_upper, include_lower, include_digits, include_symbols)
# 选择生成单个或批量
gen_type = input("\n请选择生成类型(1-单个,2-批量,默认 1):").strip() or '1'
if gen_type == '1':
length = int(input(f"请输入密码长度(默认 {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,默认 n):").strip().lower()
if save_choice == 'y':
save_passwords_to_file([password])
elif gen_type == '2':
count = int(input(f"请输入生成数量(默认 {DEFAULT_BATCH_COUNT},大于 0):").strip() or DEFAULT_BATCH_COUNT)
length = int(input(f"请输入密码长度(默认 {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} 个:")
for index, pwd in enumerate(password_list, start=1):
print(f"{index}. {pwd}")
print()
save_choice = input("是否将这些密码保存到文件?(y/n,默认 n):").strip().lower()
if save_choice == 'y':
save_passwords_to_file(password_list)
else:
print("❌ 生成类型选择无效!\n")
except Exception as e:
print(f"❌ 生成失败:{str(e)}\n")
elif choice == 4:
# 退出程序
print("👋 程序已退出,感谢使用!生成的密码已保存至 generated_passwords.txt(若选择保存)")
break
else:
print("❌ 选择无效!请输入 1-4 之间的整数\n")
# 程序入口
if __name__ == "__main__":
main_interactive()
四、代码核心解析
- 字符集构建(
get_char_set) :借助string内置库的预置常量(ascii_uppercase、ascii_lowercase等)快速获取各类字符,无需手动输入字符集;加入非空校验,避免生成空密码,提升程序健壮性。 - 单个密码生成(
generate_single_password) :- 先校验密码长度是否在
8-64位的合理区间,符合主流平台密码要求。 - 使用
random.choices()从字符集中随机选取指定长度的字符,支持字符重复选取(更符合真实密码场景)。 - 加入
random.shuffle()打乱字符排列顺序,避免出现「先大写、再小写、后数字」的固定规律,提升密码随机性与安全性。
- 先校验密码长度是否在
- 批量密码生成(
batch_generate_passwords):通过循环调用单个密码生成函数,收集结果到列表中,返回批量密码;加入生成数量校验,避免无效批量生成。 - 文件保存(
save_passwords_to_file) :采用「追加模式(a)」写入文件,避免覆盖原有密码记录;添加简易时间戳分隔符,方便区分不同批次生成的密码,提升文件可读性。 - 交互式主菜单(
main_interactive) :通过while True实现循环交互,支持用户自定义配置;加入多层try-except异常处理,避免用户输入无效值导致程序崩溃;提供「是否保存」的可选操作,提升用户体验。
五、使用教程
-
运行程序 :将上述代码保存为
password_generator.py,打开终端 / 命令提示符,进入文件所在目录,输入以下命令运行程序:bashpython password_generator.py # Windows 系统 # 或 python3 password_generator.py # macOS/Linux 系统 -
操作流程 :
- 运行后直接进入主菜单,默认配置为「16 位密码、包含所有字符类型」。
- 选择「1」:输入自定义密码长度(或直接回车使用默认),生成单个密码,可选择保存到本地文件。
- 选择「2」:输入生成数量和密码长度,批量生成多个密码,可查看所有结果并选择保存。
- 选择「3」:自定义勾选需要包含的字符类型(如不包含特殊符号),再选择单个 / 批量生成,满足特殊平台的密码要求。
- 选择「4」:退出程序,所有保存的密码均存储在
generated_passwords.txt中。
-
结果查看 :直接用记事本 / 文本编辑器打开
generated_passwords.txt,即可查看所有保存的密码记录,不同批次的密码以分隔符区分,格式清晰易查阅。 -
密码强度检测:添加密码强度评分功能(从长度、字符类型丰富度、无规律程度三个维度评分),标注「弱 / 中 / 强」等级,帮助用户筛选更安全的密码。
-
剪贴板自动复制 :结合
pyperclip第三方库,生成密码后自动复制到剪贴板,无需手动选中复制,提升使用便捷性。 -
避免常见弱密码 :构建常见弱密码字典(如
123456、admin等),生成密码后进行比对,排除与弱密码重复或相似的结果。 -
图形化界面 :使用 Python 内置
tkinter库或第三方库PyQt,打造可视化操作界面,添加「一键生成」「一键保存」「清空记录」等按钮,降低非编程用户使用门槛。 -
加密存储 :对本地保存的密码进行加密处理(如使用
cryptography库进行 AES 加密),避免他人查看本地文件获取明文密码,提升数据安全性。
- 本次密码生成器核心支持「单个生成、批量生成、自定义字符集」三大功能,且支持密码本地持久化保存。
- 代码采用函数化编程拆分功能,加入多层异常处理与参数校验,提升程序健壮性,同时保证密码的随机性与安全性。
- 工具无第三方依赖可直接运行,具备清晰的扩展方向,方便新手后续进阶优化,提升工具的实用性与安全性。