Skip to main content

Token-Sicherheitsmodell

L402-Tokens bestehen aus zwei Teilen, die durch : verbunden sind:
  • Macaroon — base64-kodiertes JSON mit {hash, exp}. Signiert mit SHA-256. Kann ohne Kenntnis des preimage nicht gefälscht werden.
  • Preimage — das 32-Byte-Geheimnis, das nach dem Hashing mit SHA-256 mit dem im macaroon eingebetteten Hash übereinstimmen muss.
Die Verifizierung erfolgt vollständig lokal — kein Datenbankaufruf, kein Netzwerkaufruf. Das SDK prüft die Hash-Beziehung kryptografisch in Mikrosekunden.

Replay-Schutz

l402-kit enthält integrierten Replay-Schutz. Jeder preimage kann nur einmal verwendet werden:
Bei der ersten Verwendung eines Tokens wird der preimage als verbraucht markiert. Jede nachfolgende Anfrage mit demselben preimage gibt 401 Token already used zurück. Standardspeicher: In-Memory-Set. Das bedeutet:
  • Neustarts leeren den Replay-Speicher (Tokens werden nach Neustarts wiederverwendbar)
  • Mehrere Instanzen teilen keinen gemeinsamen Zustand
Für den Produktionsbetrieb mit mehreren Instanzen sollten Sie einen persistenten Replay-Speicher implementieren:

Token-Ablauf

Tokens enthalten ein exp-Feld (Unix-Zeitstempel in ms). Das SDK lehnt abgelaufene Tokens automatisch ab. Standard-TTL: 1 Stunde (festgelegt vom Lightning-Provider beim Erstellen der Rechnung).

HTTPS ist erforderlich

Verwenden Sie L402 niemals über einfaches HTTP in der Produktion. Der macaroon und der preimage werden im Authorization-Header übertragen. Über HTTP sind sie für Netzwerkangreifer sichtbar.

Ratenbegrenzung

L402 verifiziert Tokens kryptografisch, ohne eine Datenbank abzufragen — das ist kostengünstig. Die Erstellung von Lightning-Rechnungen (die 402-Antwort) ruft jedoch die API Ihres Lightning-Providers auf. Schützen Sie die Rechnungserstellung mit einem Rate-Limiter, um DoS zu verhindern:

Verwaltung von Geheimnissen

Kodieren Sie niemals API-Schlüssel fest. Verwenden Sie Umgebungsvariablen:
Verwenden Sie in der Produktion einen Secrets-Manager: AWS Secrets Manager, Doppler, Vault oder .env + dotenv (niemals in Git committen).

Authentifizierung von Admin-Endpunkten

Wenn Sie Admin- oder Statistik-Endpunkte bereitstellen, akzeptieren Sie niemals Geheimnisse über URL-Abfrageparameter. URLs werden von Reverse-Proxys, CDNs und Cloud-Anbietern vollständig protokolliert — einschließlich der Abfragezeichenfolge.

Supabase-Schlüsselhygiene

Verwenden Sie SUPABASE_SERVICE_KEY (nur serverseitig) und SUPABASE_ANON_KEY (sicher für Clients freigegeben) korrekt: Serverseitige Cloudflare Workers, die sensible Tabellen lesen (z. B. pro_access), müssen den Service-Schlüssel verwenden — niemals den anon-Schlüssel. RLS-Richtlinien für sensible Tabellen sollten keinen anon-Zugriff gewähren.

Content Security Policy

Wenn Sie ein Frontend zusammen mit Ihrer API bereitstellen, stellen Sie sicher, dass Ihre CSP den L402-Ablauf nicht blockiert:

Datenverwaltung — Benutzerdatenlöschung

Benutzer können ihre gesamte Zahlungshistorie und ihr Pro-Abonnement jederzeit über die VS Code-Erweiterung löschen (Einstellungen → Gefahrenbereich). Die Erweiterung ruft auf:
Antwort:
Dieser Endpunkt verwendet den Supabase Service-Role-Schlüssel serverseitig, um RLS zu umgehen und dauerhaft zu löschen:
  • Alle Zeilen in payments, bei denen owner_address = ?
  • Alle Zeilen in pro_access, bei denen address = ?
Die Erweiterung erfordert, dass der Benutzer seine Lightning-Adresse wortwörtlich eingibt, bevor die Schaltfläche zum Löschen aktiviert wird — eine GitHub-artige Bestätigung für destruktive Aktionen.
Wenn Sie ein eigenes Dashboard auf Basis von l402-kit erstellen, stellen Sie einen ähnlichen Endpunkt für Ihre Benutzer bereit. Erlauben Sie niemals das Löschen über den anon-Schlüssel — leiten Sie stets über eine serverseitige Funktion mit dem Service-Schlüssel weiter.

Datenschutz & Datensparsamkeit

l402-kit ist darauf ausgelegt, die minimal notwendigen Daten für den Betrieb zu erfassen. Nachfolgend finden Sie, was gespeichert wird, warum und wie Sie jedes Feld absichern können.

Was gespeichert wird

Preimages hashen statt roh speichern

Der preimage ist das 32-Byte-Geheimnis, das beweist, dass eine Lightning-Zahlung erfolgt ist. Wird er roh gespeichert, werden bei einem Datenbankverstoß alle Nachweise offengelegt. Speichern Sie stattdessen den SHA-256-Hash — er ist bereits öffentlich (im BOLT11-Invoice eingebettet) und für den Replay-Schutz ausreichend:

Wartelisten-E-Mails schützen

E-Mail-Adressen sind die einzigen echten personenbezogenen Daten im System. Optionen in aufsteigender Schutzstärke:

Wallet-Eigentümerschaft vor dem Löschen von Daten nachweisen (LNURL-auth)

Der /api/delete-data-Endpunkt sollte nur Anfragen vom tatsächlichen Eigentümer der Lightning-Adresse akzeptieren. Verwenden Sie LNURL-auth, um die Eigentümerschaft kryptografisch nachzuweisen — der Benutzer signiert eine Server-Challenge mit dem privaten Schlüssel seines Lightning Wallets, ohne Passwort oder Konto: Sehen Sie sich das vollständige Ablaufdiagramm für die vollständige Sequenz mit dem Supabase-Zustand an. Dadurch wird sichergestellt, dass niemand die Datensätze eines anderen Benutzers löschen kann, selbst wenn er die Lightning-Adresse kennt.

Checkliste

  • HTTPS auf allen Endpunkten erzwungen
  • API-Schlüssel in Umgebungsvariablen, nicht im Quellcode
  • Admin-/Statistik-Endpunkte verwenden Header-Auth, keine ?secret=-URL-Parameter
  • Supabase service_role-Schlüssel serverseitig verwendet; anon-Schlüssel nur auf Clients
  • Sensible Supabase-Tabellen haben keine anon-SELECT-Richtlinie
  • Datenlöschungs-Endpunkt (/api/delete-data) verwendet Service-Schlüssel, niemals anon
  • Rate-Limiter für die Rechnungserstellung
  • Replay-Schutz getestet (preimage wiederverwenden versuchen → 401 erwarten)
  • Token-Ablauf getestet (kurze TTL in der Entwicklung setzen, 401 nach Ablauf bestätigen)
  • Preimages als SHA-256-Hashes gespeichert, nicht als rohe Geheimnisse
  • Wartelisten-E-Mails im Ruhezustand verschlüsselt oder nach dem Versenden verworfen
  • /api/delete-data erfordert LNURL-auth-Nachweis der Wallet-Eigentümerschaft
  • Redis-basierter Replay-Speicher (instanzübergreifend geteilt)
  • Überwachung der 402-Antwortrate (Anstieg = möglicher DoS)
  • Lightning-Provider-Failover (BlinkProvider → LNbitsProvider-Fallback)
  • Statusseiten-Überwachung für Ihren Lightning-Provider (z. B. status.blink.sv)