from cryptography.fernet import Fernet, InvalidToken from app.config.settings import settings def _get_fernet() -> Fernet: key = settings.token_encryption_key if not key: raise RuntimeError( "SD_TOKEN_ENCRYPTION_KEY is not configured. " "Generate one with: python -c \"from cryptography.fernet import Fernet; " "print(Fernet.generate_key().decode())\"" ) return Fernet(key.encode() if isinstance(key, str) else key) def encrypt_token(plaintext: str) -> str: if not plaintext: return "" return _get_fernet().encrypt(plaintext.encode()).decode() def decrypt_token(ciphertext: str) -> str: if not ciphertext: return "" try: return _get_fernet().decrypt(ciphertext.encode()).decode() except InvalidToken as exc: raise ValueError("Failed to decrypt token (key mismatch or corrupted value)") from exc