Wie prüft man, ob eine Datei unverändert ist?
Eine Hashfunktion macht aus beliebigen Daten einen kurzen Fingerabdruck von fester Länge. Mit diesem Fingerabdruck prüfen Sie, ob Daten sich verändert haben.
Ein Beispiel: Sie laden ein Programm herunter, und die Webseite nennt eine Prüfsumme. Stimmt Ihre Prüfsumme überein, ist die Datei unterwegs nicht beschädigt oder ausgetauscht worden.
Am Ende dieser Lektion
Notiz
Ich kann mit einer Hashfunktion prüfen, dass Daten sich nicht verändert haben.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Hashfunktion | eine Rechenvorschrift, die aus beliebig langen Daten einen Wert fester Länge macht | SHA-256 |
| Hashwert | das Ergebnis einer Hashfunktion, auch Prüfsumme oder Fingerabdruck genannt | |
| Integrität | Daten sind vollständig und unverändert | |
| Lawineneffekt | eine winzige Änderung der Eingabe ändert fast den ganzen Hashwert | |
| Kollision | zwei verschiedene Eingaben mit demselben Hashwert | |
| Einwegfunktion | leicht zu berechnen, aber praktisch nicht umkehrbar |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Was eine Hashfunktion tut
Sie geben einen Text oder eine ganze Datei hinein. Heraus kommt eine Zeichenfolge, die immer gleich lang ist. Bei SHA-256 sind es 64 Zeichen aus Ziffern und den Buchstaben a bis f.
Dieselbe Eingabe ergibt immer denselben Hashwert. Der Hashwert verrät aber nichts über die Eingabe, die Sie nicht schon wissen.
Den Hashwert von „Hallo“ berechnen
printf 'Hallo' | sha256sumHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Was das Terminal ausgibt
Das Terminal gibt 64 Zeichen aus. Sie beginnen mit 753692ec. Dahinter folgt ein Leerzeichen und ein Strich, denn die Eingabe kam über die Pipe und nicht aus einer Datei.
Führen Sie den Befehl ein zweites Mal aus. Sie erhalten genau dieselbe Zeichenfolge.
Jetzt mit kleinem h statt großem H
printf 'hallo' | sha256sumHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Buchstabe ändert alles
| Eingabe | Anfang des Hashwerts | Gleiche Stellen wie bei „Hallo“ |
|---|---|---|
| Hallo | 753692ec | Vergleichswert |
| hallo | d3751d33 | Keine am Anfang |
| Hallo! | 357a57fe | Keine am Anfang |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
So prüfen Sie die Integrität einer Datei
Wer eine Datei anbietet, veröffentlicht ihren Hashwert. Sie berechnen den Hashwert Ihrer Kopie und vergleichen. Sind beide gleich, ist die Datei unverändert.
Das Werkzeug sha256sum -c liest eine Liste aus Hashwert und Dateiname und prüft jede Zeile für Sie. Gleich legen Sie eine Datei und ihre Liste an. Der Ordner scratch im Lab gehört Ihnen.
Eine Datei anlegen
printf 'Hallo' > scratch/gruss.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihre Prüfsummenliste schreiben
sha256sum scratch/gruss.txt > scratch/summen.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Liste prüfen
sha256sum -c scratch/summen.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Prüfung meldet OK
Das Terminal gibt scratch/gruss.txt: OK aus. Die Datei passt zu ihrer Liste.
Jetzt ändern Sie die Datei um ein einziges Zeichen. Danach prüfen Sie dieselbe Liste noch einmal.
Ein Ausrufezeichen anhängen
printf 'Hallo!' > scratch/gruss.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dieselbe Liste noch einmal prüfen
sha256sum -c scratch/summen.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Jetzt meldet die Prüfung FAILED
Das Terminal gibt scratch/gruss.txt: FAILED aus und darunter eine Warnung, dass eine Prüfsumme nicht passte. Ein einziges Zeichen genügt, damit die Prüfung auffällt.
Die Prüfung sagt nur, dass sich etwas geändert hat. Was, und wo, sagt sie nicht.
Welche Hashfunktion ist sicher genug?
Nicht jede Hashfunktion hält stand. Bei MD5 und SHA-1 haben Fachleute Kollisionen gefunden: zwei verschiedene Eingaben mit demselben Hashwert. Wer so etwas absichtlich baut, kann eine Datei austauschen, ohne dass die Prüfsumme sich ändert.
Nutzen Sie darum für alles, was einen Angriff abwehren soll, SHA-256 oder eine neuere Funktion.
Drei bekannte Hashfunktionen im Vergleich
| Funktion | Zeichen im Hashwert | Heute gegen Angriffe nutzbar? |
|---|---|---|
| MD5 | 32 | Nein, Kollisionen sind leicht zu bauen |
| SHA-1 | 40 | Nein, Kollisionen sind nachgewiesen |
| SHA-256 | 64 | Ja |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zum Vergleich: MD5 von „Hallo“
printf 'Hallo' | md5sumHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
MD5 ist kürzer, aber nicht sicher
Das Terminal gibt 32 Zeichen aus, sie beginnen mit d1bf9329. MD5 ist als Prüfung gegen zufällige Übertragungsfehler noch brauchbar.
Gegen eine Person, die Ihre Datei absichtlich austauscht, hilft MD5 nicht.
Ein häufiger Fehler
Warnung
Viele glauben, ein Hashwert sei eine Verschlüsselung, die man wieder öffnen kann. Das stimmt nicht. Aus dem Hashwert kommt der Text nicht zurück, denn ein Hashwert ist eine Einwegfunktion. Wer den Text raten will, rät ihn und hasht jeden Versuch.
Weiterführend: ein Hashwert mit Schlüssel
Ein Hashwert allein schützt nicht, wenn jemand die Datei und ihren Hashwert zusammen austauscht. Dafür gibt es den HMAC: ein Hashwert, in den ein geheimer Schlüssel eingeht.
Berechnen Sie in Python hmac.new(b"schluessel", b"Hallo", hashlib.sha256).hexdigest(). Ändern Sie den Schlüssel um einen Buchstaben und sagen Sie in einem Satz, warum eine fremde Person den neuen Wert nicht nachbauen kann.