Исходный код EJIO.utils.system.crypto
## /utils/system/crypto.py
from cryptography.fernet import Fernet
from loguru import logger
from .err import CryptographyError
__all__ = [
'generate_secure_key',
'encrypt_payload',
'decrypt_payload',
]
[документация]
def generate_secure_key() -> str:
"""
Генерирует криптографически стойкий случайный ключ безопасности (URL-safe Base64).
:return: Ключ шифрования.
"""
return str(Fernet.generate_key().decode('utf-8'))
[документация]
def encrypt_payload(data: bytes, key: str) -> bytes:
"""
Шифрует поток байт с помощью крипто-стандарта AES/HMAC (Fernet).
Полностью защищает файл от десериализации и анализа.
:param data: Данные для шифрования.
:param key: Ключ шифрования.
:return: Зашифрованные данные.
:raises: CryptographyError если произошла ошибка шифрования.
"""
if not data:
return b""
try:
cipher = Fernet(key.encode('utf-8'))
return cipher.encrypt(data)
except Exception as e:
logger.critical(f"Critical data encryption failure: {e}")
raise CryptographyError(f"Failed to encrypt data string: {e}") from e
[документация]
def decrypt_payload(cipher_data: bytes, key: str) -> bytes:
"""
Расшифровывает поток байт и проверяет его целостность.
:param cipher_data: Зашифрованные данные.
:param key: Ключ шифрования.
:return: Расшифрованные данные.
:raises CryptographyError: Если ключ не подходит или файл был поврежден/модифицирован.
"""
try:
cipher = Fernet(key.encode('utf-8'))
return cipher.decrypt(cipher_data)
except Exception as e:
logger.error(f"Decryption error! The key is incorrect or the file structure is corrupted: {e}")
raise CryptographyError("Invalid key or corrupted encrypted payload data.") from e