i

Passwörter - Theorie und Praxis

Zählerbasierte Einmalpasswörter

Sowohl Alice als auch Bob mögen gerne Informatik. Daher wählen sie eine etwas technische Lösung, die aber den Vorteil hat, dass sie sich auch auf die Kommunikation im Internet übertragen läßt.

Um sich gegenseitig zu authentifizieren, vereinbaren Alice und Bob zunächst ein gemeinsames Geheimnis in Form einer zufällig generierten Zeichenkette:

    
    geheimnis = "6jp1lzxn3szn5vrurxnzru2p6j"
  

Anschließend tauschen sie dieses Geheimnis auf einem sichern Kommunikationskanal aus und verraten es niemandem sonst.

Nun können sie beliebig viele Einmalpasswörter generieren, in dem sie jeweils eine natürliche Zahl als Zähler an das Geheimnis anhängen und anschließend den SHA1-Hashwert der entstehenden Zeichenkette bilden.

Für das erste Einmalpasswort erhalten sie damit also in Pseudocode:

    
    sha1(geheimnis+"1") 
        = sha1(6jp1lzxn3szn5vrurxnzru2p6j1) 
        = '78ac011bbc1a46fb9863dcf9d9bbf415c4b24c6f'
  

Praktische Berechnung von SHA1-Haswerten

1. GNU/Linux-Shell:

    
    echo -n 'qwertz' | sha1sum
  

2. Python:

   
    import hashlib
    hashlib.sha1("qwertz".encode('utf-8')).hexdigest()
  

3. Suchmaschine DuckDuckGo:

   
    Im Suchfeld zum Beispiel eingeben: sha1 qwertz
  

Extraktion des Einmalpassworts

Da ein solcher Hashwert jedoch am Telefon etwas umständlich vorzulesen ist, erweitern sie ihr Verfahren noch wie folgt. Der SHA1-Hashwert ist ja ohnehin bereits die hexadezimale Darstellung einer Zahl. Deshalb rechnen sie diese Zahl in ihre dezimale Darstellung um und nehmen einfach die letzten 6 Stellen dieser Zahl als ihr Einmalpasswort.

Mit Python geht das wie folgt:

   
    int('78ac011bbc1a46fb9863dcf9d9bbf415c4b24c6f', 16) % 1000000
        = 688914717222949151341896154013744225868831673455 % 1000000
        = 673455
  

Damit bekommen sie als erstes Einmalpasswort also die sechsstellige Zahl "673455", welche sie am Telefon bequem vorlesen können.

Zusammenfassung

Mit Python erhält man das zeitbasierte Einmalpasswort in einem Schritt mit der folgenden Zeile:

   
   int( hashlib.sha1((geheimnis+"1").encode('utf-8')).hexdigest(), 16) % 1000000
        = 673455
    

Anmerkung

Aufgrund der Entwicklung immer schnellerer Rechner entspricht das SHA1-Verfahren nicht mehr den heutigen Anforderungen an ein sicheres Hashverfahren. Es wurde im obigen Beispiel lediglich zur Illustration der prinzipiellen Funktionsweise von zählerbasierten Einmalpasswörtern verwendet.
In tatsächlichen Anwendungen wird die sha1-Hashfunktion durch die so genannte HMAC-Hashfunktion ersetzt, worduch sich das so genannte HMAC-based One-time Password (HTOP) ergibt, welches in dem folgenden Unterabschnitt behandelt wird.

Aufgabe 1

Mit dem Index 16 sei die hexadezimale Darstellung, mit dem Index 10 die dezimale Darstellung einer Zahl bezeichnet. Rechne um:

$$1fa_{16} = ?_{10}$$ $$762_{10} = ?_{16}$$ $$45054_{10} = ?_{16}$$

Aufgabe 2

Berechne das 42. Einmalpasswort von Alice und Bob.

Suche

v
5.3.6.1
dev.inf-schule.de/gesellschaft/passwoerter_theorie_und_praxis/zweifaktor_authentifizierung/zaehlerbasierte_einmalpasswoerter
dev.inf-schule.de/5.3.6.1
dev.inf-schule.de/@/page/xrY1kL2D2cJBVodq

Rückmeldung geben