Spaces:
Runtime error
Runtime error
File size: 1,784 Bytes
4e9cc0e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import os
import logging
from cryptography.fernet import Fernet
from dotenv import load_dotenv
load_dotenv()
logger = logging.getLogger(__name__)
# Inicialización segura de la clave Fernet compartida
_enc_key_str = os.getenv("ENCRYPTION_KEY", "").strip()
if not _enc_key_str:
_enc_key_str = Fernet.generate_key().decode()
try:
with open(".env", "a") as f:
f.write(f"\nENCRYPTION_KEY={_enc_key_str}\n")
except Exception as e:
logger.warning(f"No se pudo escribir en .env: {e}")
os.environ["ENCRYPTION_KEY"] = _enc_key_str
logger.warning("ENCRYPTION_KEY no encontrada — se generó una nueva.")
# Extraer solo la llave si el usuario pegó "ENCRYPTION_KEY=..." por error
if _enc_key_str.startswith("ENCRYPTION_KEY="):
_enc_key_str = _enc_key_str.split("=", 1)[1].strip()
try:
ENCRYPTION_KEY = _enc_key_str.encode()
cipher_suite = Fernet(ENCRYPTION_KEY)
except Exception as e:
logger.error(f"Error inicializando Fernet con la clave proporcionada: {e}")
# Fallback seguro en caso de clave inválida (evita que la app crashee, pero las contraseñas fallarán)
cipher_suite = Fernet(Fernet.generate_key())
def encrypt_data(text: str) -> str:
"""Cifra un texto plano utilizando la clave maestra."""
if not text:
return ""
try:
return cipher_suite.encrypt(text.encode()).decode()
except Exception as e:
logger.error(f"Error al cifrar datos: {e}")
return ""
def decrypt_data(text: str) -> str:
"""Descifra un texto cifrado utilizando la clave maestra."""
if not text:
return ""
try:
return cipher_suite.decrypt(text.encode()).decode()
except Exception as e:
logger.error(f"Error al descifrar datos: {e}")
return ""
|