python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python密码生成器

零基础带你使用Python实现简单的安全密码生成器

作者:码农进厂打螺丝

在数字化时代,账号密码是我们保护个人信息与资产安全的第一道防线,本文将带领大家使用 Python 内置库,打造一款支持自定义长度,可选字符集,批量生成且可本地保存的安全密码生成器,希望对大家有所帮助

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

一、核心功能设计

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

二、环境准备

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

验证 Python 环境是否就绪:打开终端 / 命令提示符,输入以下命令,若正常显示版本号则说明环境可用。

python --version  # Windows 系统
# 或
python3 --version  # macOS/Linux 系统

三、代码实现(例子)

本次密码生成器采用「函数化编程」思路,将字符集配置、密码生成、批量处理、文件保存等功能拆分为独立函数,代码可读性强、易于修改扩展。所有生成的密码最终可保存至 generated_passwords.txt 文件,方便后续查阅。

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_uppercaseascii_lowercase 等)快速获取各类字符,无需手动输入字符集;加入非空校验,避免生成空密码,提升程序健壮性。

单个密码生成(generate_single_password

批量密码生成(batch_generate_passwords:通过循环调用单个密码生成函数,收集结果到列表中,返回批量密码;加入生成数量校验,避免无效批量生成。

文件保存(save_passwords_to_file:采用「追加模式(a)」写入文件,避免覆盖原有密码记录;添加简易时间戳分隔符,方便区分不同批次生成的密码,提升文件可读性。

交互式主菜单(main_interactive:通过 while True 实现循环交互,支持用户自定义配置;加入多层 try-except 异常处理,避免用户输入无效值导致程序崩溃;提供「是否保存」的可选操作,提升用户体验。

五、使用教程

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

python password_generator.py  # Windows 系统
# 或
python3 password_generator.py  # macOS/Linux 系统

操作流程

结果查看:直接用记事本 / 文本编辑器打开 generated_passwords.txt,即可查看所有保存的密码记录,不同批次的密码以分隔符区分,格式清晰易查阅。

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

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

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

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

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

六、总结

本次密码生成器核心支持「单个生成、批量生成、自定义字符集」三大功能,且支持密码本地持久化保存。

代码采用函数化编程拆分功能,加入多层异常处理与参数校验,提升程序健壮性,同时保证密码的随机性与安全性。

工具无第三方依赖可直接运行,具备清晰的扩展方向,方便新手后续进阶优化,提升工具的实用性与安全性。

到此这篇关于零基础带你使用Python实现简单的安全密码生成器的文章就介绍到这了,更多相关Python密码生成器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文