安全密码生成器

功能实现说明

1. 灵活配置
  • 自定义长度:输入框支持手动输入(默认12),自动校验数字类型
  • 字符组合:通过复选框实现四类字符自由组合(大写、小写、数字、符号)
  • 默认值支持:初始化时已预设常用参数(长度12,全选字符类型)
2. 安全增强
  • 加密安全:使用secrets模块替代random,符合NIST安全标准
  • 配置校验:未选择字符类型时抛出错误,密码长度<8时弹出警告
  • 防预测设计:字符选择后随机打乱顺序,避免模式化组合
3. 用户体验
  • 一键复制:通过pyperclip实现自动复制,支持跨平台操作
  • 错误处理:对非法输入(如非数字长度)进行友好提示
  • 状态反馈:只读输入框显示结果,防止误修改

 功能代码

import tkinter as tk
from tkinter import ttk, messagebox
import secrets
import string
import pyperclip

class PasswordGenerator:
    def __init__(self, master):
        self.master = master
        master.title("安全密码生成器")
        master.geometry("400x300")
        master.resizable(False, False)

        # 控件变量初始化
        self.length_var = tk.StringVar(value="12")
        self.upper_var = tk.BooleanVar(value=True)
        self.lower_var = tk.BooleanVar(value=True)
        self.digits_var = tk.BooleanVar(value=True)
        self.symbols_var = tk.BooleanVar(value=True)
        self.password_var = tk.StringVar()

        # 界面布局
        self.create_widgets()

    def create_widgets(self):
        """构建图形界面"""
        # 密码长度输入
        ttk.Label(self.master, text="密码长度:").grid(row=0, column=0, padx=10, pady=10, sticky="w")
        length_entry = ttk.Entry(self.master, textvariable=self.length_var, width=10)
        length_entry.grid(row=0, column=1, sticky="w")

        # 字符类型选择
        ttk.Checkbutton(self.master, text="大写字母(A-Z)", variable=self.upper_var).grid(row=1, column=0, sticky="w", padx=10)
        ttk.Checkbutton(self.master, text="小写字母(a-z)", variable=self.lower_var).grid(row=2, column=0, sticky="w", padx=10)
        ttk.Checkbutton(self.master, text="数字(0-9)", variable=self.digits_var).grid(row=3, column=0, sticky="w", padx=10)
        ttk.Checkbutton(self.master, text="符号(!@#$)", variable=self.symbols_var).grid(row=4, column=0, sticky="w", padx=10)

        # 生成按钮
        ttk.Button(self.master, text="生成密码", command=self.generate_password).grid(row=5, column=0, pady=15, columnspan=2)

        # 密码显示
        ttk.Label(self.master, text="生成结果:").grid(row=6, column=0, padx=10, sticky="w")
        result_entry = ttk.Entry(self.master, textvariable=self.password_var, state="readonly", width=25)
        result_entry.grid(row=6, column=1, sticky="w")

        # 复制按钮
        ttk.Button(self.master, text="复制密码", command=self.copy_password).grid(row=7, column=0, pady=10, columnspan=2)

    def generate_password(self):
        """核心生成逻辑"""
        try:
            # 参数校验
            length = int(self.length_var.get())
            charset = self.build_charset()
            
            # 安全检测
            if not charset:
                raise ValueError("请至少选择一种字符类型")
            if length < 8:
                messagebox.showwarning("安全警告", "密码长度建议≥8位!")

            # 密码生成
            password = ''.join(secrets.choice(charset) for _ in range(length))
            self.password_var.set(password)
            pyperclip.copy(password)  # 自动复制到剪贴板

        except ValueError as e:
            messagebox.showerror("参数错误", f"输入无效:{str(e)}")
        except Exception as e:
            messagebox.showerror("系统错误", f"生成失败:{str(e)}")

    def build_charset(self):
        """构建字符集"""
        charset = ""
        if self.upper_var.get(): charset += string.ascii_uppercase
        if self.lower_var.get(): charset += string.ascii_lowercase
        if self.digits_var.get(): charset += string.digits
        if self.symbols_var.get(): charset += string.punctuation
        return charset

    def copy_password(self):
        """复制到剪贴板"""
        if self.password_var.get():
            pyperclip.copy(self.password_var.get())
            messagebox.showinfo("操作成功", "密码已复制到剪贴板")

if __name__ == "__main__":
    root = tk.Tk()
    app = PasswordGenerator(root)
    root.mainloop()

你可能感兴趣的:(安全,python)