Sicherheit und Nachprüfbarkeit

Diese Seite beschreibt, was technisch passiert, wenn du auf pwgen.de ein Passwort erzeugst – und vor allem, wie du das selbst nachprüfen kannst, ohne uns glauben zu müssen. Wo eine Aussage derzeit nicht überprüfbar ist, steht das am Ende der Seite.

Erzeugung im Browser

Passwörter, Passphrasen, PINs, Token, Muster und Framework-Secrets entstehen auf deinem Gerät. Es gibt keinen Schritt, in dem ein erzeugter Wert an einen Server geschickt wird – weder zum Bewerten der Stärke noch zum Zählen.

Jedes Zeichen stammt aus crypto.getRandomValues(), dem kryptographisch sicheren Zufallsgenerator des Browsers. Die Auswahl arbeitet mit Rejection Sampling: Zufallswerte, die den Zeichenvorrat nicht gleichmäßig treffen, werden verworfen statt per Modulo umgerechnet. Damit ist jedes Zeichen exakt gleich wahrscheinlich. Math.random() kommt an keiner Stelle vor.

  • Passphrasen ziehen aus vollständigen Diceware-Listen mit je 7776 Wörtern (Deutsch und Englisch), die von derselben Domain geladen werden.
  • Die Seite setzt keine Cookies. Der einzige lokal gespeicherte Wert ist die Bestätigung des Datenschutzhinweises im localStorage.
  • Erzeugte Werte werden nicht in die Seiten-URL, in kein Formular und in keinen Verlauf geschrieben.

Was der Browser überhaupt zulassen darf

Eine Content-Security-Policy ist stärker als ein Versprechen: Sie wird vom Browser durchgesetzt, nicht von uns. Entscheidend ist die Direktive connect-src 'self'. Sie erlaubt Netzwerkverbindungen ausschließlich zur eigenen Domain. Selbst wenn eingeschleuster Code versuchen würde, ein erzeugtes Passwort abzuschicken, gibt es kein zulässiges Ziel dafür.

Ergänzend verbietet frame-ancestors 'none' das Einbetten der Seite in fremde Rahmen, object-src 'none' Plugin-Inhalte, base-uri 'none' ein untergeschobenes <base>-Element und form-action 'self' das Absenden von Formularen an fremde Ziele. Bilder sind auf die eigene Domain und data:-URIs begrenzt, Schriften auf die eigene Domain.

Ehrlich bleibt eine Einschränkung: script-src enthält 'unsafe-inline'. Nuxt schreibt seinen Hydration-Zustand als Inline-Skript in die Seite, und weil fast alle Seiten vorgerendert werden, existiert das HTML lange vor der Anfrage – ein Nonce pro Antwort ist damit nicht möglich. Das schwächt den Schutz gegen eingeschleustes Skript, nicht aber gegen den Abfluss von Daten: connect-src greift unabhängig davon.

Ausgelieferte Content-Security-Policy

default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'

Selbst nachprüfen

curl -sI https://pwgen.de/ | grep -i content-security-policy

Lokaler Generator und REST-API

Es gibt genau eine Stelle, an der ein Wert auf dem Server entsteht: den ausdrücklichen Aufruf von /api/generate. Wer die API nutzt, entscheidet sich bewusst dafür – die Website selbst ruft sie nicht auf.

Auch dort wird nichts protokolliert. Der Server hat keinen Logging-Pfad, der einen erzeugten Wert entgegennimmt, und alle Antworten tragen no-store. Wenn du maximale Kontrolle willst, nutze den Generator im Browser: Dann verlässt der Wert dein Gerät nie.

  • Die API ist offen, ohne Anmeldung nutzbar und sprachneutral; Fehler bestehen aus stabilen Codes statt aus Text.
  • Pro IP-Adresse gelten 60 Anfragen pro Minute. Die Grenze schützt den Dienst, nicht deine Daten – sie ist der einzige Grund, aus dem der Server IP-Adressen kurzzeitig im Arbeitsspeicher hält.
  • CORS ist bewusst offen (*), damit das Widget auch auf fremden Websites funktioniert.

Widget auf fremden Seiten

Das einbettbare Widget ist eine eigenständige Datei ohne Abhängigkeiten. Es erzeugt ebenfalls im Browser des Besuchers, nutzt dieselbe Zufallsquelle mit Rejection Sampling und lädt lediglich die Wortlisten von pwgen.de nach. Es überträgt keine erzeugten Werte und setzt keine Cookies.

Statistik

Für die Reichweitenmessung läuft eine selbst gehostete Umami-Instanz ohne Cookies. Sie ist auf den Seiten, die Geheimnisse erzeugen, gar nicht erst geladen: weder auf der Startseite noch auf den Generator- und Secret-Seiten noch im Widget. Gezählt werden ausschließlich Ratgeber, API-Dokumentation, Rechtstexte und diese Seite.

Prüfen lässt sich das im Netzwerk-Tab: Auf einer Generatorseite gibt es keine Anfrage an ein Statistikskript. Was auf den übrigen Seiten erhoben wird, steht in der Datenschutzerklärung.

Sicherheitslücke melden

Wenn dir etwas auffällt, melde es bitte direkt – gerne mit Schritten zum Nachvollziehen und dem betroffenen Endpunkt. Wir bestätigen den Eingang, klären den Sachverhalt und melden uns mit dem weiteren Vorgehen zurück. Bitte veröffentliche einen Befund erst, wenn er behoben ist oder wir uns nicht melden.

Sicherheitsmeldungen

info@htrs.io

Maschinenlesbar unter /.well-known/security.txt

Was diese Seite nicht beweist

Alles oben Beschriebene lässt sich im Browser beobachten: Netzwerk-Tab, Quelltext der ausgelieferten Skripte, Antwort-Header. Was du damit nicht siehst, ist der Bauprozess dahinter.

Der Quellcode von pwgen.de ist derzeit nicht öffentlich, und es liegt kein Bericht einer unabhängigen Prüfung vor. Solange das so ist, gilt: Du kannst überprüfen, was ausgeliefert wird, aber nicht unabhängig bestätigen, dass der ausgelieferte Code aus einem einsehbaren Quellstand entstanden ist. Wir halten diese Einschränkung lieber hier fest, als sie zu verschweigen.