使用Python完成,并给出详细代码:密码管理工具 1.文件操作:打开、保存密码库; 2.密码库中所有密码数据对称加密后存储(AES),密码库打开时提示输入密码,输入正确密码才能打开(同时对加密的数据进行解密); 3.密码库中保存的每一条数据包括多个部分,例如名称、URL、Email、文本、银行帐号、电话手机等各种号码、用户名以及密码等; 4.每条数据有不同的类型,例如登录账号、银行卡、文本、地址等,不同的类型有不同的数据内容需要填写; 根据密码生成设定,例如长度、是否包含大小写字母/数字/符号、至少包含一个大写字母、至少包含一个特殊符号等,生成密码; 5.快速查找:可以根据名称、登录名、URL、说明等进行查找。 6.使用简单的图形界面
时间: 2023-12-15 11:04:42 浏览: 191
好的,以下是一个基于Python实现的密码管理工具,包含了文件操作、密码加密、数据存储、密码生成、快速查找和图形界面等功能。代码中使用了PyCryptodome、tkinter和pickle等库。
```python
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import tkinter as tk
from tkinter import filedialog, messagebox
import pickle
# 定义密码条目类
class PasswordEntry:
def __init__(self, name, url, email, text, bank_account, phone, username, password, entry_type):
self.name = name
self.url = url
self.email = email
self.text = text
self.bank_account = bank_account
self.phone = phone
self.username = username
self.password = password
self.entry_type = entry_type
# 定义密码库类
class PasswordDatabase:
def __init__(self):
self.entries = []
# 添加密码条目
def add_entry(self, entry):
self.entries.append(entry)
# 删除密码条目
def delete_entry(self, entry):
self.entries.remove(entry)
# 查找密码条目
def find_entry(self, keyword):
results = []
for entry in self.entries:
if keyword in entry.name or keyword in entry.url or keyword in entry.text or keyword in entry.username:
results.append(entry)
return results
# 生成密码
def generate_password(self, length=12, upper=True, lower=True, digit=True, special=True):
import string
import random
chars = ""
if upper:
chars += string.ascii_uppercase
if lower:
chars += string.ascii_lowercase
if digit:
chars += string.digits
if special:
chars += string.punctuation
return ''.join(random.choice(chars) for _ in range(length))
# 加密密码库
def encrypt(self, password):
key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(pickle.dumps(self.entries))
return key, cipher.nonce, tag, ciphertext
# 解密密码库
def decrypt(self, key, nonce, tag, ciphertext):
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
plaintext = pickle.loads(cipher.decrypt_and_verify(ciphertext, tag))
self.entries = plaintext
# 定义密码管理工具类
class PasswordManager:
def __init__(self):
self.password_db = None
self.key = None
self.nonce = None
self.tag = None
self.ciphertext = None
# 创建新的密码库
def new_password_db(self):
self.password_db = PasswordDatabase()
# 打开密码库
def open_password_db(self):
filename = filedialog.askopenfilename(filetypes=[('Password Database', '*.pdb')])
if filename:
with open(filename, 'rb') as f:
self.key, self.nonce, self.tag, self.ciphertext = pickle.load(f)
# 保存密码库
def save_password_db(self):
if not self.password_db:
messagebox.showerror('Error', 'No password database opened')
return
filename = filedialog.asksaveasfilename(defaultextension='.pdb', filetypes=[('Password Database', '*.pdb')])
if filename:
with open(filename, 'wb') as f:
pickle.dump((self.key, self.nonce, self.tag, self.ciphertext), f)
# 解密密码库
def decrypt_password_db(self, password):
cipher = AES.new(password.encode(), AES.MODE_EAX, nonce=self.nonce)
plaintext = pickle.loads(cipher.decrypt_and_verify(self.ciphertext, self.tag))
self.password_db = plaintext
# 加密密码库
def encrypt_password_db(self, password):
self.key = get_random_bytes(16)
cipher = AES.new(password.encode(), AES.MODE_EAX)
self.nonce = cipher.nonce
self.tag = cipher.digest()
self.ciphertext = cipher.encrypt(pickle.dumps(self.password_db.entries))
# 添加密码条目
def add_password_entry(self, name, url, email, text, bank_account, phone, username, password, entry_type):
entry = PasswordEntry(name, url, email, text, bank_account, phone, username, password, entry_type)
self.password_db.add_entry(entry)
# 删除密码条目
def delete_password_entry(self, entry):
self.password_db.delete_entry(entry)
# 查找密码条目
def find_password_entry(self, keyword):
return self.password_db.find_entry(keyword)
# 生成密码
def generate_password(self, length=12, upper=True, lower=True, digit=True, special=True):
return self.password_db.generate_password(length, upper, lower, digit, special)
# 定义图形界面类
class PasswordManagerGUI:
def __init__(self):
self.password_manager = PasswordManager()
self.window = tk.Tk()
self.window.title('Password Manager')
self.window.geometry('800x600')
# 密码库操作面板
db_panel = tk.Frame(self.window)
db_panel.pack(side='left', fill='y')
new_db_button = tk.Button(db_panel, text='New', command=self.new_db)
new_db_button.pack(fill='x')
open_db_button = tk.Button(db_panel, text='Open', command=self.open_db)
open_db_button.pack(fill='x')
save_db_button = tk.Button(db_panel, text='Save', command=self.save_db)
save_db_button.pack(fill='x')
# 密码条目操作面板
entry_panel = tk.Frame(self.window)
entry_panel.pack(side='right', fill='y')
add_entry_button = tk.Button(entry_panel, text='Add', command=self.add_entry)
add_entry_button.pack(fill='x')
delete_entry_button = tk.Button(entry_panel, text='Delete', command=self.delete_entry)
delete_entry_button.pack(fill='x')
find_entry_button = tk.Button(entry_panel, text='Find', command=self.find_entry)
find_entry_button.pack(fill='x')
# 密码条目列表
entry_list_panel = tk.Frame(self.window)
entry_list_panel.pack(side='top', fill='both', expand=True)
self.entry_list = tk.Listbox(entry_list_panel, selectmode='single')
self.entry_list.pack(side='left', fill='both', expand=True)
self.entry_list.bind('<<ListboxSelect>>', self.update_entry_fields)
# 密码条目详细信息
entry_detail_panel = tk.Frame(self.window)
entry_detail_panel.pack(side='bottom', fill='both', expand=True)
tk.Label(entry_detail_panel, text='Name:').grid(row=0, column=0)
self.name_entry = tk.Entry(entry_detail_panel)
self.name_entry.grid(row=0, column=1)
tk.Label(entry_detail_panel, text='URL:').grid(row=1, column=0)
self.url_entry = tk.Entry(entry_detail_panel)
self.url_entry.grid(row=1, column=1)
tk.Label(entry_detail_panel, text='Email:').grid(row=2, column=0)
self.email_entry = tk.Entry(entry_detail_panel)
self.email_entry.grid(row=2, column=1)
tk.Label(entry_detail_panel, text='Text:').grid(row=3, column=0)
self.text_entry = tk.Entry(entry_detail_panel)
self.text_entry.grid(row=3, column=1)
tk.Label(entry_detail_panel, text='Bank Account:').grid(row=4, column=0)
self.bank_account_entry = tk.Entry(entry_detail_panel)
self.bank_account_entry.grid(row=4, column=1)
tk.Label(entry_detail_panel, text='Phone:').grid(row=5, column=0)
self.phone_entry = tk.Entry(entry_detail_panel)
self.phone_entry.grid(row=5, column=1)
tk.Label(entry_detail_panel, text='Username:').grid(row=6, column=0)
self.username_entry = tk.Entry(entry_detail_panel)
self.username_entry.grid(row=6, column=1)
tk.Label(entry_detail_panel, text='Password:').grid(row=7, column=0)
self.password_entry = tk.Entry(entry_detail_panel, show='*')
self.password_entry.grid(row=7, column=1)
tk.Label(entry_detail_panel, text='Type:').grid(row=8, column=0)
self.type_entry = tk.Entry(entry_detail_panel)
self.type_entry.grid(row=8, column=1)
# 密码生成面板
password_gen_panel = tk.Frame(self.window)
password_gen_panel.pack(side='bottom', fill='x')
password_length_label = tk.Label(password_gen_panel, text='Length:')
password_length_label.pack(side='left', padx=5)
self.password_length_entry = tk.Entry(password_gen_panel, width=5)
self.password_length_entry.pack(side='left')
self.password_length_entry.insert(0, '12')
uppercase_checkbox = tk.Checkbutton(password_gen_panel, text='Uppercase')
uppercase_checkbox.pack(side='left', padx=5)
lowercase_checkbox = tk.Checkbutton(password_gen_panel, text='Lowercase')
lowercase_checkbox.pack(side='left', padx=5)
digit_checkbox = tk.Checkbutton(password_gen_panel, text='Digit')
digit_checkbox.pack(side='left', padx=5)
special_checkbox = tk.Checkbutton(password_gen_panel, text='Special')
special_checkbox.pack(side='left', padx=5)
generate_password_button = tk.Button(password_gen_panel, text='Generate', command=self.generate_password)
generate_password_button.pack(side='left', padx=5)
# 创建新的密码库
def new_db(self):
self.password_manager.new_password_db()
self.entry_list.delete(0, tk.END)
# 打开密码库
def open_db(self):
self.password_manager.open_password_db()
password = messagebox.askstring('Password', 'Enter password:', show='*')
if password:
try:
self.password_manager.decrypt_password_db(password)
self.update_entry_list()
except:
messagebox.showerror('Error', 'Invalid password')
# 保存密码库
def save_db(self):
if self.password_manager.password_db:
password = messagebox.askstring('Password', 'Enter password:', show='*')
if password:
self.password_manager.encrypt_password_db(password)
self.password_manager.save_password_db()
# 添加密码条目
def add_entry(self):
name = self.name_entry.get()
url = self.url_entry.get()
email = self.email_entry.get()
text = self.text_entry.get()
bank_account = self.bank_account_entry.get()
phone = self.phone_entry.get()
username = self.username_entry.get()
password = self.password_entry.get()
entry_type = self.type_entry.get()
if name and password:
self.password_manager.add_password_entry(name, url, email, text, bank_account, phone, username, password, entry_type)
self.update_entry_list()
# 删除密码条目
def delete_entry(self):
selected_index = self.entry_list.curselection()
if selected_index:
selected_entry = self.entry_list.get(selected_index[0])
for entry in self.password_manager.password_db.entries:
if entry.name == selected_entry:
self.password_manager.delete_password_entry(entry)
self.update_entry_list()
break
# 查找密码条目
def find_entry(self):
keyword = messagebox.askstring('Find', 'Enter keyword:')
if keyword:
results = self.password_manager.find_password_entry(keyword)
if
阅读全文