import base64 import os from cryptography.fernet import Fernet from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC from ...config.logfire_config import get_logger logger = get_logger(__name__) class CryptoUtils: """Utilities for Fernet encryption and key management.""" @staticmethod def get_encryption_key() -> bytes: """Generate encryption key from environment variables.""" service_key = os.getenv("SUPABASE_SERVICE_KEY", "default-key-for-development") kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), length=32, salt=b"static_salt_for_credentials", iterations=100000, ) return base64.urlsafe_b64encode(kdf.derive(service_key.encode())) @staticmethod def encrypt_value(value: str) -> str: """Encrypt a sensitive value using Fernet encryption.""" if not value: return "" try: fernet = Fernet(CryptoUtils.get_encryption_key()) encrypted_bytes = fernet.encrypt(value.encode("utf-8")) return base64.urlsafe_b64encode(encrypted_bytes).decode("utf-8") except Exception as e: logger.error(f"Error encrypting value: {e}") raise @staticmethod def decrypt_value(encrypted_value: str) -> str: """Decrypt a sensitive value using Fernet encryption.""" if not encrypted_value: return "" try: fernet = Fernet(CryptoUtils.get_encryption_key()) encrypted_bytes = base64.urlsafe_b64decode(encrypted_value.encode("utf-8")) decrypted_bytes = fernet.decrypt(encrypted_bytes) return str(decrypted_bytes.decode("utf-8")) except Exception as e: logger.error(f"Error decrypting value: {e}") raise