Passwörter - Theorie und Praxis
HMAC-based One-time Password (HOTP)
In tatsächlichen Anwendungen wird das zählerbasierte Einmalpasswort-Verfahren aus dem letzten Abschnitt wie folgt abgewandelt.
Statt des lediglich zu Illustrationszwecken (und heute unsicheren) SHA1-Hashverfahrens wird das sogenannte HMAC-Hashverfahren verwendet. Das sich ergebende Verfahren zu Generierung von Einmalpasswörtern wird daher HOTP (HMAC-based One-time Password) genannt.
Das folgende Python Programm zeigt eine Beispiel-Implementierung des HTOP-Algorithmus.
import hashlib, array, base64, hmac, time
def hotp(secret, counter, digits=6):
# Umkodierung secretvon utf-8 in base32
base32_secret = base64.b32decode(bytes(secret, 'utf-8'))
# Kodierung von counter in bytes
byte_counter = counter_2_bytes(counter)
# Bilde hmac-Hashwert
hmac_sha1 = hmac.new(base32_secret, byte_counter, hashlib.sha1).hexdigest()
# Extrahiere aus hmac-Hashwert ein Integerwert
# und gebe dessen letzte <digts> Stellen zurueck
return hmac_2_digits(hmac_sha1)[-digits:]
def counter_2_bytes(counter):
byte_counter = array.array('B')
for i in reversed(range(0, 8)):
byte_counter.insert(0, counter & 0xff)
counter >>= 8
return byte_counter
def hmac_2_digits(hmac_sha1):
offset = int(hmac_sha1[-1], 16)
binary = int(hmac_sha1[(offset * 2):((offset * 2) + 8)], 16) & 0x7fffffff
return str(binary)
secret='MZXW633PN5XW6MZX'
# HOTP
counter = 0
print( hotp(secret, counter) )
Das obige Programm wirkt auf den ersten Blick vielleicht etwas unübersichtlich, was daran liegt, dass das Geheimnis von der Python-Funktion mac.new
als base32 kodierter String erwartet wird. Außerdem wird zurückgegebene HMAC-Hashwert durch die Python-Funktion counter_2_bytes
auf recht komplexe Art in einen sechsstelligen Zahlenwert umgerechnet.
Es soll aber hier nicht darum gehen, das obige Programm in allen Einzelheiten zu verstehen, sondern eher darum, das fertige Programm für Tests und Experimente zu verwenden.
Wer möchte (und bereit ist, etwas Zeit zu investieren), kann sich in dem Dokument RFC 4226 aber auch anschauen, wie das HTOP-Verfahren im Detail funktioniert.
Aufgabe 1
Erzeuge mit dem obigen Programm die ersten 10 HTOP. Zur Kontrolle: Das HOTP Nr. 0 lautet 716402.
Aufgabe 2
Kontrolliere die Ergebnisse aus Aufgabe 1 mit einer App auf einem Mobiltelefon.
Dazu kannst du zum Beispiel die kostenlose App FreeOTP (Android, iPhone) verwenden. Unter Android kannst du auch die ebenfalls kostenlose App andOTP verwenden. Beide Apps findest du auch im F-Droid-Appstore.
Aufgabe 3
Finde heraus, was in dem folgenden QR-Code kodiert ist: