使用Python完成:密码管理工具 1.文件操作:打开、保存密码库; 2.密码库中所有密码数据对称加密后存储(AES),密码库打开时提示输入密码,输入正确密码才能打开(同时对加密的数据进行解密); 3.密码库中保存的每一条数据包括多个部分,例如名称、URL、Email、文本、银行帐号、电话手机等各种号码、用户名以及密码等; 4.每条数据有不同的类型,例如登录账号、银行卡、文本、地址等,不同的类型有不同的数据内容需要填写; 根据密码生成设定,例如长度、是否包含大小写字母/数字/符号、至少包含一个大写字母、至少包含一个特殊符号等,生成密码; 5.快速查找:可以根据名称、登录名、URL、说明等进行查找。 6.使用简单的图形界面
时间: 2023-12-08 16:05:22 浏览: 116
好的,我可以给你提供一个基本的代码框架,但是需要注意的是,这个代码并不是一个完整的、可运行的实现,还需要你进行完善和调试。
首先,需要安装 cryptography 模块:
```python
pip install cryptography
```
然后,使用以下代码实现密码管理工具:
```python
from tkinter import *
from tkinter import messagebox
from cryptography.fernet import Fernet
# 初始化加密器
def init_cipher(key):
cipher = Fernet(key)
return cipher
# 加密数据
def encrypt_data(data, cipher):
data_bytes = bytes(str(data), encoding='utf-8')
encrypted_data = cipher.encrypt(data_bytes)
return encrypted_data
# 解密数据
def decrypt_data(data, cipher):
decrypted_data = cipher.decrypt(data)
return decrypted_data.decode('utf-8')
# 保存密码库
def save_passwords(passwords, key):
cipher = init_cipher(key)
encrypted_passwords = {}
for k, v in passwords.items():
encrypted_passwords[k] = encrypt_data(v, cipher)
with open('passwords.dat', 'wb') as f:
f.write(str(key).encode('utf-8'))
f.write(b'\n')
f.write(str(encrypted_passwords).encode('utf-8'))
# 打开密码库
def open_passwords(key):
cipher = init_cipher(key)
with open('passwords.dat', 'rb') as f:
saved_key = f.readline().decode('utf-8').strip()
if saved_key != str(key):
messagebox.showerror('Error', 'Incorrect password.')
return None
data = f.readline().decode('utf-8').strip()
passwords = eval(data)
decrypted_passwords = {}
for k, v in passwords.items():
decrypted_passwords[k] = decrypt_data(v, cipher)
return decrypted_passwords
# 生成密码
def generate_password(length, uppercase, lowercase, digits, symbols):
import string
import random
chars = []
if uppercase:
chars += list(string.ascii_uppercase)
if lowercase:
chars += list(string.ascii_lowercase)
if digits:
chars += list(string.digits)
if symbols:
chars += list(string.punctuation)
random.shuffle(chars)
password = ''.join(chars[:length])
return password
# GUI界面
class PasswordManagerGUI:
def __init__(self, master):
self.master = master
self.master.title('Password Manager')
self.master.geometry('400x300')
self.passwords = {}
self.key = None
self.init_gui()
# 初始化GUI界面
def init_gui(self):
# 密码输入框
self.password_label = Label(self.master, text='Password:')
self.password_label.grid(row=0, column=0)
self.password_entry = Entry(self.master, show='*')
self.password_entry.grid(row=0, column=1)
# 打开密码库按钮
self.open_button = Button(self.master, text='Open', command=self.open_passwords)
self.open_button.grid(row=1, column=0)
# 保存密码库按钮
self.save_button = Button(self.master, text='Save', command=self.save_passwords)
self.save_button.grid(row=1, column=1)
# 数据类型选择框
self.type_label = Label(self.master, text='Type:')
self.type_label.grid(row=2, column=0)
self.type_var = StringVar()
self.type_var.set('Login')
self.type_option = OptionMenu(self.master, self.type_var, 'Login', 'Bank Card', 'Text', 'Address')
self.type_option.grid(row=2, column=1)
# 名称输入框
self.name_label = Label(self.master, text='Name:')
self.name_label.grid(row=3, column=0)
self.name_entry = Entry(self.master)
self.name_entry.grid(row=3, column=1)
# URL输入框
self.url_label = Label(self.master, text='URL:')
self.url_label.grid(row=4, column=0)
self.url_entry = Entry(self.master)
self.url_entry.grid(row=4, column=1)
# Email输入框
self.email_label = Label(self.master, text='Email:')
self.email_label.grid(row=5, column=0)
self.email_entry = Entry(self.master)
self.email_entry.grid(row=5, column=1)
# 文本输入框
self.text_label = Label(self.master, text='Text:')
self.text_label.grid(row=6, column=0)
self.text_entry = Entry(self.master)
self.text_entry.grid(row=6, column=1)
# 银行账号输入框
self.bank_account_label = Label(self.master, text='Bank Account:')
self.bank_account_label.grid(row=7, column=0)
self.bank_account_entry = Entry(self.master)
self.bank_account_entry.grid(row=7, column=1)
# 电话号码输入框
self.phone_label = Label(self.master, text='Phone:')
self.phone_label.grid(row=8, column=0)
self.phone_entry = Entry(self.master)
self.phone_entry.grid(row=8, column=1)
# 用户名输入框
self.username_label = Label(self.master, text='Username:')
self.username_label.grid(row=9, column=0)
self.username_entry = Entry(self.master)
self.username_entry.grid(row=9, column=1)
# 密码输入框
self.password_label = Label(self.master, text='Password:')
self.password_label.grid(row=10, column=0)
self.password_entry = Entry(self.master)
self.password_entry.grid(row=10, column=1)
# 生成密码按钮
self.generate_button = Button(self.master, text='Generate Password', command=self.generate_password)
self.generate_button.grid(row=11, column=0)
# 查找输入框
self.search_label = Label(self.master, text='Search:')
self.search_label.grid(row=12, column=0)
self.search_entry = Entry(self.master)
self.search_entry.grid(row=12, column=1)
# 查找按钮
self.search_button = Button(self.master, text='Search', command=self.search_passwords)
self.search_button.grid(row=13, column=0)
# 数据列表
self.scrollbar = Scrollbar(self.master)
self.scrollbar.grid(row=14, column=2, sticky='NS')
self.data_listbox = Listbox(self.master, yscrollcommand=self.scrollbar.set)
self.data_listbox.grid(row=14, column=0, columnspan=2)
self.scrollbar.config(command=self.data_listbox.yview)
# 数据详细信息
self.detail_label = Label(self.master, text='Detail:')
self.detail_label.grid(row=15, column=0)
self.detail_text = Text(self.master, height=5)
self.detail_text.grid(row=16, column=0, columnspan=2)
# 打开密码库
def open_passwords(self):
self.key = self.password_entry.get()
if not self.key:
messagebox.showerror('Error', 'Please input password.')
return
saved_passwords = open_passwords(self.key)
if saved_passwords:
self.passwords = saved_passwords
self.show_passwords()
# 保存密码库
def save_passwords(self):
self.key = self.password_entry.get()
if not self.key:
messagebox.showerror('Error', 'Please input password.')
return
self.get_password_data()
save_passwords(self.passwords, self.key)
# 生成密码
def generate_password(self):
length = 12
uppercase = True
lowercase = True
digits = True
symbols = True
password = generate_password(length, uppercase, lowercase, digits, symbols)
self.password_entry.delete(0, END)
self.password_entry.insert(0, password)
# 查找密码
def search_passwords(self):
keyword = self.search_entry.get()
self.data_listbox.delete(0, END)
for k, v in self.passwords.items():
if keyword in k or keyword in v:
self.data_listbox.insert(END, k)
# 显示密码列表
def show_passwords(self):
self.data_listbox.delete(0, END)
for k, v in self.passwords.items():
self.data_listbox.insert(END, k)
# 获取数据详细信息
def get_detail(self, name):
data = self.passwords.get(name, '')
self.detail_text.delete('1.0', END)
self.detail_text.insert(END, data)
# 获取添加/修改数据
def get_password_data(self):
password_data = {}
password_data['Type'] = self.type_var.get()
password_data['Name'] = self.name_entry.get()
password_data['URL'] = self.url_entry.get()
password_data['Email'] = self.email_entry.get()
password_data['Text'] = self.text_entry.get()
password_data['Bank Account'] = self.bank_account_entry.get()
password_data['Phone'] = self.phone_entry.get()
password_data['Username'] = self.username_entry.get()
password_data['Password'] = self.password_entry.get()
name = password_data['Name']
if not name:
messagebox.showerror('Error', 'Please input name.')
return
if name in self.passwords:
result = messagebox.askyesno('Warning', 'Are you sure to overwrite the existing data?')
if not result:
return
self.passwords[name] = password_data
self.show_passwords()
# 主函数
if __name__ == '__main__':
root = Tk()
app = PasswordManagerGUI(root)
root.mainloop()
```
需要注意的是,这个代码还需要进行完善和调试,例如添加数据的验证和删除数据的实现等。
希望这个代码可以对你有所帮助!
阅读全文
相关推荐
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)