Passwörter - Theorie und Praxis

Vertauensvolle Speicherung von Passwörtern

Unverschlüsselte Speicherung

In Betriebssystemen oder bei Diensten im Internet müssen in irgendeiner Form Informationen über die Passwörter der angemeldeten Nutzer gespeichert werden. Ein erster Ansatz dazu könnte zunächst sein, Passwörter einfach unverschlüsselt in einer einfachen Textdatei zu speichern:

Beispiel für eine unverschlüsselte Passwortdatei passwd.txt:

     
      mustermann:qwertz
      administrator:passw123
      root:fmvku76%d
      edward:jdjhfZhd8/6ei:dk*askd_ddk?(djsh%hdZH5:dk
    
  
Der Benutzer mit dem login „mustermann“ hat also das Passwort „qwertz“ usw.
Der Nachteil der unverschlüsselten Speicherung ist natürlich, dass jeder, der Lesezugriff auf die Passwortdatei bekommt, sofort die Passwörter von allen Nutzern im Klartext auslesen kann.

Deshalb sollten von verantwortungsbewussten Systemadministratoren Passwörter von Nutzern niemals im Klartext in Passwortdateien abgespeichert werden.

Verschlüsselte Speicherung

Passwörter lassen sich auch verschlüsselt abspeichern. Dazu werden die Klartextpasswörter mit einer kryptographischen Einwegfunktion, einer so genannten Hashfunktion, verschlüsselt. Mittels einer solchen Hashfunktion lassen sich Klartextpasswörter leicht und effizient zu so genannten Hashwerten verschlüsseln. Umgekehrt ist es aber praktisch unmöglich, aus einem vorgegebenen Hashwert das Klartextpasswort effizient zurückzuberechnen.

Das sogenannte SHA1-Hashverfahren ordnet einem beliebig langen Text einen 40 Byte langen hexadezimalen Hashwert zu. Für das Passwort des Benutzers „mustermann“ aus dem obigen Beispiel ergibt sich damit der folgende Hashwert:

sha1('qwertz') = 8c829ee6a1ac6ffdbcf8bc0ad72b73795fff34e8
Damit bekommt die gesamte Passwortdatei aus dem obigen Beispiel die folgende Form:

Beispiel für eine verschlüsselte Passwortdatei passwd.txt:

   
    mustermann:8c829ee6a1ac6ffdbcf8bc0ad72b73795fff34e8
    administrator:4de730479c592c0619802013bc9883dfbde67fea
    root:277c21563ade912ffa1f183f04ed482648790fed
    edward:712778715c24c68886ecf69d7191cc2acec05919
  

Wird eine verschlüsselte Passwortdatei verwendet, so kann ein potentieller Angreifer also die verschlüsselt gespeicherten Passwörter nicht im Klartext auslesen, selbst wenn er die komplette Passwortdatei erbeutet hat. Das gleiche gilt natürlich für den Systemadministrator des Computersystems.

Anmerkung 1:

Berechnung von SHA1-Hashwerten in einer GNU/Linux-Shell:
echo -n 'qwertz' | sha1sum
Berechnung von SHA1-Hashwerten in Python:
import hashlib hashlib.sha1("qwertz".encode('utf-8')).hexdigest()

Anmerkung 2:

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 Passwortdateien verwendet. Aktuelle Verfahren wie SHA512 erzeugen sehr viel längeren Hashwerte, so dass die Übersichtlichkeit der obigen Beispiel-Passwortdatei (für einen menschlichen Leser) damit erschwert wäre.

Aufgabe 1

Füge der obigen verschlüsselten Passwortdatei eine Zeile hinzu für die Benutzerin 'Constanze' mit dem Klartextpasswort 'Kurz'.

Aufgabe 2

Beschreibe detailliert, wie der Anmeldeprozess des Benutzers „mustermann“ bei Verwendung der oben angegebenen verschlüsselten Passwortdatei abläuft. Wann ist der Anmeldeprozess erfolgreich, wann ist schlägt er fehl?

Pepper

Werden gehashte Passwörter nach dem oben beschriebenen einfachen hashverfahren gespeichert, so ergibt sich allerdings das Problem, das sich die Hashwerte typischer Passwörter vorherberechnen und in so genannten Rainbowtables speichern lassen. Wird dann zu einem späteren Zeitpunkt eine gehashte Passwortdatei erbeutet, so können die dort gespeicherten Hashwerte einfach mit den vorherberechneten verglichen werden ohne dass dazu eine erneute zeitaufwendige Berechnung nötig wäre. Findet der Angreifer eine Übereinstimmung von Hashwerten, so hat er damit auch das zugehörige Klartextpasswort gefunden.

Um solche Angriffe auf Passwortdateien mittels Rainbowtables zu erschweren, wird ein so genanntes Pepper eingesetzt. Dazu werden die Klartextpasswörter pw um ein hinreichend lange Zeichenfolge, das so genannte Pepper p, ergänzt. Anschließend wird auf auf die konkateniert Zeichenfolge p+pw ein Hashverfahren wie z.B. SHA1 angewandt.

Beispiel:

   
    pw = 'qwertz'
    p    = '9cm9hsgkdcucz7ckdje-z7652cv_mnbsdsj_'
    sha1(p+pw) = sha1('9cm9hsgkdcucz7ckdje-z7652cv_mnbsdsj_qwertz') 
    = 5f684e914ba9840cd0a0b2af79251c476ec5ffc2
  

Mit dem Pepper p = '9cm9hsgkdcucz7ckdje-z7652cv_mnbsdsj_' bekommt die gesamte Passwortdatei aus dem obigen Beispiel damit die folgende Form. Beachte, dass für alle Passwörter das gleiche Pepper p verwendet wird.

Beispiel für eine verschlüsselte Passwortdatei passwd.txt mit Pepper:

   
    mustermann:5f684e914ba9840cd0a0b2af79251c476ec5ffc2
    administrator:a1becea837841197fb847940653c66b84859a576
    root:5f684e914ba9840cd0a0b2af79251c476ec5ffc2
    edward:6d47b7c8a88bc2e633d05d8defb0b76405859044
  

Wird nun die Passwortdatei durch einen Angreifer erbeutet, so ist für diesen nicht erkennbar, dass ein Pepper verwendet wurde. Aufgrund der hohen Entropie der um das Pepper verlängerten Klartextpasswörter funktioniert auch ein Angriff über vorherberechnete Rainbowtables nicht mehr.

Eine Schwachstelle des Hashen von Passwörtern mit Pepper entsteht aber, sobald ein Angreifer zusätzlich zur Passwortdatei auch noch das Pepper p erbeutet. Denn dann kann er z.B. Wörterbuch- oder Bruteforceangriffe starten, indem er die zu testenden Passwörter einfach vorher dem Hashen um das Pepper ergänzt und damit einen Rainbowtable für das erbeutete Pepper berechnet.

Ein Ausweg daraus bietet wiederum das Hashen der Passwörter mit einem so genannten Salt:

Aufgabe 1

Füge der obigen Passwortdatei mit Pepper eine Zeile hinzu für die Benutzerin 'Constanze' mit dem Klartextpasswort 'Kurz'. Verwende p = '9cm9hsgkdcucz7ckdje-z7652cv_mnbsdsj_' als Pepper.

Salt

Während beim Hashen von Passwörtern mit einem Pepper für die gesamte Passwortdatei ein festes Pepper verwendet wird, wird für Passwortdateien mit Salt für jedes Passwort ein unterschiedlicher so genanntes Salt s verwendet.

Beispiel:

   
    pw = 'qwertz'
    s    = 'dkkfjerfjc983883(7akfrjklfds8/akdjf=adfsh*'
    sha1(s+pw) = sha1('dkkfjerfjc983883(7akfrjklfds8/akdjf=adfsh*_qwertz') 
    = dkkfjerfjc983883(7akfrjklfds8/akdjf=adfsh*
  

Die Saltwerte werden dann jeweils zusammen mit dem Hashwert in der Passwortdatei gespeichert, so dass sich für das obige Beispiel dann eine Datei der folgenden Form ergibt:

Beispiel für eine verschlüsselte Passwortdatei passwd.txt mit Salt:

   
    mustermann:dkkfjerfjc983883(7akfrjklfds8/akdjf=adfsh*:dkkfjerfjc983883(7akfrjklfds8/akdjf=adfsh*
    administrator:aslkfa8e4jfsaksakfdjlalkdsfjdsa:286752d79187249ffa28d2068e460c2c12a8f093
    root:ivcjcxy8737dki9cyyxvjlkj28347askf:2e4fc670daa272fac4bf7d9c67fbdadddf55878a
    edward:aslkfj8vcx7j38h2983hfnc832fjc:55f2ee3ce9296cb9fbaa49581c998c26cbb0c6ce
  

Da für alle Passwörter unterschiedliche Saltwerte verwendet werden, müsste bei einem Rainbowtable-Angriff für jedes Passwort ein eigener kompletter Rainbowtable berechnet werden. Dies ist so aufwendig, dass ein solcher Angriff nicht effizient möglich ist.

Aufgabe 1

Füge der obigen Passwortdatei mit Salt eine Zeile hinzu für die Benutzerin 'Constanze' mit dem Klartextpasswort 'Kurz'. Verwende s=“dkcuec73&445djNdZ/736!“dhjd“ als Salt.

Aufgabe 2

Zum Hashen von Passwörtern mit Salt werden heute üblicherweise Hashverfahren verwendet, die den Hashwert in mehreren Berechnungsrunden ermitteln, um die nötige Berechnungsdauer künstlich zu verlängern. Begründe, warum dieses Vorgehen sinnvoll ist.

Aufgabe 3

Recherchiere, was man unter einer so genannten Shadow-Passwortdatei versteht. An welchem Ort im Dateisystem findet man in aktuellen GNU/Linux-Systemen die Passwortdatei und die Shadow-Passwortdatei? Recherchiere, welches Hashverfahren in einem aktuellen GNU/Linux-System in der Regel zur Speicherung von Passwortdateien verwendet wird.

X

Fehler melden

X

Suche