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.
Go to:
