Spaces:
Runtime error
Runtime error
| 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 "" | |