import sqlite3
import tkinter as tk
from tkinter import messagebox
from cryptography.fernet import Fernet
import random
import string
import os
# Generate and save encryption key
KEY_FILE = "key.key"
def generate_key():
if not os.path.exists(KEY_FILE):
key = Fernet.generate_key()
with open(KEY_FILE, "wb") as key_file:
key_file.write(key)
def load_key():
with open(KEY_FILE, "rb") as key_file:
return key_file.read()
generate_key()
key = load_key()
cipher = Fernet(key)
# Database Setup
conn = sqlite3.connect("passwords.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS passwords (
id INTEGER PRIMARY KEY,
website TEXT,
username TEXT,
password TEXT
)
""")
conn.commit()
# Function to encrypt password
def encrypt_password(password):
return cipher.encrypt(password.encode()).decode()
# Function to decrypt password
def decrypt_password(encrypted_password):
return cipher.decrypt(encrypted_password.encode()).decode()
# Function to generate a random password
def generate_password():
characters = string.ascii_letters + string.digits + string.punctuation
return ''.join(random.choice(characters) for _ in range(12))
# Function to save credentials
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)
cursor.execute("INSERT INTO passwords (website, username, password) VALUES (?, ?, ?)",
(website, username, encrypted_password))
conn.commit()
messagebox.showinfo("Success", "Password saved successfully!")
website_entry.delete(0, tk.END)
username_entry.delete(0, tk.END)
password_entry.delete(0, tk.END)
# Function to retrieve passwords
def retrieve_passwords():
cursor.execute("SELECT website, username, password FROM passwords")
records = cursor.fetchall()
result_text.delete(1.0, tk.END)
for record in records:
website, username, encrypted_password = record
decrypted_password = decrypt_password(encrypted_password)
result_text.insert(tk.END, f"Website: {website}\nUsername: {username}\nPassword: {decrypted_password}\n\n")
# Function to generate a random password
def fill_generated_password():
password_entry.delete(0, tk.END)
password_entry.insert(0, generate_password())
# GUI Setup
root = tk.Tk()
root.title("Password Manager")
root.geometry("400x500")
tk.Label(root, text="Website:").pack()
website_entry = tk.Entry(root, width=40)
website_entry.pack()
tk.Label(root, text="Username:").pack()
username_entry = tk.Entry(root, width=40)
username_entry.pack()
tk.Label(root, text="Password:").pack()
password_entry = tk.Entry(root, width=40, show="*")
password_entry.pack()
tk.Button(root, text="Generate Password", command=fill_generated_password).pack(pady=5)
tk.Button(root, text="Save Password", command=save_password).pack(pady=5)
tk.Button(root, text="Retrieve Passwords", command=retrieve_passwords).pack(pady=5)
result_text = tk.Text(root, height=10, width=45)
result_text.pack()
root.mainloop()
No comments:
Post a Comment