PROCURA / crypto.py
tokiospg's picture
Upload 12 files
4e9cc0e verified
Raw
History Blame Contribute Delete
1.78 kB
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 ""