@foounder

Не выводить сохранные пароли при перезаходе как решить?

сохранил пароль после вывел пароль все работает но если перезагрузить код и спросить до этого сохраненный пароль оно выводить ошибку cryptography.fernet.InvalidToken

Код
from cryptography.fernet import Fernet
import sys
import re

MASTER_PASSWORD = "0"
MAX_ATTEMPTS = 3

def passw():
    attempts = 0
    while attempts < MAX_ATTEMPTS:
        password = input("Введите мастер-пароль: ")
        if password == MASTER_PASSWORD:

            # продолжайте выполнение программы
            break  # выход из цикла при правильном вводе пароля
        else:
            attempts += 1
            print("Неверный мастер-пароль. Попробуйте еще раз.")
    else:
        print("Превышено максимальное количество попыток. Приложение будет закрыто.")
        sys.exit()  # выход из приложения после трех неверных попыток


def generate_key():
    """
    Функция для генерации ключа для шифрования/дешифрования
    """
    return Fernet.generate_key()

def load_key():
    """
    Функция для загрузки ключа из файла
    """
    return open("secret.key", "rb").read()

def write_key(key):
    """
    Функция для записи ключа в файл
    """
    with open("secret.key", "wb") as key_file:
        key_file.write(key)

def encrypt_password(password, key):
    """
    Функция для шифрования пароля
    """
    encoded_password = password.encode()
    f = Fernet(key)
    encrypted_password = f.encrypt(encoded_password)
    return encrypted_password.decode()

def decrypt_password(encrypted_password, key):
    """
    Функция для расшифровки пароля
    """
    f = Fernet(key)
    decrypted_password = f.decrypt(encrypted_password.encode())
    return decrypted_password.decode()

def add_password():
    """
    Функция для добавления нового пароля
    """
    site = input("Введите название сайта: ")
    username = input("Введите имя пользователя: ")
    password = input("Введите пароль: ")
    key = load_key()
    encrypted_password = encrypt_password(password, key)
    strength = password_strength(password)
    if strength < 2:
        print("Пароль слишком слабый. Рекомендуется использовать пароль длиной не менее 8 символов, содержащий цифры, буквы в разных регистрах и специальные символы.")
        return
    with open("passwords.txt", "a") as f:
        f.write(f"{site}:{username}:{encrypted_password}\n")
    print("Пароль успешно добавлен.")

def password_strength(password):
    """
    Функция для оценки надежности пароля
    """
    score = 0

    # Проверка длины пароля
    if len(password) < 8:
        return 0

    # Проверка наличия цифр
    if re.search(r"\d", password):
        score += 1

    # Проверка наличия букв в разных регистрах
    if re.search(r"[a-z]", password) and re.search(r"[A-Z]", password):
        score += 1

    # Проверка наличия специальных символов
    if re.search(r"[ !\"#$%&'()*+,-./[\\\]^_`{|}~]", password):
        score += 1

    return score
def get_password():
    """
    Функция для получения пароля
    """
    site = input("Введите название сайта: ")
    with open("passwords.txt", "r") as f:
        for line in f.readlines():
            if line.startswith(site + ":"):
                parts = line.strip().split(":")
                username = parts[1]
                encrypted_password = parts[2]
                key = load_key()
                decrypted_password = decrypt_password(encrypted_password, key)
                strength = password_strength(decrypted_password)
                if strength < 2:
                    print("Этот пароль слишком слабый. Рекомендуется изменить пароль на более надежный.")
                print(f"Пароль для пользователя {username}: {decrypted_password}")
                return
        print("Пароль не найден.")

def main():
    """
    Основная функция программы
    """

    passw()
    print("Добро пожаловать в менеджер паролей!")
    key = generate_key()
    write_key(key)

    while True:
        print("\nВыберите действие:")
        print("1. Добавить пароль")
        print("2. Получить пароль")
        print("3. Выйти из программы")
        choice = input("> ")

        if choice == "1":
            add_password()
        elif choice == "2":
            get_password()
        elif choice == "3":
            print("Спасибо за использование менеджера паролей!")
            break
        else:
            print("Неверный выбор. Попробуйте снова.")

if __name__ == "__main__":
    main()
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Sing303
У вас при каждом запуске в generate_key новый ключ генерируется же? Получается вы при перезапуске теряете старый ключ и генерируете новый. Нужно сохранять ключ и при перезапуске загружать ранее созданный ключ с помощью которого были добавлены пароли

Типа такого (не проверял)
def generate_key():
    try:
        key = load_key()
    except FileNotFoundError:
        key = Fernet.generate_key()
        write_key(key)
    return key
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы