Zwei-Faktor-Authentifizierung (2FA) oder allgemein Mehr-Faktor-Authentifizierung (MFA) hat in den letzten Jahren stark an Bekanntheit und Bedeutung zugenommen. In diesem Beiträge möchte ich mich auf das Time-based One-time Password (TOTP) Verfahren beschränken, dass wohl bekannteste Verfahren, welches in unzähligen Anwendungen Einzug gehalten hat. Das TOTP Verfahren wird beispielsweise von der 2FA Google Authenticator App verwendet. Viele werden es auch von den kleinen Hardware-Token kennen, welche alle 60 Sekunden ein neues Einmalpasswort generieren und anzeigen.
2FA: Wie funktioniert das TOTP Verfahren?
Das TOTP Verfahren wurde 2011 im Rahmen der Internet Engineering Task Force (IETF) als RFC 6238 veröffentlicht. Beim TOTP Algorithmus handelt es sich um eine Hashfunktion, in welcher ein geheimes Passwort zusammen mit der aktuellen Uhrzeit gehasht wird.
Hinter steckt der HMAC-based One-time Password Algorithmus nach RFC 4226 - vereinfacht gesagt nichts weiter als ein Standard, der auf bestimmte Weise einen Hash bildet.
Die Variable beinhaltet ein so genanntes "Shared Secret", also ein Passwort, dass sowohl dem Server als auch dem Client bekannt ist. lässt die aktuelle Zeit in die Berechnung einfließen:
ist üblicherweise der 1. Januar 1970, das gewünschte Intervall.
Anschließend wird das finale Einmalpasswort generiert:
steht für die gewünschte Anzahl Stellen des One-Time-Passwords, üblicherweise 6 oder 8.
Das Verfahren kann so implementiert werden, dass leichte Abweichungen der Uhrzeit zwischen Client und Server akzeptiert werden.
TOTP in der Praxis: Ein Benutzer aktiviert die 2-Faktor-Authentifizierung
Bevor der Nutzer sich beispielsweise auf seinem Smartphone ein Token generieren lassen kann, muss 2FA für den Benutzer eingerichtet und aktiviert werden. Im Rahmen der Einrichtung passieren 3 wichtige Schritte:
- Der Server generiert den für den Benutzer. Der Key sollte ausschließlich mit einem kryptographisch sicheren Zufallsgenerator erstellt werden. Auf keinem Fall darf hierbei ein Zufallszahlengenerator verwendet werden, der mit einem statischen Wert oder der aktuellen Uhrzeit initiiert ("geseedet") wurde. Der für jeden User einmalige muss sicher gespeichert werden.
- Der muss der 2FA App des Benutzers bekannt gemacht werden. Meist wird dies realisiert, indem der gemeinsam mit einigen beschreibenden Daten als QR-Code bereitgestellt wird.
- Die 2FA Code generiert einen Token, der zur Verifikation an den Server übertragen wird. Der Server vergleicht den Client Token mit dem von ihm generierten Token. Stimmen diese überein, kann 2FA für den Benutzer aktiviert werden.
Der QR-Code
Im zweiten Schritt habe ich von einem QR-Code gesprochen, also einem zweidimensionalem Code:
Der QR-Code beinhaltet den , den Issuer sowie eine kurze Beschreibung.
Sicherheit im Rahmen der Implementierung
Das beste Verfahren der Welt nützt nichts, wenn es nicht sauber implementiert wurde. Einige Tipps für eine sichere Implementierung:
- Zufallszahlengenerator: Es ist zwingend notwendig, für den ein kryptographisch sicheres, zufälliges Passwort zu generieren. In PHP kann hierfür beispielsweise die Funktion Random-Bytes verwendet werden.
- Jeder Benutzer benötigt einen eigenen . Das Verfahren ist hinfällig, wenn die komplette Webanwendung einen einheitlichen Key verwendet.
- Ein 6 oder 8 stelliges One-Time-Passwort ist klein. Es muss daher zwingend sichergestellt werden, dass der Nutzer nur X Versuche pro Intervall hat. Ein Brute-Force Angriff ist sonst innerhalb weniger Sekunden erfolgreich.
- Ein akzeptierter Key darf innerhalb des gleichen Intervalls kein zweites Mal akzeptiert werden (Schutz gegen Replay-Angriffe).
- Der Key sollte über HTTPS an den Webserver übertragen werden.
- Der QR-Code sollte auf dem lokalen Server generiert werden. Viele Webseiten nutzen für die QR-Code Generierung den Service von chart.googleapis.com, wovon ich abrate. Der sollte nicht unnötig verbreitet werden.
Bildnachweise:
- Beitragsbild: © everythingpossible - Fotolia.com