@foounder

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

from cryptography.fernet import Fernet
import sys
import re
import qrcode
import pyotp

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()


выдает такую ошибку
Traceback (most recent call last):
  File "C:\Users\7465\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cryptography\fernet.py", line 133, in _verify_signature
    h.verify(data[-32:])
  File "C:\Users\7465\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cryptography\hazmat\primitives\hmac.py", line 70, in verify
    ctx.verify(signature)
  File "C:\Users\7465\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cryptography\hazmat\backends\openssl\hmac.py", line 84, in verify
    raise InvalidSignature("Signature did not match digest.")
cryptography.exceptions.InvalidSignature: Signature did not match digest.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\7465\OneDrive\Рабочий стол\Delta\daf.py", line 152, in <module>
    main()
  File "C:\Users\7465\OneDrive\Рабочий стол\Delta\daf.py", line 144, in main
    get_password()
  File "C:\Users\7465\OneDrive\Рабочий стол\Delta\daf.py", line 115, in get_password
    decrypted_password = decrypt_password(encrypted_password, key)
  File "C:\Users\7465\OneDrive\Рабочий стол\Delta\daf.py", line 60, in decrypt_password
    decrypted_password = f.decrypt(encrypted_password.encode())
  File "C:\Users\7465\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cryptography\fernet.py", line 90, in decrypt
    return self._decrypt_data(data, timestamp, time_info)
  File "C:\Users\7465\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cryptography\fernet.py", line 151, in _decrypt_data
    self._verify_signature(data)
  File "C:\Users\7465\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cryptography\fernet.py", line 135, in _verify_signature
    raise InvalidToken
cryptography.fernet.InvalidToken
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ответы на вопрос 1
Artem_Dmit
@Artem_Dmit
Изучаю Python и наслаждаюсь процессом)
Похожая проблема!
Все храню в бинарном виде в БД постгрес,
ключ один, его уже текстом вписал вместо переменной.
Если зашифровать и сразу отправить на дешифровку переменную, все хорошо работает, но если это делать разными командами то ерор!

from cryptography.fernet import Fernet
from config.data import CRIPTO_KEY

fernet = Fernet(b'xX8FN0tVdzXzgexIGQ9d51XMEIqnUiZQ2YSIohjCbFk=')


async def encrypt(data: str) -> bytes:
    encrypted = fernet.encrypt(data.encode())
    return encrypted


async def decrypt(encrypted_data: bytes) -> str:
    print('encrypted_data = ', encrypted_data)
    decrypted = fernet.decrypt(encrypted_data).decode()
    return decrypted


вывод:
encrypted_data =  b'gAAAAABmoB8uIq6bxP_NBAE5UIJBRkWHKPB4ddQepKN9vUNW5LaRQPW3YMJoc5QeeVsx5H48afLRjWPGDC3cXcr-VPRqm_S5sg=='


ошибка:
... lib/python3.10/site-packages/cryptography/fernet.py", line 118, in _get_unverified_token_data
    raise InvalidToken
cryptography.fernet.InvalidToken
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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