零基础实现 Python 安全密码生成器

目录

一、核心功能设计

二、环境准备

三、代码实现(例子)

四、代码核心解析

五、使用教程

在数字化时代,账号密码是我们保护个人信息与资产安全的第一道防线。使用重复、简单的密码(如生日、手机号)极易遭受暴力破解,而手动构思复杂密码又容易遗忘。对于编程新手而言,亲手实现一款密码生成器,不仅能解决日常密码需求,还能巩固 Python 字符串处理、随机数生成与函数封装的核心知识点。本文将带领大家使用 Python 内置库,打造一款支持自定义长度、可选字符集、批量生成且可本地保存的安全密码生成器,代码原创无版权,可自由修改、分发与商用。

一、核心功能设计

本次实现的密码生成器以「安全、灵活、实用」为核心,聚焦日常密码使用场景,规划了以下 5 项核心功能:

  1. 自定义密码长度:支持 8-64 位密码生成(符合主流平台密码长度要求),默认生成 16 位高强度密码
  2. 可选字符集组合:支持勾选「大写字母、小写字母、数字、特殊符号」四种字符集,按需组合
  3. 高强度随机生成:避免伪随机数漏洞,生成无规律、难破解的安全密码
  4. 批量生成密码:支持一次性生成多个密码,满足多账号注册的批量需求
  5. 本地保存结果:将生成的密码列表保存到本地文本文件,方便查阅与记录

二、环境准备

本次开发无需安装任何第三方库,仅依赖 Python 内置标准库,环境要求如下:

  • Python 3.6 及以上版本(兼容 Windows/macOS/Linux 所有主流平台)
  • 无额外依赖库,直接使用 randomstringos 三个内置库

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

四、代码核心解析

  1. 字符集构建(get_char_set :借助 string 内置库的预置常量(ascii_uppercaseascii_lowercase 等)快速获取各类字符,无需手动输入字符集;加入非空校验,避免生成空密码,提升程序健壮性。
  2. 单个密码生成(generate_single_password
    • 先校验密码长度是否在 8-64 位的合理区间,符合主流平台密码要求。
    • 使用 random.choices() 从字符集中随机选取指定长度的字符,支持字符重复选取(更符合真实密码场景)。
    • 加入 random.shuffle() 打乱字符排列顺序,避免出现「先大写、再小写、后数字」的固定规律,提升密码随机性与安全性。
  3. 批量密码生成(batch_generate_passwords:通过循环调用单个密码生成函数,收集结果到列表中,返回批量密码;加入生成数量校验,避免无效批量生成。
  4. 文件保存(save_passwords_to_file :采用「追加模式(a)」写入文件,避免覆盖原有密码记录;添加简易时间戳分隔符,方便区分不同批次生成的密码,提升文件可读性。
  5. 交互式主菜单(main_interactive :通过 while True 实现循环交互,支持用户自定义配置;加入多层 try-except 异常处理,避免用户输入无效值导致程序崩溃;提供「是否保存」的可选操作,提升用户体验。

五、使用教程

  1. 运行程序 :将上述代码保存为 password_generator.py,打开终端 / 命令提示符,进入文件所在目录,输入以下命令运行程序:

    bash 复制代码
    python password_generator.py  # Windows 系统
    # 或
    python3 password_generator.py  # macOS/Linux 系统
  2. 操作流程

    • 运行后直接进入主菜单,默认配置为「16 位密码、包含所有字符类型」。
    • 选择「1」:输入自定义密码长度(或直接回车使用默认),生成单个密码,可选择保存到本地文件。
    • 选择「2」:输入生成数量和密码长度,批量生成多个密码,可查看所有结果并选择保存。
    • 选择「3」:自定义勾选需要包含的字符类型(如不包含特殊符号),再选择单个 / 批量生成,满足特殊平台的密码要求。
    • 选择「4」:退出程序,所有保存的密码均存储在 generated_passwords.txt 中。
  3. 结果查看 :直接用记事本 / 文本编辑器打开 generated_passwords.txt,即可查看所有保存的密码记录,不同批次的密码以分隔符区分,格式清晰易查阅。

  4. 密码强度检测:添加密码强度评分功能(从长度、字符类型丰富度、无规律程度三个维度评分),标注「弱 / 中 / 强」等级,帮助用户筛选更安全的密码。

  5. 剪贴板自动复制 :结合 pyperclip 第三方库,生成密码后自动复制到剪贴板,无需手动选中复制,提升使用便捷性。

  6. 避免常见弱密码 :构建常见弱密码字典(如 123456admin 等),生成密码后进行比对,排除与弱密码重复或相似的结果。

  7. 图形化界面 :使用 Python 内置 tkinter 库或第三方库 PyQt,打造可视化操作界面,添加「一键生成」「一键保存」「清空记录」等按钮,降低非编程用户使用门槛。

  8. 加密存储 :对本地保存的密码进行加密处理(如使用 cryptography 库进行 AES 加密),避免他人查看本地文件获取明文密码,提升数据安全性。

  • 本次密码生成器核心支持「单个生成、批量生成、自定义字符集」三大功能,且支持密码本地持久化保存。
  • 代码采用函数化编程拆分功能,加入多层异常处理与参数校验,提升程序健壮性,同时保证密码的随机性与安全性。
  • 工具无第三方依赖可直接运行,具备清晰的扩展方向,方便新手后续进阶优化,提升工具的实用性与安全性。
相关推荐
C澒9 小时前
系统初始化成功率下降排查实践
前端·安全·运维开发
只是懒得想了9 小时前
C++实现密码破解工具:从MD5暴力破解到现代哈希安全实践
c++·算法·安全·哈希算法
云边云科技_云网融合9 小时前
AIoT智能物联网平台:架构解析与边缘应用新图景
大数据·网络·人工智能·安全
C澒10 小时前
面单打印服务的监控检查事项
前端·后端·安全·运维开发·交通物流
运维有小邓@10 小时前
生物制药企业 AD 域管理破局:合规 · 效率 · 安全三维解决方案
人工智能·安全
大力财经10 小时前
喜茶2025年批量重装130多家门店
安全
青岛前景互联信息技术有限公司10 小时前
政策支撑:应急部推动化工园区安全风险智能化管控平台有效应用!
大数据·人工智能·安全
珑哥说自养号采购10 小时前
TEMU采购下单,卖家如何搭建安全的环境?
安全
浩浩测试一下10 小时前
DDOS 应急响应Linux防火墙 Iptable 使用方式方法
linux·网络·安全·web安全·网络安全·系统安全·ddos
u01040583610 小时前
基于 OAuth2 的用户授权体系在返利类应用中的安全集成实践
安全