i

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 so genannte 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:

QR-Code HOTP

Suche

v
5.3.6.2
schuljahr.inf-schule.de/aktuell/gesellschaft/passwoerter_theorie_und_praxis/zweifaktor_authentifizierung/hmac_based_one_time_password_hotp
schuljahr.inf-schule.de/aktuell/5.3.6.2

Rückmeldung geben