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 ""