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