Before running the script, install the necessary libraries:=
- pip install cryptography Before running the updated script, install ttkbootstrap for a modern UI theme:-
- pip install cryptography ttkbootstrap
🔑 Start the Program
exmaple code
🔑 Enter your master password: mysecurepassword
(If the password is incorrect, it won’t decrypt stored passwords.)
import tkinter as tk
from tkinter import messagebox, simpledialog
import ttkbootstrap as ttk # Modern themed GUI
import random
import string
import json
import os
from cryptography.fernet import Fernet
import base64
import hashlib
# File to store theme preference
THEME_FILE = "theme_pref.json"
# Generate a secure key from a master password
def generate_key(master_password):
key = hashlib.sha256(master_password.encode()).digest()
return base64.urlsafe_b64encode(key)
# Password Generator
def generate_password(length=16):
characters = string.ascii_letters + string.digits + string.punctuation
return ''.join(random.choice(characters) for _ in range(length))
# Password Manager Class
class PasswordManager:
def __init__(self, master_password, filename="passwords.json"):
self.filename = filename
self.key = generate_key(master_password)
self.cipher = Fernet(self.key)
self.passwords = self.load_passwords()
def load_passwords(self):
if os.path.exists(self.filename):
with open(self.filename, "r") as file:
try:
encrypted_data = file.read().encode()
decrypted_data = self.cipher.decrypt(encrypted_data)
return json.loads(decrypted_data)
except:
messagebox.showerror("Error", "Incorrect master password or corrupted file.")
return {}
return {}
def save_passwords(self):
encrypted_data = self.cipher.encrypt(json.dumps(self.passwords).encode())
with open(self.filename, "w") as file:
file.write(encrypted_data.decode())
def add_password(self, site, username, password):
self.passwords[site] = {"username": username, "password": password}
self.save_passwords()
messagebox.showinfo("Success", f"✅ Password for {site} saved securely!")
def get_password(self, site):
return self.passwords.get(site, None)
def delete_password(self, site):
if site in self.passwords:
del self.passwords[site]
self.save_passwords()
messagebox.showinfo("Success", f"🗑️ Password for {site} deleted securely!")
else:
messagebox.showerror("Error", "No password found for this site.")
# GUI Class
class PasswordManagerGUI:
def __init__(self, root, manager):
self.manager = manager
self.root = root
self.root.title("🔐 Secure Password Manager")
self.root.geometry("450x550")
self.root.resizable(False, False)
# Load saved theme preference
self.current_theme = self.load_theme()
# Frame for UI elements
frame = ttk.Frame(root, padding=10)
frame.pack(expand=True, fill="both")
# Title Label
ttk.Label(frame, text="🔐 Secure Password Manager", font=("Arial", 16, "bold"), bootstyle="primary").pack(pady=10)
# Theme Toggle Button
self.theme_button = ttk.Button(frame, text="🌗 Toggle Theme", bootstyle="secondary", command=self.toggle_theme)
self.theme_button.pack(pady=5)
# Site Entry
ttk.Label(frame, text="🌐 Website:", font=("Arial", 12)).pack(anchor="w")
self.site_entry = ttk.Entry(frame, width=40)
self.site_entry.pack(pady=5)
# Username Entry
ttk.Label(frame, text="👤 Username:", font=("Arial", 12)).pack(anchor="w")
self.username_entry = ttk.Entry(frame, width=40)
self.username_entry.pack(pady=5)
# Password Entry
ttk.Label(frame, text="🔑 Password:", font=("Arial", 12)).pack(anchor="w")
self.password_entry = ttk.Entry(frame, width=40, show="*")
self.password_entry.pack(pady=5)
# Buttons (Enhanced Styling)
button_frame = ttk.Frame(frame)
button_frame.pack(pady=10)
self.generate_button = ttk.Button(button_frame, text="🔄 Generate", bootstyle="success", command=self.generate_new_password)
self.generate_button.grid(row=0, column=0, padx=5)
self.save_button = ttk.Button(button_frame, text="💾 Save", bootstyle="primary", command=self.save_password)
self.save_button.grid(row=0, column=1, padx=5)
self.retrieve_button = ttk.Button(button_frame, text="🔍 Retrieve", bootstyle="warning", command=self.retrieve_password)
self.retrieve_button.grid(row=0, column=2, padx=5)
self.view_all_button = ttk.Button(button_frame, text="📜 View All", bootstyle="info", command=self.view_all_passwords)
self.view_all_button.grid(row=1, column=0, padx=5, pady=5)
self.delete_button = ttk.Button(button_frame, text="🗑 Delete", bootstyle="danger", command=self.delete_password)
self.delete_button.grid(row=1, column=1, padx=5, pady=5)
def generate_new_password(self):
password = generate_password(16)
self.password_entry.delete(0, tk.END)
self.password_entry.insert(0, password)
def save_password(self):
site = self.site_entry.get()
username = self.username_entry.get()
password = self.password_entry.get()
if site and username and password:
self.manager.add_password(site, username, password)
self.clear_entries()
else:
messagebox.showerror("Error", "Please fill all fields!")
def retrieve_password(self):
site = self.site_entry.get()
if site:
result = self.manager.get_password(site)
if result:
messagebox.showinfo("Retrieved Password", f"📌 Site: {site}\n👤 Username: {result['username']}\n🔑 Password: {result['password']}")
else:
messagebox.showerror("Error", "No password found for this site.")
else:
messagebox.showerror("Error", "Please enter a site name!")
def view_all_passwords(self):
passwords = self.manager.passwords
if passwords:
all_data = "\n".join([f"📌 {site}: {data['username']} | {data['password']}" for site, data in passwords.items()])
messagebox.showinfo("Saved Passwords", all_data)
else:
messagebox.showinfo("Info", "No passwords saved yet!")
def delete_password(self):
site = self.site_entry.get()
if site:
self.manager.delete_password(site)
else:
messagebox.showerror("Error", "Please enter a site name!")
def clear_entries(self):
self.site_entry.delete(0, tk.END)
self.username_entry.delete(0, tk.END)
self.password_entry.delete(0, tk.END)
# Load theme preference
def load_theme(self):
if os.path.exists(THEME_FILE):
with open(THEME_FILE, "r") as file:
return json.load(file).get("theme", "darkly")
return "darkly"
# Save theme preference
def save_theme(self):
with open(THEME_FILE, "w") as file:
json.dump({"theme": self.current_theme}, file)
# Toggle between light and dark mode
def toggle_theme(self):
self.current_theme = "litera" if self.current_theme == "darkly" else "darkly"
self.save_theme()
self.root.destroy()
main(self.current_theme)
# Run the GUI
def main(theme="darkly"):
master_password = simpledialog.askstring("🔑 Master Password", "Enter your master password:", show="*")
if master_password:
manager = PasswordManager(master_password)
root = ttk.Window(themename=theme) # Apply selected theme
app = PasswordManagerGUI(root, manager)
root.mainloop()
else:
messagebox.showerror("Error", "Master password is required!")
if __name__ == "__main__":
main()