TOTP-Generator

Erzeugen und verifizieren Sie zeitbasierte Einmalpasswörter (TOTP) aus einem base32-Secret. Kompatibel mit Google Authenticator und RFC 6238.

Einmalpasswörter, RFC 6238. Erzeugen Sie das aktuelle TOTP für ein base32-Secret und validieren Sie einen empfangenen Code. Der Zähler wird aus der aktuellen Zeit abgeleitet, daher erneuern sich Codes alle 30 oder 60 Sekunden. Läuft vollständig in Ihrem Browser.

------

Code verifizieren

Wie TOTP funktioniert

Ein gemeinsames Secret plus die Uhr

TOTP ist in RFC 6238 definiert und eine dünne Schicht über HOTP. Beide Seiten halten dasselbe Secret, meist einmalig als QR-Code übermittelt und in einer Authenticator-App gespeichert. Um einen Code zu erzeugen, nimmt jede Seite die aktuelle Unix-Zeit, teilt sie durch die Schrittgröße (standardmäßig 30 Sekunden), um einen Zähler zu erhalten, berechnet HMAC-SHA1 dieses Zählers unter dem Secret und kürzt das Ergebnis auf die benötigte Stellenzahl.

Da der Zähler von der Uhr und nicht von einer Nachricht kommt, muss nach der Einrichtung nichts zwischen den beiden Parteien übertragen werden. Der Server sendet keine Herausforderung und die App braucht keinen Netzzugang — das ist der Grund, warum Authenticator-Apps im Flugmodus funktionieren.

Kürzung und die Stellenzahl

Die HMAC-Ausgabe sind 20 Bytes, weit mehr als ein 6-stelliger Code. Dynamische Kürzung nutzt das niedrige Nibble des letzten Bytes als Offset, liest ab dort vier Bytes, maskiert das oberste Bit zur Vermeidung von Vorzeichenproblemen und nimmt diese Zahl modulo 10^Stellen. Ein variabler Offset statt einem festen verhindert, dass ein Angreifer die Analyse auf einen bekannten Ausschnitt des Digest konzentrieren kann.

Sechs Stellen ist der nahezu universelle Standard. Acht Stellen werden von den meisten Apps unterstützt und kaufen etwa zwei zusätzliche Dezimalstellen Raterate-Widerstand, was viel weniger zählt als Ratenbegrenzung — ein 6-stelliger Code hat eine 1-zu-Million-Chance pro Rateversuch, also ist der wahre Schutz das Sperren nach einer Handvoll Fehlversuchen.

Uhr-Drift und Replay

Geräte driften. Server akzeptieren normalerweise den Code aus dem vorigen und nächsten Fenster sowie dem aktuellen, was eine Toleranz von ±30 Sekunden gibt. Dieses Fenster auf über eine Minute oder zwei auszuweiten beginnt, die Angriffsfläche spürbar zu vergrößern, und ist meist ein Zeichen, dass eine Geräteuhr repariert werden muss.

Zwei Eigenschaften sind es wert, beim Einsatz beachtet zu werden. Ein Code bleibt für sein ganzes Fenster gültig, sodass ein abgefangener Code innerhalb dieses Fensters wiedergegeben werden kann, sofern der Server genutzte Zähler nicht als verbraucht markiert. Und das Secret ist symmetrisch: Wer die server-seitige Kopie hält, kann für immer gültige Codes erzeugen, also braucht es denselben Schutz wie eine Passwort-Datenbank — verschlüsselt im Ruhezustand, nie protokolliert, nie in einem Git-Repo.

Open-Source-Hinweis: implementiert mit der browser-eigenen Web Crypto (crypto.subtle) API und einem Base32-Decoder von Grund auf. Keine Drittanbieter-Bibliotheken.

FAQ

Kann das meine Authenticator-App ersetzen?
Es ist nützlich zum Testen und zum Wiederherstellen eines Codes, wenn Ihr Telefon nicht verfügbar ist, aber ein Browser-Tab ist kein sicherer Ort, um ein langlebiges gemeinsames Secret aufzubewahren.
Warum wird mein Code abgelehnt?
Fast immer Uhr-Drift. TOTP leitet den Code aus der aktuellen UNIX-Zeit ab, also erzeugt ein Gerät, das mehr als ein 30-Sekunden-Schritt vom Server entfernt ist, einen Code, an dem der Server bereits vorbeigezogen ist.
Was stellt das Base32-Secret dar?
Es ist der gemeinsame Schlüssel, den beide Seiten halten. Base32 wird verwendet, weil es groß-/kleinschreibungsunabhängig ist und mehrdeutige Zeichen vermeidet, was es praktisch zum Eintippen oder Codieren in einem QR-Code macht.
Warum sind Codes sechs Stellen?
RFC 6238 kürzt den HMAC auf einen 31-Bit-Wert und nimmt ihn modulo 10^6. Sechs Stellen balancieren Bedienbarkeit gegen eine Eine-zu-Million-Rate pro Versuch, was Ratenbegrenzung weiter verringert.
Was ist der Unterschied zwischen TOTP und HOTP?
TOTP zählt 30-Sekunden-Zeitschritte; HOTP zählt Ereignisse und rückt nur vor, wenn ein Code genutzt wird. TOTP braucht synchronisierte Uhren, HOTP braucht synchronisierte Zähler.
Kann derselbe Code zweimal verwendet werden?
Er sollte nicht. Ein Code bleibt für seinen ganzen Zeitschritt gültig, also wird ein Server erwartet, den Schritt zu protokollieren, den ein Nutzer bereits verbraucht hat, und ein Replay abzulehnen.