w3resource

Create a Secure Password Manager Project in Python: Two Approaches


Password Manager:

Develop a password manager that stores and retrieves passwords securely.

Input values:
Add, edit, delete, or retrieve passwords stored in the password manager.

Output value:
Feedback based on user actions, such as success messages or retrieving passwords.

Example:

Input values:
1. Add Password
2. Retrieve Password
3. Edit Password
4. Delete Password
5. Exit
Select an option: 1
Input website/app name: example.com
Input user ID: user_111
Input password: Oui*%#$ki
Output value:
Password added successfully.
Input values:
1. Add Password
2. Retrieve Password
3. Edit Password
4. Delete Password
5. Exit
Select an option: 2
Input website/app name: example.com
Input user ID: user_111
Output value:
Retrieved Password: Oui*%#$ki

Here are two different solutions for a password manager in Python. This program will allow users to add, edit, delete, and retrieve passwords securely.

Solution 1: Basic Approach using a Dictionary and 'getpass' for Secure Input

Code:

# Solution 1: Basic Approach Using a Dictionary and `getpass` for Secure Input

import getpass  # Import getpass to securely handle password input

# Dictionary to store passwords in the format: {(website, user_id): password}
password_storage = {}

def add_password(website, user_id, password):
    """Add a password to the storage."""
    key = (website, user_id)
    password_storage[key] = password
    print("Password added successfully.")

def retrieve_password(website, user_id):
    """Retrieve a password from the storage."""
    key = (website, user_id)
    if key in password_storage:
        print(f"Retrieved Password: {password_storage[key]}")
    else:
        print("No password found for the given website and user ID.")

def edit_password(website, user_id, new_password):
    """Edit an existing password in the storage."""
    key = (website, user_id)
    if key in password_storage:
        password_storage[key] = new_password
        print("Password updated successfully.")
    else:
        print("No password found to update.")

def delete_password(website, user_id):
    """Delete a password from the storage."""
    key = (website, user_id)
    if key in password_storage:
        del password_storage[key]
        print("Password deleted successfully.")
    else:
        print("No password found to delete.")

def main():
    """Main function to interact with the user."""
    print("Welcome to the Password Manager!")

    while True:
        # Display the menu
        print("\n1. Add Password")
        print("2. Retrieve Password")
        print("3. Edit Password")
        print("4. Delete Password")
        print("5. Exit")

        # Get user choice
        choice = input("Select an option: ")

        if choice == '1':
            # Add Password
            website = input("Input website/app name: ")
            user_id = input("Input user ID: ")
            password = getpass.getpass("Input password: ")  # Securely input password
            add_password(website, user_id, password)

        elif choice == '2':
            # Retrieve Password
            website = input("Input website/app name: ")
            user_id = input("Input user ID: ")
            retrieve_password(website, user_id)

        elif choice == '3':
            # Edit Password
            website = input("Input website/app name: ")
            user_id = input("Input user ID: ")
            new_password = getpass.getpass("Input new password: ")  # Securely input new password
            edit_password(website, user_id, new_password)

        elif choice == '4':
            # Delete Password
            website = input("Input website/app name: ")
            user_id = input("Input user ID: ")
            delete_password(website, user_id)

        elif choice == '5':
            # Exit
            print("Exiting Password Manager. Goodbye!")
            break

        else:
            print("Invalid option. Please choose a valid number.")

# Run the Password Manager
main()

Output:

Welcome to the Password Manager!

1. Add Password
2. Retrieve Password
3. Edit Password
4. Delete Password
5. Exit
Select an option: 1
Input website/app name: example.com
Input user ID: user1
 Input password:  
Password added successfully.

1. Add Password
2. Retrieve Password
3. Edit Password
4. Delete Password
5. Exit
Select an option: 3
Input website/app name: example.com
Input user ID: user1

Input new password:  
Password updated successfully.

1. Add Password
2. Retrieve Password
3. Edit Password
4. Delete Password
5. Exit
Select an option: 4
Input website/app name: example.com
Input user ID: user1
Password deleted successfully.

1. Add Password
2. Retrieve Password
3. Edit Password
4. Delete Password
5. Exit
Select an option: 5
Exiting Password Manager. Goodbye!

Explanation:

  • Uses a simple dictionary ('password_storage') to store passwords in memory.
  • Functions 'add_password', 'retrieve_password', 'edit_password', and 'delete_password' handle adding, retrieving, editing, and deleting passwords, respectively.
  • Uses 'getpass.getpass()' to securely handle password input without displaying it on the screen.
  • This solution is straightforward but stores passwords in memory, making it less secure if the program is terminated.

