如何用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
廣告