有没有一种方法可以让我的GUI密码管理器使用Python中的用户名和密码进行访问?
我使用Python制作了一个程序(密码管理器),我可以输入网站、电子邮件和密码,然后单击“添加”按钮将输入写入json文件,我对此没有问题,它工作正常,我想做的是,当我打开程序时,我想让它询问我的登录用户名和密码 更不用说,我已经创建了登录窗口,其中有两个标签,每个“用户名”和“密码”有两个条目,并且在下面添加了一个“回车”按钮,我还在第107行创建了一个名为“验证”的函数,并使用“command=validate”将其分配给“回车”按钮,我想不出一种方法来计算username.input.get()=“username”和password.input.get()=“password”我的程序何时应该打开,这个登录窗口何时应该关闭 我已经搜索了很多,但我找不到任何可以在我的代码中使用的东西 这是我的密码:有没有一种方法可以让我的GUI密码管理器使用Python中的用户名和密码进行访问?,python,tkinter,Python,Tkinter,我使用Python制作了一个程序(密码管理器),我可以输入网站、电子邮件和密码,然后单击“添加”按钮将输入写入json文件,我对此没有问题,它工作正常,我想做的是,当我打开程序时,我想让它询问我的登录用户名和密码 更不用说,我已经创建了登录窗口,其中有两个标签,每个“用户名”和“密码”有两个条目,并且在下面添加了一个“回车”按钮,我还在第107行创建了一个名为“验证”的函数,并使用“command=validate”将其分配给“回车”按钮,我想不出一种方法来计算username.input.ge
from tkinter import *
from tkinter import messagebox
import random
import pyperclip
import json
# --------------------------------- Password Generator ---------------------------------- #
# Password Generator Project
def generate_password():
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']
nr_letters = random.randint(8, 10)
nr_symbols = random.randint(2, 4)
nr_numbers = random.randint(2, 4)
password_list = []
password_letters = [random.choice(letters) for _ in range(nr_letters)]
password_symbols = [random.choice(symbols) for _ in range(nr_symbols)]
password_numbers = [random.choice(numbers) for _ in range(nr_numbers)]
password_list = password_letters + password_symbols + password_numbers
random.shuffle(password_list)
password = "".join(password_list)
password_input.insert(0, password)
pyperclip.copy(password)
# --------------------------------- Save Passwords ---------------------------------- #
def save():
website = website_input.get()
email = email_input.get()
password = password_input.get()
new_data = {
website: {
"email": email,
"password": password,
}
}
if len(website) == 0 or len(email) == 0 or len(password) == 0:
messagebox.showinfo(title="Oops", message="Please don't leave any fields empty!")
else:
try:
with open("data.json", "r") as file:
# Reading old data
data = json.load(file)
except FileNotFoundError:
with open("data.json", "w") as file:
# Updating old data with new data
json.dump(new_data, file, indent=4)
else:
data.update(new_data)
with open("data.json", "w") as file:
# Saving updated data
json.dump(data, file, indent=4)
finally:
website_input.delete(0, END)
email_input.delete(0, END)
password_input.delete(0, END)
website_input.focus()
# --------------------------------- Fine Password ---------------------------------- #
def find_password():
website = website_input.get()
try:
with open("data.json") as file:
data = json.load(file)
except FileNotFoundError:
messagebox.showinfo(title="Error", message="No data file found!")
else:
if website in data:
email = data[website]["email"]
password = data[website]["password"]
messagebox.showinfo(title=website,message=f"Email: {email}\n\nPassword: {password}")
else:
messagebox.showinfo(title="Error", message=f"No details for {website} exists!")
# --------------------------------- UI Setup ---------------------------------- #
def validate():
username = username_check_input.get()
password = password_check_input.get()
if username == "username" and password == "password":
pass
else:
messagebox.showwarning(title="Error", message="Wrong password, try again!")
username_check_input.delete(0, END)
password_check_input.delete(0, END)
password_checker_window = Tk()
password_checker_window.title("Login to the password database")
password_checker_window.config(padx=50, pady=50, width=500, height=350, bg="#282120")
# canvas = Canvas(width=200, height=200, bg="#282120", highlightthickness=0)
# logo_image = PhotoImage(file="logo.png")
# canvas.create_image(100, 100, image=logo_image)
# canvas.grid(column=1, row=0)
username_check_label = Label(text="Username:", bg="#282120", fg="#D4483B")
username_check_label.grid(column=0, row=2)
password_check_label = Label(text="Password:", bg="#282120", fg="#D4483B")
password_check_label.grid(column=0, row=3)
space1 = Label(text=" ", bg="#282120")
space1.grid(column=1, row=1)
username_check_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
username_check_input.grid(column=1, row=2)
username_check_input.focus()
password_check_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B", show="*")
password_check_input.grid(column=1, row=3)
space2 = Label(text=" ", bg="#282120")
space2.grid(column=0, row=4)
enter_button = Button(text="Enter", width=7, bg="#282120", fg="#D4483B", command=validate)
enter_button.grid(column=1, row=5, columnspan=2)
while username_check_input.get() == "username" and password_check_input.get() == "password":
window = Tk()
window.title("Password Generator")
window.config(padx=50, pady=50, bg="#282120")
# canvas = Canvas(width=200, height=200, bg="#282120", highlightthickness=0)
# logo_image = PhotoImage(file="logo.png")
# canvas.create_image(100, 100, image=logo_image)
# canvas.grid(column=1, row=0)
# Labels
website_label = Label(text="Website:", bg="#282120", fg="#D4483B")
website_label.grid(column=0, row=2)
email_label = Label(text="Email / Username:", bg="#282120", fg="#D4483B")
email_label.grid(column=0, row=3)
password_label = Label(text="Password:", bg="#282120", fg="#D4483B")
password_label.grid(column=0, row=4)
line_label1 = Label(text=" ", bg="#282120")
line_label1.grid(column=1, row=1)
line_label2 = Label(text=" ", bg="#282120")
line_label2.grid(column=1, row=5)
# Entries
website_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
website_input.grid(column=1, row=2)
website_input.focus()
email_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
email_input.grid(column=1, row=3)
# email_input.insert(0, "anything@gmail.com")
password_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
password_input.grid(column=1, row=4)
# Buttons
generate_password_button = Button(text="Generate Password", bg="#282120", fg="#D4483B", command=generate_password)
generate_password_button.grid(column=2, row=4)
add_password = Button(text="Add", width=45, bg="#282120", fg="#D4483B", command=save)
add_password.grid(column=1, row=6, columnspan=2)
search = Button(text="Search", width=14, bg="#282120", fg="#D4483B", command=find_password)
search.grid(column=2, row=2)
window.mainloop()
password_checker_window.mainloop()
您可以隐藏登录窗口,添加
password\u checker\u window.destroy()
并将所有manager内容放入一个函数中,然后在验证登录后调用它,但这会产生另一个问题。密码管理器的变量现在是局部变量,因此如果没有大量全局变量,就无法从函数中访问它们。为了解决这个问题,我将您的程序重新组织为两个类。这些函数已组织到它们的相关类中,现在可以访问变量。要了解有关类和tkinter的更多信息,请搜索“OOP tkinter”(它使大型程序更易于使用)。
我还修复了密码生成器的一个小错误,在插入新密码并添加到所有小部件的父级之前,旧密码不会被删除。
虽然这一切现在都起作用了,但我想看看Serge Ballesta评论中提到的一些安全措施,因为您的密码管理器目前非常不安全
# Class for login window
class loginWindow(Tk):
def __init__(self):
Tk.__init__(self)
self.title("Login to the password database")
self.config(padx=50, pady=50, width=500, height=350, bg="#282120")
# canvas = Canvas(self, width=200, height=200, bg="#282120", highlightthickness=0)
# logo_image = PhotoImage(file="logo.png")
# canvas.create_image(100, 100, image=logo_image)
# canvas.grid(column=1, row=0)
self.username_check_label = Label(self, text="Username:", bg="#282120", fg="#D4483B")
self.username_check_label.grid(column=0, row=2)
self.password_check_label = Label(self, text="Password:", bg="#282120", fg="#D4483B")
self.password_check_label.grid(column=0, row=3)
self.space1 = Label(self, text=" ", bg="#282120")
self.space1.grid(column=1, row=1)
self.username_check_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
self.username_check_input.grid(column=1, row=2)
self.username_check_input.focus()
self.password_check_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B", show="*")
self.password_check_input.grid(column=1, row=3)
self.space2 = Label(self, text=" ", bg="#282120")
self.space2.grid(column=0, row=4)
self.enter_button = Button(self, text="Enter", width=7, bg="#282120", fg="#D4483B", command=self.validate)
self.enter_button.grid(column=1, row=5, columnspan=2)
def validate(self):
username = self.username_check_input.get()
password = self.password_check_input.get()
if username == "username" and password == "password":
self.destroy()
global load_manager
load_manager()
else:
messagebox.showwarning(title="Error", message="Wrong password, try again!")
self.username_check_input.delete(0, END)
self.password_check_input.delete(0, END)
#This function loads the password manager after logging in.
def load_manager():
app = managerWindow()
app.mainloop()
# Class for managerWindow
class managerWindow(Tk):
def __init__(self):
Tk.__init__(self)
self.title("Password Generator")
self.config(padx=50, pady=50, bg="#282120")
# self.canvas = Canvas(self, width=200, height=200, bg="#282120", highlightthickness=0)
# self.logo_image = PhotoImage(file="logo.png")
# self.canvas.create_image(100, 100, image=logo_image)
# self.canvas.grid(column=1, row=0)
# Labels
self.website_label = Label(self, text="Website:", bg="#282120", fg="#D4483B")
self.website_label.grid(column=0, row=2)
self.email_label = Label(self, text="Email / Username:", bg="#282120", fg="#D4483B")
self.email_label.grid(column=0, row=3)
self.password_label = Label(self, text="Password:", bg="#282120", fg="#D4483B")
self.password_label.grid(column=0, row=4)
self.line_label1 = Label(self, text=" ", bg="#282120")
self.line_label1.grid(column=1, row=1)
self.line_label2 = Label(self, text=" ", bg="#282120")
self.line_label2.grid(column=1, row=5)
# Entries
self.website_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
self.website_input.grid(column=1, row=2)
self.website_input.focus()
self.email_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
self.email_input.grid(column=1, row=3)
# self.email_input.insert(0, "anything@gmail.com")
self.password_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
self.password_input.grid(column=1, row=4)
# Buttons
self.generate_password_button = Button(self, text="Generate Password", bg="#282120", fg="#D4483B", command=self.generate_password)
self.generate_password_button.grid(column=2, row=4)
self.add_password = Button(self, text="Add", width=45, bg="#282120", fg="#D4483B", command=self.save)
self.add_password.grid(column=1, row=6, columnspan=2)
self.search = Button(self, text="Search", width=14, bg="#282120", fg="#D4483B", command=self.find_password)
self.search.grid(column=2, row=2)
def generate_password(self):
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']
nr_letters = random.randint(8, 10)
nr_symbols = random.randint(2, 4)
nr_numbers = random.randint(2, 4)
password_list = []
password_letters = [random.choice(letters) for _ in range(nr_letters)]
password_symbols = [random.choice(symbols) for _ in range(nr_symbols)]
password_numbers = [random.choice(numbers) for _ in range(nr_numbers)]
password_list = password_letters + password_symbols + password_numbers
random.shuffle(password_list)
password = "".join(password_list)
self.password_input.delete(0,"end") #Clear the password input before inserting
self.password_input.insert(0, password)
pyperclip.copy(password)
def save(self):
website = self.website_input.get()
email = self.email_input.get()
password = self.password_input.get()
new_data = {
website: {
"email": email,
"password": password,
}
}
if len(website) == 0 or len(email) == 0 or len(password) == 0:
messagebox.showinfo(title="Oops", message="Please don't leave any fields empty!")
else:
try:
with open("data.json", "r") as file:
# Reading old data
data = json.load(file)
except FileNotFoundError:
with open("data.json", "w") as file:
# Updating old data with new data
json.dump(new_data, file, indent=4)
else:
data.update(new_data)
with open("data.json", "w") as file:
# Saving updated data
json.dump(data, file, indent=4)
finally:
self.website_input.delete(0, END)
self.email_input.delete(0, END)
self.password_input.delete(0, END)
self.website_input.focus()
def find_password(self):
website = self.website_input.get()
try:
with open("data.json") as file:
data = json.load(file)
except FileNotFoundError:
messagebox.showinfo(title="Error", message="No data file found!")
else:
if website in data:
email = data[website]["email"]
password = data[website]["password"]
messagebox.showinfo(title=website,message=f"Email: {email}\n\nPassword: {password}")
else:
messagebox.showinfo(title="Error", message=f"No details for {website} exists!")
app = loginWindow()
app.mainloop()
常见的方法是在一些持久性存储(这里可能是您的json文件)中设置密码哈希。在密码被验证之前,你应该一直被屏蔽在屏幕上。但是如果您想要最低限度的安全性,那么所有密码(或所有其他数据)都应该加密,并且应该使用用户密码(直接或不直接)来解密它们。还有一些工作…使用类的原因之一是为了摆脱
global
,避免使用它。