Ein TOTP Authenticator (aus dem Englischen: TOTP – Time-based One-time Password) generiert aus einem vorher ausgetauschten Geheimnis (meist über eine QR-Code) und der aktuellen Uhrzeit ein Einmalpassword. Dieses Password ändert sich alle 30 Sekunden.
Das Geheimnis ist ein 16 Zeichen langer Code, der eine Base32 Zeichenkette darstellt (z.B. VW2RFV4HTIDVO32J). Das heißt, dass hier nicht beliebige Zeichen sondern nur die 26 Großbuchstaben und die Zahlen 2-7 verwendet werden dürfen. Außerdem kann es auch sein, dass mit dem = Zeichen, auf ganze 16 Zeichen aufgefüllt wird. Diese Zeichenkette steht für eine 10 Byte lange Zahl. Das wird gemacht, weil nicht jeder Bytewert auch ein Zeichen besitzt das man über eine Tastatur eingeben kann. Es gibt somit 1.208.925.819.614.629.174.706.176 mögliche Geheimnisse.
Der Vorteil ist, dass ein Authenticator den man einmal das Geheimnis und die Uhrzeit gibt, für jeden Zeitpunkt ein Passwort erzeugen kann. Das Geheimnis muss nie wieder irgendwo eingetippt werden. Benutzt man einen Hardware Authenticator (ähnlich einem TAN Generator mit Kamera), braucht dieser niemals mit dem Internet verbunden werden.
Hat man allerdings eine Authenticator App, speichert diese das Geheimnis für mich hoffentlich sicher weg. Bei einer solchan App besteht das Risiko, dass protokolliert wird, bei welchen Internetdiensten ich mich authentifiziere und diese Daten auswertet und nutzt.
Mein Vorschlag also, nehmt dieses Python Programm und generiert euch selbst aus dem Geheimnis und der Uhrzeit euren 2. Faktor. Beim registrieren wird der 16 Stellige Code angezeigt oder steckt in dem QR Code, den man einfach mit dem Smartphone lesen kann. Dann kennt natürlich die Scanner App euer Geheimnis, da in dem QR-Code auch die Plattform und euer Login Name steht. Also besser abschreiben.
Ich weiß, das ist auch keine Sichere Lösung für das Problem, weil das Geheimnis offen auf der Festplatte herumliegt und im dümmsten Fall auch noch veröffentlicht wird. Ich wollte an diesen Beispiel zeigen, dass eine App dort kein Voodoo macht. Das Verfahren zur Berechnung ist Open Source. Die Qualität des Algorithmus ist für alle einsehbar, und die Sicherheit entsteht durch das mathematische Verfahren und ein gemeinsames Geheimnis. Bei Proprietärer Software könnte es sein, dass nur durch Geheimhaltung eines Algorithmus die Sicherheit generiert wird. Das geht so lange gut, bis der Algorithmus nicht mehr geheim ist.
import base64
import hmac
import struct
import sys
import time
def hotp(key, counter, digits=6, digest='sha1'):
key = base64.b32decode(key.upper() + '=' * ((8 - len(key)) % 8))
counter = struct.pack('>Q', counter)
mac = hmac.new(key, counter, digest).digest()
offset = mac[-1] & 0x0f
binary = struct.unpack('>L', mac[offset:offset+4])[0] & 0x7fffffff
return str(binary)[-digits:].zfill(digits)
def totp(key, time_step=30, digits=6, digest='sha1'):
return hotp(key, int(time.time() / time_step), digits, digest)
SECRET = 'VW2RFV4HTIDVO32J'
print(totp(SECRET))
# Quelle: https://github.com/susam/mintotp