import os from cryptography.fernet import Fernet, InvalidToken # Phase 5: verschluesselt den WLAN-PSK at-rest (echte Zugangsdaten, kein # Passwort-Hash-Fall - muss beim ISO-Bau wieder im Klartext verfuegbar # sein). Eigener Schluessel statt Ableitung aus SESSION_SECRET, um # Cookie/JWT-Signing und At-rest-Verschluesselung nicht zu vermischen. # Erzeugen: python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" ENCRYPTION_KEY = os.environ.get("KUNDENPLATTFORM_ENCRYPTION_KEY", "") def _fernet() -> Fernet: if not ENCRYPTION_KEY: raise RuntimeError("KUNDENPLATTFORM_ENCRYPTION_KEY ist nicht gesetzt.") return Fernet(ENCRYPTION_KEY.encode("ascii")) def encrypt_psk(psk: str) -> bytes: return _fernet().encrypt(psk.encode("utf-8")) def decrypt_psk(psk_encrypted) -> str | None: if psk_encrypted is None: return None try: return _fernet().decrypt(bytes(psk_encrypted)).decode("utf-8") except InvalidToken: # Sollte nur bei Schluesselwechsel/Datenkorruption passieren - dann # lieber "kein PSK gespeichert" anzeigen als mit 500 abzubrechen. return None