""" Zentrale Krypto-Hilfsfunktionen für TimeMaster. Verwendet Fernet-Verschlüsselung (AES-128-CBC + HMAC-SHA256). Der Schlüssel wird aus SECRET_KEY per SHA-256 abgeleitet. Verwendung: from app.core.crypto import encrypt_value, decrypt_value stored = encrypt_value("geheimes-passwort") plain = decrypt_value(stored) """ from __future__ import annotations import base64 import hashlib from cryptography.fernet import Fernet, InvalidToken from app.core.config import settings def _fernet() -> Fernet: """Erstellt eine Fernet-Instanz aus dem konfigurierten SECRET_KEY.""" key = hashlib.sha256(settings.secret_key.encode()).digest() return Fernet(base64.urlsafe_b64encode(key)) def encrypt_value(plain: str) -> str: """Verschlüsselt einen Klartext-String per Fernet. Gibt den chiffrierten String zurück.""" return _fernet().encrypt(plain.encode()).decode() def decrypt_value(encrypted: str) -> str: """ Entschlüsselt einen Fernet-verschlüsselten String. Wirft ValueError bei ungültigem Token oder falschem Schlüssel. """ try: return _fernet().decrypt(encrypted.encode()).decode() except InvalidToken as exc: raise ValueError("Entschlüsselung fehlgeschlagen – ungültiger Token oder falscher Schlüssel.") from exc