Wir sind heute auf Product Hunt! Kommentar schreiben
Authenticator 1.16.0 ist da. Neuerungen ansehen
Ein technischer Überblick für Sicherheitsprüfer. Alles hier lässt sich am Quellcode nachprüfen — auch die weniger schmeichelhaften Punkte, die wir benennen statt wegzulassen.
Die Erweiterung ist eine Manifest-V3-Chrome-Erweiterung, die TOTP-Codes lokal mit OTPAuth erzeugt. Das Erzeugen der Codes sowie das Speichern und Verschlüsseln der Konten kommen ohne Backend aus, und es gibt keine Nutzerkonten. Wir betreiben einen einzigen Server, api.authenticator.sh, für die kostenlose Version und Pro — unten beschrieben —, und er erhält nie einen geheimen Schlüssel, einen Kontonamen, einen Aussteller oder einen Code.
Dieser Server hält keinerlei Schlüsselmaterial zu den Konten der Nutzer: Es gibt keine Schlüsselhinterlegung und keinen von uns kontrollierten Wiederherstellungsweg. Wer sein Passwort vergisst und den Wiederherstellungscode verliert, dem können wir nicht helfen — so ist es beabsichtigt.
Der Passwortschutz ist optional und standardmäßig aus. Ist er aktiv:
Daten werden nie direkt mit einem aus dem Passwort abgeleiteten Schlüssel verschlüsselt. Ein zufälliger Hauptschlüssel verschlüsselt die Datensätze; die PBKDF2-Ausgabe umschließt nur diesen Hauptschlüssel. Daraus folgen zwei Dinge, und beide zählen:
Bei aktivem Passwortschutz wird der gesamte Kontodatensatz verschlüsselt, bis auf Kennung und Fingerabdruck — auch der Dienstname, damit ein gestohlenes Profil nicht verrät, bei welchen Diensten jemand Konten hat. Beim Aktivieren werden die Datensätze verschlüsselt, durch Entschlüsseln und Vergleichen geprüft und erst danach alle Klartextkopien entfernt: lokaler Browserspeicher, Sync und alle sieben rollierenden Backup-Stände.
Klar gesagt, weil es für Ihre Bewertung zählt:
Kurz gesagt: Das schützt Daten im Ruhezustand. Ein Gerät, das während der Nutzung bereits unter der Kontrolle eines Angreifers steht, schützt es nicht — und kann es nicht.
Das Manifest deklariert fünf Berechtigungen und keine Host-Berechtigungen:
Es gibt keine Content-Skripte, keine Berechtigungen für tabs, cookies oder webRequest und keine web-accessible resources. Nichts von uns existiert in einer Seite, bis Sie dort einen Code anfordern; was dann läuft, wird für genau diesen Tab und diesen einen Aufruf injiziert, unter der Freigabe, die Ihr eigener Klick erteilt, und hinterlässt nichts.
Das QR-Scannen per Kamera läuft auf einer Erweiterungsseite in einem Tab, nicht im Popup — ein Popup wird zerstört, sobald es den Fokus verliert, und genau das tut eine Berechtigungsabfrage. Dafür ist keine Manifest-Berechtigung nötig: Es nutzt die Standard-Kameraabfrage des Browsers, erteilt pro Erweiterungs-Origin und in den Website-Einstellungen widerrufbar, und sie erscheint erst, wenn der Scanner geöffnet wird. Das Video wird lokal dekodiert und nie übertragen oder gespeichert.
Seit 1.14.0 meldet sich die Erweiterung einmal täglich bei api.authenticator.sh — beim Browserstart oder nachdem das Popup gerendert wurde, nie auf dem Weg zur Anzeige eines Codes. Die Anfrage ist eine geschlossene Liste von Feldern, wird in einer einzigen Funktion in src/billing/sync.ts zusammengesetzt und durch einen Test auf genau diese Liste festgelegt:
Nie gesendet: geheime Schlüssel, Kontonamen, Aussteller, Codes oder die Websites, auf denen sie verwendet werden. Der Server ermittelt das Land aus der Anfrage an seinem Edge und speichert die IP-Adresse nicht. Die Deinstallationsseite erhält dieselbe Installations-ID als ?i=: Sie meldet dem Server, dass die Installation entfernt wurde, und ordnet ihr eine freiwillige Antwort auf die Umfrage zu.
Dafür liegt in chrome.storage.local: die Installations-ID, die zuletzt erhaltene signierte Richtlinie und Lizenz, der Lizenzschlüssel dieser Installation (eingegeben oder nach einem Kauf auf ihr erhalten), die Zahl der Öffnungen pro Tag, bis der Server sie hat, sowie die zwischengespeicherten Ereignisse — keine Kontodaten. Ist Sync aktiv, landen außerdem die Angabe, ob die Installation aus der Zeit vor der Abrechnung stammt, und dieser Lizenzschlüssel in Chrome Sync, damit die anderen Chrome-Profile des Nutzers sie übernehmen und Pro von selbst einschalten; wird Sync ausgeschaltet, verschwinden beide aus Chrome Sync, wird es wieder eingeschaltet, kommen sie zurück.
Was zurückkommt und wie die Erweiterung damit umgeht:
Das Limit ist kein DRM: Der Code ist Open Source, und ein Fork kann es entfernen. Was niemals möglich sein darf: dass jemand die Lizenz einer anderen Person erlangt oder nutzt oder die Installation eines anderen begrenzt — das wäre eine Schwachstelle und fällt in den Geltungsbereich unserer Sicherheitsrichtlinie.
Zwei Arten von Anfragen stellt die Erweiterung von sich aus: die Uhrzeitprüfung und den täglichen Abgleich für die Abrechnung. Alles Weitere unten geschieht, weil der Nutzer darauf geklickt hat. Manifest V3 verbietet Remote-Code, und nichts davon transportiert Konten, geheime Schlüssel oder erzeugte Codes. Die vollständige Liste:
| Host | Wann | Enthält Nutzerdaten? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Prüfung auf Uhrabweichung, zwischengespeichert; ist keine Quelle erreichbar, steht das in den Einstellungen. Bei falsch gehender Uhr bricht TOTP. | Nein |
| authenticator.sh | Willkommensseite bei der Installation; Feedback-Seite bei der Deinstallation, mit der Installations-ID in der Adresse; Hilfe- und Supportseiten, wenn sie aus dem Popup geöffnet werden. | Die Installations-ID, nur auf der Deinstallationsseite; sonst nein (gewöhnliche Webserver-Logs) |
| api.authenticator.sh | Abgleich für die Abrechnung einmal täglich; Aufrufe für Checkout, Lizenz und Kundenportal, wenn der Nutzer Pro kauft, einen Schlüssel eingibt, einen Kauf wiederherstellt oder ein Abo verwaltet. | Die oben aufgeführten Felder — nie Kontodaten. Einen Lizenzschlüssel oder eine E-Mail-Adresse nur, wenn der Nutzer sie selbst eingibt |
| checkout.stripe.com billing.stripe.com | Stripe Checkout und Kundenportal, in einem Tab geöffnet, wenn der Nutzer Pro kauft oder ein Abo verwaltet. | Was der Käufer dort eingibt. Es gelten die eigenen Bedingungen von Stripe und Link |
| chromewebstore.google.com | Store-Eintrag, nur per Klick in einem Tab geöffnet: das Bewertungsformular aus der Bewertungsabfrage. | Nein (für Google ist es der Aufruf einer Store-Seite wie jeder andere) |
Weder Schriften noch Skripte, Styles oder Bilder werden von Drittanbieter-Hosts geladen. Alles, was die Oberfläche zum Rendern braucht, steckt im Paket.
Sie müssen nichts davon glauben. Die Erweiterung ist quelloffen, und jedes Release ist reproduzierbar:
.crx aus dem Chrome Web Store herunterladen und entpackennpm ci && npm run build unter Node 20 LTS ausführendist/ mit dem entpackten Paket vergleichenFür jede Datei im erzeugten dist/ wird mit jedem GitHub-Release ein SHA-256 als SHA256SUMS-v<version>.txt veröffentlicht, im Format sha256sum — Schritt 4 ist damit ein einziger Aufruf von sha256sum -c. Abweichungen sollten sich auf die Dateireihenfolge in Archiven und Leerzeichen in minifizierter Ausgabe zwischen Node-Patch-Versionen beschränken.
Die Laufzeitabhängigkeiten sind bewusst wenige — OTPAuth, React, jsQR, Zustand, Framer Motion und Lucide — festgehalten durch eine eingecheckte Lockfile. Eine CycloneDX-SBOM stellen wir auf Anfrage bereit.
Quellcode ansehenWir sind ein kleiner unabhängiger Anbieter. Wenn eines der folgenden Dinge für Ihren Prozess zwingend ist, erfahren Sie es besser jetzt als drei Wochen später in der Bewertung:
Was wir stattdessen bieten: vollständige Transparenz des Quellcodes, einen verifizierbaren Build, eine minimale Berechtigungsfläche und einen Server, an den Ihre geheimen Schlüssel, Kontonamen oder Codes gar nicht erst gesendet werden.
Schwachstellenmeldungen und Sicherheitsfragen: security@authenticator.sh. Offenlegungsrichtlinie, Geltungsbereich, Reaktionszeiten und Safe-Harbour-Bedingungen stehen auf der Seite Sicherheitsrichtlinie; was gespeichert wird und was das Gerät verlässt, steht in der Datenschutzerklärung.
Wir beantworten gerne einen schriftlichen Lieferantenfragebogen oder gehen den Code mit einem Sicherheitsteam durch.
Für alles, was keine Sicherheitsfrage ist — Installation, Kontowiederherstellung, Abrechnungsfragen aus einem Rollout — siehe Support. Bitte schicken Sie dorthin keine Schwachstellenmeldungen; dieses Postfach gilt nicht als vertraulich.