Solution 2: Using a Class-Based Approach and cryptography for Secure Storage

First, install the cryptography library:

pip install cryptography

Code:

# Solution 2: Using a Class-Based Approach and `cryptography` for Secure Storage

from cryptography.fernet import Fernet  # Import Fernet for encryption and decryption
import getpass  # Import getpass to securely handle password input
import os  # Import os to interact with the operating system

class PasswordManager:
    """Class to handle password management with encryption."""

    def __init__(self, key_file='key.key', storage_file='passwords.txt'):
        """Initialize the manager with a key and storage file."""
        self.key_file = key_file
        self.storage_file = storage_file
        self.key = self.load_key()
        self.cipher = Fernet(self.key)

    def load_key(self):
        """Load or generate an encryption key."""
        if os.path.exists(self.key_file):
            with open(self.key_file, 'rb') as keyfile:
                return keyfile.read()
        else:
            key = Fernet.generate_key()
            with open(self.key_file, 'wb') as keyfile:
                keyfile.write(key)
            return key

    def encrypt(self, text):
        """Encrypt text using the Fernet cipher."""
        return self.cipher.encrypt(text.encode()).decode()

    def decrypt(self, text):
        """Decrypt text using the Fernet cipher."""
        return self.cipher.decrypt(text.encode()).decode()

    def save_password(self, website, user_id, password):
        """Save an encrypted password to the storage file."""
        encrypted_password = self.encrypt(password)
        with open(self.storage_file, 'a') as file:
            file.write(f"{website},{user_id},{encrypted_password}\n")
        print("Password added successfully.")

    def find_password(self, website, user_id):
        """Find and decrypt a password from the storage file."""
        if os.path.exists(self.storage_file):
            with open(self.storage_file, 'r') as file:
                for line in file:
                    stored_website, stored_user_id, encrypted_password = line.strip().split(',')
                    if stored_website == website and stored_user_id == user_id:
                        decrypted_password = self.decrypt(encrypted_password)
                        print(f"Retrieved Password: {decrypted_password}")
                        return
        print("No password found for the given website and user ID.")

    def run(self):
        """Main function to interact with the user."""
        print("Welcome to the Password Manager!")

        while True:
            # Display the menu
            print("\n1. Add Password")
            print("2. Retrieve Password")
            print("3. Exit")

            # Get user choice
            choice = input("Select an option: ")

            if choice == '1':
                # Add Password
                website = input("Input website/app name: ")
                user_id = input("Input user ID: ")
                password = getpass.getpass("Input password: ")  # Securely input password
                self.save_password(website, user_id, password)

            elif choice == '2':
                # Retrieve Password
                website = input("Input website/app name: ")
                user_id = input("Input user ID: ")
                self.find_password(website, user_id)

            elif choice == '3':
                # Exit
                print("Exiting Password Manager. Goodbye!")
                break

            else:
                print("Invalid option. Please choose a valid number.")

# Create an instance of PasswordManager and start it
password_manager = PasswordManager()
password_manager.run()
Welcome to the Password Manager!

1. Add Password
2. Retrieve Password
3. Exit
Select an option: 1
Input website/app name: example.com
Input user ID: user1
Input password:
Password added successfully.

1. Add Password
2. Retrieve Password
3. Exit
Select an option: 2
Input website/app name: example.com
Input user ID: user1
Retrieved Password: Ajuie#2

1. Add Password
2. Retrieve Password
3. Exit
Select an option: 3
Exiting Password Manager. Goodbye!

Explanation:

  • Uses the cryptography library's 'Fernet' class to securely encrypt and decrypt passwords.
  • The 'PasswordManager' class encapsulates all functionality, such as encryption, decryption, saving, and retrieving passwords.
  • The encryption key is stored in a file ('key.key'), and passwords are stored in an encrypted format in a file ('passwords.txt').
  • Uses methods like 'save_password()' and 'find_password()' to handle password management securely.
  • This approach provides stronger security by encrypting passwords, making it suitable for more secure storage solutions.

Note:
Both solutions provide a password manager that allows adding, editing, deleting, and retrieving passwords. Solution 1 uses a simple dictionary, while Solution 2 uses a class-based approach with encryption for secure storage.



Become a Patron!

Follow us on Facebook and Twitter for latest update.