Password Manager with Encryption using Python Tkinter | Save & Decrypt Passwords Securely
Demo :
Click Video πππ
π Post Features to Add:
-
π Folder Structure
-
π§ Features List
-
π‘ How it Works
-
π§ Setup Instructions
-
πΌ Screenshots (App UI Preview)
-
▶ Embedded YouTube Shorts (Both)
-
π₯ Download Source Code Button
-
π GitHub / External Hosting if available
-
π§© Tags and SEO meta for discoverability
Code :
import tkinter as tk
from tkinter import messagebox, ttk
import sqlite3
from cryptography.fernet import Fernet, InvalidToken
import pyperclip
import os
# π Key Load/Save
def load_or_create_key():
if os.path.exists("key.key"):
with open("key.key", "rb") as file:
return file.read()
else:
key = Fernet.generate_key()
with open("key.key", "wb") as file:
file.write(key)
return key
KEY = load_or_create_key()
cipher = Fernet(KEY)
def encrypt_password(password):
return cipher.encrypt(password.encode()).decode()
def decrypt_password(encrypted_password):
try:
return cipher.decrypt(encrypted_password.encode()).decode()
except InvalidToken:
return "❌ Invalid or corrupted password"
# π DB Setup
def setup_db():
conn = sqlite3.connect("passwords.db")
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS passwords (
id INTEGER PRIMARY KEY AUTOINCREMENT,
website TEXT,
username TEXT,
password TEXT)''')
conn.commit()
conn.close()
setup_db()
# π Save Password
def save_password():
website = website_entry.get()
username = username_entry.get()
password = password_entry.get()
if not website or not username or not password:
messagebox.showerror("Error", "All fields are required!")
return
encrypted_password = encrypt_password(password)
conn = sqlite3.connect("passwords.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO passwords (website, username, password) VALUES (?, ?, ?)",
(website, username, encrypted_password))
conn.commit()
conn.close()
messagebox.showinfo("Success", "Password saved successfully! ✅")
website_entry.delete(0, tk.END)
username_entry.delete(0, tk.END)
password_entry.delete(0, tk.END)
load_passwords()
# π Load Entries
def load_passwords():
tree.delete(*tree.get_children())
conn = sqlite3.connect("passwords.db")
cursor = conn.cursor()
cursor.execute("SELECT id, website, username, password FROM passwords")
records = cursor.fetchall()
conn.close()
for record in records:
tree.insert("", tk.END, values=(record[0], record[1], record[2], "●●●●●", record[3])) # 5th column = real encrypted password (hidden)
# π View Password
def view_password():
selected_item = tree.selection()
if not selected_item:
messagebox.showerror("Error", "Please select an entry")
return
item = tree.item(selected_item)
encrypted_password = item['values'][4] # hidden encrypted password
decrypted_password = decrypt_password(encrypted_password)
if decrypted_password == "❌ Invalid or corrupted password":
messagebox.showerror("Error", "This password cannot be decrypted!")
else:
messagebox.showinfo("Decrypted Password", f"Password: {decrypted_password}")
pyperclip.copy(decrypted_password)
# π Delete Entry
def delete_password():
selected_item = tree.selection()
if not selected_item:
messagebox.showerror("Error", "Please select an entry")
return
item = tree.item(selected_item)
id_to_delete = item['values'][0]
conn = sqlite3.connect("passwords.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM passwords WHERE id = ?", (id_to_delete,))
conn.commit()
conn.close()
load_passwords()
messagebox.showinfo("Success", "Password deleted successfully! ✅")
# π¨ GUI
root = tk.Tk()
root.title("π Password Manager")
root.geometry("500x500")
root.configure(bg="#222")
style = ttk.Style()
style.configure("TButton", padding=6, font=("Arial", 12), background="#444", foreground="white")
style.configure("Treeview", background="#333", foreground="white", rowheight=25)
frame = tk.Frame(root, bg="#222")
frame.pack(pady=20)
tk.Label(frame, text="π Website:", fg="white", bg="#222").grid(row=0, column=0, padx=5, pady=5)
website_entry = tk.Entry(frame, width=30)
website_entry.grid(row=0, column=1, padx=5, pady=5)
tk.Label(frame, text="π€ Username:", fg="white", bg="#222").grid(row=1, column=0, padx=5, pady=5)
username_entry = tk.Entry(frame, width=30)
username_entry.grid(row=1, column=1, padx=5, pady=5)
tk.Label(frame, text="π Password:", fg="white", bg="#222").grid(row=2, column=0, padx=5, pady=5)
password_entry = tk.Entry(frame, width=30, show="*")
password_entry.grid(row=2, column=1, padx=5, pady=5)
save_button = ttk.Button(root, text="πΎ Save Password", command=save_password)
save_button.pack(pady=5)
# Treeview setup (extra column for encrypted password, but not shown)
columns = ("ID", "Website", "Username", "Password", "Encrypted")
tree = ttk.Treeview(root, columns=columns, show="headings")
tree.heading("ID", text="ID")
tree.heading("Website", text="Website")
tree.heading("Username", text="Username")
tree.heading("Password", text="Password")
tree.heading("Encrypted", text="Encrypted") # hidden
tree.column("Encrypted", width=0, stretch=False) # Hide this column
tree.pack(pady=10)
view_button = ttk.Button(root, text="π View Password", command=view_password)
view_button.pack(pady=5)
delete_button = ttk.Button(root, text="π Delete Entry", command=delete_password)
delete_button.pack(pady=5)
load_passwords()
root.mainloop()
π Build your own Secure Password Manager using Python and Tkinter with full encryption support.
This beginner-friendly app lets you save, encrypt, decrypt, and manage all your passwords with ease.
Perfect for Python learners, mini-project creators, and those looking for real-world GUI projects.
π¨π» Developed by Fuzzu Developer | Modern UI + Security π
Comments
Post a Comment