如何用Python构建密码管理器



这个密码管理器应用程序将通过以组织的方式加密密码来实现密码的存储和保护。

这个密码管理器是用Python创建的,用户界面是用Tkinter创建的,同时使用**cryptography**库确保密码安全。应用程序的一个特性是借助强大的加密技术安全地保存和显示密码。

安装

首先按照以下安装步骤操作:

1. 安装Python

确保您已安装Python 3.11或更高版本。下载并安装它。阅读更多内容 - Python环境搭建

2. 安装所需的库

打开终端或命令提示符,并使用pip安装库:

pip install cryptography

密码管理器组件说明

密码管理器应用程序包含几个关键组件:密码管理器应用程序包含几个关键组件:

1. 密钥生成和管理

最后一个是**generate_key()**函数,它会生成一个新的加密密钥。

此函数**load_key()**作为默认函数,如果可用,则从文件中加载现有密钥,否则创建一个新密钥。

2. 加密和解密

密码使用Fernet加密算法进行加密,这是由**encrypt_message()**函数完成的,而解密是在呈现之前使用**decrypt_message()**函数完成的。

3. 保存密码

**save_password()**函数从用户那里获取服务、用户名和密码的字符串输入,然后在将其放入JSON文件之前对其进行加密。它处理文件操作并修改已存在的数据。

4. 查看密码

**view_passwords()**函数从JSON文件中读取加密的密码,然后对其进行解密,并将其显示给用户。

5. 图形用户界面 (GUI)

Tkinter库用于实现一个基本的用户界面,其中包含用于服务、用户名和密码的输入小部件以及用于保存和显示密码的按钮。

**阅读更多**:Python GUI编程

构建密码管理器的Python代码

import tkinter as tk
from tkinter import messagebox
from cryptography.fernet import Fernet
import os
import json

# Key generation and encryption setup
def generate_key():
   return Fernet.generate_key()

def load_key():
   if os.path.exists("secret.key"):
      with open("secret.key", "rb") as key_file:
         return key_file.read()
   else:
      key = generate_key()
      with open("secret.key", "wb") as key_file:
         key_file.write(key)
      return key

def encrypt_message(message, key):
   f = Fernet(key)
   encrypted_message = f.encrypt(message.encode())
   return encrypted_message

def decrypt_message(encrypted_message, key):
   f = Fernet(key)
   decrypted_message = f.decrypt(encrypted_message).decode()
   return decrypted_message

# Initialize the key
key = load_key()

# Application functions
def save_password():
   service = service_entry.get()
   username = username_entry.get()
   password = password_entry.get()

   if not service or not username or not password:
      messagebox.showwarning("Input Error", "Please fill all fields.")
      return

   encrypted_password = encrypt_message(password, key)
   new_data = {service: {"username": username, "password": encrypted_password}}

   if os.path.exists("passwords.json"):
      with open("passwords.json", "r") as file:
         try:
            existing_data = json.load(file)
         except (json.JSONDecodeError, TypeError):
            existing_data = {}
      existing_data.update(new_data)
   else:
      existing_data = new_data

   # Ensure all values in existing_data are serializable
   for service, info in existing_data.items():
      if isinstance(info.get("password"), bytes):
         info["password"] = info["password"].decode()  # Convert bytes to string for serialization

   with open("passwords.json", "w") as file:
      try:
         json.dump(existing_data, file, indent=4)
      except TypeError as e:
         messagebox.showerror("Serialization Error", f"Error serializing data: {e}")

   service_entry.delete(0, tk.END)
   username_entry.delete(0, tk.END)
   password_entry.delete(0, tk.END)
   messagebox.showinfo("Success", "Password saved successfully!")

def view_passwords():
   if os.path.exists("passwords.json"):
      with open("passwords.json", "r") as file:
         try:
            data = json.load(file)
         except json.JSONDecodeError:
            data = {}

   result = ""
   if data:
      for service, info in data.items():
         username = info.get("username", "N/A")
         password = info.get("password", b"")
         decrypted_password = decrypt_message(password.encode(), key)
            result += f"Service: {service}\nUsername: {username}\nPassword: {decrypted_password}\n\n"
   else:
      result = "No passwords stored yet."

      messagebox.showinfo("Stored Passwords", result)
   else:
      messagebox.showinfo("No Data", "No passwords stored yet.")

# GUI setup
root = tk.Tk()
root.title("Password Manager")

tk.Label(root, text="Service").grid(row=0, column=0, padx=10, pady=10)
tk.Label(root, text="Username").grid(row=1, column=0, padx=10, pady=10)
tk.Label(root, text="Password").grid(row=2, column=0, padx=10, pady=10)

service_entry = tk.Entry(root, width=50)
service_entry.grid(row=0, column=1, padx=10, pady=10)

username_entry = tk.Entry(root, width=50)
username_entry.grid(row=1, column=1, padx=10, pady=10)

password_entry = tk.Entry(root, width=50, show="*")
password_entry.grid(row=2, column=1, padx=10, pady=10)

tk.Button(root, text="Save Password", command=save_password).grid(row=3, column=0, columnspan=2, pady=10)
tk.Button(root, text="View Passwords", command=view_passwords).grid(row=4, column=0, columnspan=2, pady=10)

root.mainloop()

输出

首先,您必须输入您的服务、用户名和密码。

Password Manager

然后,您必须单击保存按钮进行保存:

Password Manager

之后,您可以查看您保存的密码:

Password Manager

您可以再次创建密码、用户名和服务:

Password Manager

保存密码后,单击“查看密码”,您将看到之前创建的两个用户名:

Password Manager

所有密码都将保存在JSON文件中:

Password Manager

结论

这个用Python创建的密码管理器可以作为处理密码安全问题的有用工具。使用简单的加密和友好的图形用户界面,它只允许授权用户访问,同时保持数据安全。从安装说明和源代码可以看出,用户可以运行自己的密码管理器并提高他们的在线安全性。

python_projects_from_basic_to_advanced.htm
广告