Zum Inhalt springen

Dateiintegrität prüfen: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Boenki (Diskussion | Beiträge)
K ok, auf deutsch: SEITENTITEL
 
(17 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{SEITENTITEL:md5sum}}
Um die Integrität von Dateien zu überprüfen, kann man mehrere Methoden verwenden. Die verbreitetste Methode zu Integritätsprüfung stellt das generieren und validieren einer SHA-Prüfsumme dar. {{wikipedia|Secure_Hash_Algorithm|SHA}} ist ein Algorithmus, der aus der Eingabe in form einer Zeichenkette oder einer Datei eine Prüfsumme (den so genannten „Hash“) berechnet.
Um die Integrität von Dateien zu überprüfen, kann man mehrere Methoden verwenden. Die verbreitetste Methode zu Integritätsprüfung stellt MD5 dar. MD5 ist ein Algorithmus, der aus der Eingabe (eine Datei, [[Umleitungen#Bezeichnungen|STDIN]], etc.) eine Prüfsumme (in der MD5-Terminologie „Hash“) berechnet.


Anhand dieses Hashes kann die Integrität der Datei überprüft werden indem z.B. nach dem Download der Datei dieser Hash erzeugt, und mit dem vom Anbieter angegebenen Hash verglichen wird. Wenn beide Hashes übereinstimmen, ist die Datei mit sehr hoher Wahrscheinlichkeit integer.
Anhand dieses Hashes kann die Integrität der Datei oder Zeichenkette überprüft werden indem z.B. nach dem Download einer Datei dieser Hash erzeugt wird, und man diesen mit dem vom Anbieter angegebenen Hash vergleicht. Wenn beide Hashes übereinstimmen, ist die Datei integer.
 
== Verfügbarkeit ==
Die nötigen Programme, um Hashes zur Integritätsprüfung von Dateien (oder auch einzelnen Strings) zu erstellen und Dateien oder Strings anhand dieser zu prüfen, sind Teil der {{paket|coreutils}} und müssen daher nicht explizit installiert werden.
 
{| class="wikitable sortable"
! Programm !! Sicher !! Hinweis
|-
| {{ic|b2sum}}
|style=background-color:#8ae234| ja
| Generiert einen 512 Bit langen Hash und gilt aktuell als sicher.
|-
| {{ic|md5sum}}
|style=background-color:#fcaf3e| [https://www.mscs.dal.ca/~selinger/md5collision/ nein]
| Gilt seit 2008 als vollständig gebrochen und unsicher.
|-
| {{ic|sha1sum}}
|style=background-color:#fcaf3e| [https://www.schneier.com/blog/archives/2015/10/sha-1_freestart.html nein]
| Ist mit Rechenleistung für Freestart-Kollisionsangriffe anfällig.
|-
| {{ic|sha224sum}}
|style=background-color:#fce94f| [https://www.onlinehashcrack.com/guides/cryptography-algorithms/understanding-sha-224-a-comprehensive-guide.php bedingt]
| Basiert auf SHA-256 aber generiert nur 224 Bit lange Hashes.
|-
| {{ic|sha256sum}}
|style=background-color:#8ae234| ja
| Teil der aktuell als sicher geltenden SHA-2-Algorithmusfamilie.
|-
| {{ic|sha384sum}}
|style=background-color:#8ae234| ja
| Teil der aktuell als sicher geltenden SHA-3-Algorithmusfamilie.
|-
| {{ic|sha512sum}}
|style=background-color:#8ae234| ja
| Teil der aktuell als sicher geltenden SHA-3-Algorithmusfamilie.
|}
 
== Verwendung ==
Die Syntax der Programme ist im allgemeinen identisch. Alle Beispiele im Artikel werden mittels {{ic|sha256sum}} dargestellt, lassen sich aber in dieser Form auch auf die anderen Programmaufrufe anwenden.


Alle in diesem Artikel verwendeten Hashes stellen exemplarische Werte dar oder wurden anhand von Testdateien ermittelt, die nach dem Erstellen des Artikels gelöscht wurden.
Alle in diesem Artikel verwendeten Hashes stellen exemplarische Werte dar oder wurden anhand von Testdateien ermittelt, die nach dem Erstellen des Artikels gelöscht wurden.


== Verfügbarkeit ==
=== Hash-Darstellung ===
Das Programm „md5sum“ gehört zu den so genannten „core utils“, und somit zur Grundinstallation eines Linux-Systems. Mittels dieses Tools können MD5-Hashes erzeugt und überprüft werden. Zudem stellen die meisten Programmier- und Scriptsprachen ebenfalls MD5-Funktionen zur Verfügung.
Die Programme generieren den Hash in der entsprechenden Länge, {{ic|sha256sum}} also mit 256 Bit. Der Hash wird dabei als Hexadezimalzahl in Form von ASCII-Zeichen ausgegeben und beim testen auch eingelesen.
 
Aus jeweils 4 Bit des Hashes wird ein Hexadezimalzeichen gebildet. Durch Aneinanderreihung dieser Zeichen entsteht aus einem 256 Bit langen Hash eine 64 Zeichen lange Hexadezimaldarstellung.
 
Da die einzelnen Programme nicht über die Möglichkeit verfügen, den Hash in seiner „Rohform“ auszugeben, kann man sich folgenden Workarounds bedienen. Der Aufruf selbst, und alle anderen Programme sind POSIX-konform. Es wird lediglich noch {{paket|bc}} als Extraprogramm benötigt.
 
sha256sum meine_testdatei.txt | awk '{print $1}' | fold -w2 | while read byte; do
  upper=$(echo "$byte" | tr 'a-f' 'A-F')
  bin=$(echo "ibase=16; obase=2; $upper" | bc)
  printf "%08d" "$bin"
done


Die gängigste Verwendung von MD5-Hashes ist die Integritätsprüfung von herunterladbaren Dateien. Dazu wird vom Anbieter der Datei neben dieser Datei ein MD5-Hash bereitgestellt. Nach dem Herunterladen wird für die heruntergeladene Datei ebenfalls ein MD5-Hash erstellt und überprüft, ob der vom Anbieter bereitgestellte Hash und der selbst-erzeugte Hash identisch sind.
Damit wird der Hash aus der üblichen Hexadezimalform in seine Binärform umgewandelt. Die Darstellung erfolgt mittels {{ic|0}} und {{ic|1}} für die einzelnen Bits. Es ist jedoch nicht üblich, diese Darstellung des Hashes zu verwenden und dient rein zu Erklärungszwecken.


Die meisten Downloadmanager verfügen ebenfalls über die Möglichkeit MD5-Hashes zu überprüfen. Auch [[Pacman]] verwendet für die Integritätsprüfung MD5.
{{hc|1=
sha256sum meine_testdatei.txt {{!}} awk '{print $1}' {{!}} fold -w2 {{!}} while read byte; do
  upper=$(echo "$byte" {{!}} tr 'a-f' 'A-F')
  bin=$(echo "ibase=16; obase=2; $upper" {{!}} bc)
  printf "%08d" "$bin"
done {{!}} fold -w75; echo
|2=
111000111111010010110010000010000011110011111101000010000001111001111101000
001011001000010101100100010101010010100111100100001111011000100010001010110
110111100011101000010100100101100010011101011010111001101100011001011101111
1000110011110101011000000100100
}}


== Verwendung ==
Zu Darstellungszwecken hier im Wiki, wurde der Aufruf noch um [[fold]] für die einfachere Darstellung im Codeblock, und ein einfaches {{ic|echo}} für einen abschließenden Zeilenumbruch erweitert.
Es gibt zwei Haupt-Verwendungsarten von md5sum, zum Einen das Erzeugen und Anzeigen von MD5-Hashes, zum Anderen das Prüfen einer Datei auf Integrität anhand eines bestehenden MD5-Hashes.


=== Erzeugen ===
=== Erzeugen ===
Die einfachste Verwendung stellt das Erzeugen und Anzeigen eines MD5-Hashes einer Datei dar.
Die einfachste Verwendung stellt das Erzeugen und Anzeigen eines Hashes einer Datei dar.


$ md5sum testfile
{{hc|sha256sum testfile|e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 testfile}}
1d38e0faac4f9a83d2775e0c20c275aa testfile


Der MD5-Hash von der Datei „testfile“ ist also „1d38e0faac4f9a83d2775e0c20c275aa“. Eine weitere Methode ist das direkte Eingeben von Informationen über STDIN.
Der Hash von der Datei {{ic|testfile}} ist also {{ic|e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855}}. Eine weitere Methode ist das direkte Eingeben von Informationen über STDIN.


$ md5sum
{{hc|sha256sum|Aus diesem Text wird nun ein Hash ermittelt.{{taste|enter}}, {{taste|Strg}}+{{taste|D}}
Aus diesem Text wird nun ein MD5-Hash ermittelt.
dc96b993e520003b2102b53007fbcc7e487f0dfe98973404a7eb2fd71d6c00e4 -}}
afdff141e572e2f9e92c53ee09238000  -
$ cat testfile | md5sum
1d38e0faac4f9a83d2775e0c20c275aa -


Hier wird ein mal ein Text eingegeben. Wenn die Eingabe vollständig ist, wird sie mittels Strg+D beendet. Daraufhin generiert md5sum den Hash. Im zweiten Beispiel wird die Datei „testfile“ direkt auf der Shell ausgegeben, und mittels Pipe an md5sum [[Umleitungen#Pipes|weitergegeben]]. Im zweiten Fall ist der Hash mit dem allerersten Beispiel identisch.
Sofern der String keinen Zeilenumbruch am Ende enthalten soll, geht dies auch, generiert dann aber einen anderen Hash. Zudem wird der Hash auf der gleichen Zeilen angezeigt.


Will man eine Prüfdatei erstellen, genügt es, wenn man die Ausgabe von md5sum in eine Datei umleitet.
{{hc|sha256sum|Aus diesem Text wird nun ein Hash ermittelt.{{taste|Strg}}+{{taste|D}}, {{taste|Strg}}+{{taste|D}}025349c88013e9476580884279c252a087b4ddd793c0f65ef09432f5a60c8772  -}}


$ md5sum testfile > testfile.md5
Auch kann man per [[Umleitungen|Ausgabeumleitung]] (hier am Beispiel von {{ic|ls}}) Ausgaben anderer Befehle als Eingabe verwenden.


Es hat sich eingebürgert, bei einzelnen Dateien die Prüfdatei genau so zu benennen, wie die zu prüfende Datei, und „.md5“ an den Dateinamen anzuhängen. Für die Funktionsweise von md5sum ist dies allerdings nicht von Bedeutung. Will man mehrere MD5-Hashes von Dateien zum Prüfen in die Prüfdatei schreiben, kann man einfach mehrere Dateinamen angeben.
{{hc|ls {{!}} sha256sum|26c131df1f064c2c329aeba7a5ef9b0c44fc9801ca4450978a0eb6d9b5662cfc  -}}


  $ md5sum * > mehreredateien.md5
Will man eine Prüfdatei erstellen, genügt es, wenn man die Ausgabe von {{ic|sha256sum}} in eine Datei umleitet.
md5sum: Desktop: Ist ein Verzeichnis
 
md5sum: testkram: Ist ein Verzeichnis
  sha256sum testfile > testfile.sha256
md5sum: zeugs: Ist ein Verzeichnis
 
[…]
Es hat sich eingebürgert, bei einzelnen Dateien die Prüfdatei genau so zu benennen, wie die zu prüfende Datei, und den verwendeten Algorithmus, im Beispiel also {{ic|.sha256}}, an den Dateinamen anzuhängen. Für die Funktionsweise der Programme ist dies allerdings nicht von Bedeutung. Will man mehrere Hashes von Dateien zum Prüfen in die Prüfdatei schreiben, kann man einfach mehrere Dateinamen angeben.
 
{{hc|sha256sum * > mehreredateien.sha256|
sha256sum: testkram: Ist ein Verzeichnis
sha256sum: zeugs: Ist ein Verzeichnis
[…]
}}


Verzeichnisse werden hier natürlich nicht mit in die Liste der zu prüfenden Dateien aufgenommen. Wenn man sich nun den Inhalt der Datei betrachtet, sieht man mehrere Hashes mit den dazugehörigen Dateinamen.
Verzeichnisse werden hier natürlich nicht mit in die Liste der zu prüfenden Dateien aufgenommen. Wenn man sich nun den Inhalt der Datei betrachtet, sieht man mehrere Hashes mit den dazugehörigen Dateinamen.


$ cat mehreredateien.md5
{{hc|cat mehreredateien.sha256|
1d38e0faac4f9a83d2775e0c20c275aa filename
5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561 filename
d62dbecba408d9fb056e38d1860a455e komplett.png
72223d043cd5cea11af4901e1908e6c29cc254de296a134afd7d9f6481fc9b71 komplett.png
1d38e0faac4f9a83d2775e0c20c275aa screenshot.png
8b6473e9836114615e0e78edb17d44b21de6d1b16e42013dd8590efbe06d1370 screenshot.png
58024bdbee7739233546bc6d6accf367  testfile
[…]
[…]
}}


Über einen „Trick“ können jedoch auch Dateien in Unterverzeichnissen berücksichtigt werden.
Über einen „Trick“ können jedoch auch Dateien in Unterverzeichnissen berücksichtigt werden.


  find . -type f -print0 | xargs -0 md5sum > MD5SUM
  find . -type f -print0 | xargs -0 sha256sum > mehreredateien.sha256


Die entsprechende Datei beinhaltet dann auch Dateien in Unterverzeichnissen.
Die entsprechende Datei beinhaltet dann auch Dateien in Unterverzeichnissen.


eff514a9c55bc6b8ce8e836ee0119441 ./Desktop/dateiA
{{hc|cat mehreredateien.sha256|
1d38e0faac4f9a83d2775e0c20c275aa ./filename
72223d043cd5cea11af4901e1908e6c29cc254de296a134afd7d9f6481fc9b71 ./komplett.png
ab55a144d95bc43b492cce938234af57 ./testkram/script.sh
5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561 ./filename
61383947e7868f2177ec1e6491095c98 ./testkram/wwwcheck
645516d485152f376f61e73d7219e2556ba983474e20f253c3fb3ec3ac8a8fe1 ./testkram/script.sh
  […]
210f9984c9766b1d31882e16844549d4684eecd45ac873eb949551e26789f9b9 ./testkram/wwwcheck
8b6473e9836114615e0e78edb17d44b21de6d1b16e42013dd8590efbe06d1370 ./screenshot.png
[…]
}}


Es ist allerdings sinnvoller, Verzeichnisse zu packen und für das erzeugte Archiv einen MD5-Hash zu generieren, als alle Dateien in Unterverzeichnissen zu erfassen. Damit das Prüfen erfolgreich ist, müssen alle Dateien später in der selben Verzeichnisstruktur vorhanden sein, wie beim Generieren der Prüfdatei.
Es ist allerdings sinnvoller, Verzeichnisse zu packen und für das erzeugte Archiv einen Hash zu generieren, als alle Dateien in Unterverzeichnissen zu erfassen. Damit das Prüfen erfolgreich ist, müssen alle Dateien später in der selben Verzeichnisstruktur vorhanden sein, wie beim Generieren der Prüfdatei.


Der Einfachheit halber wird in den nachfolgenden Beispielen allerdings nur das Prüfen einer einzelnen Datei behandelt. Das Prüfen mehrerer Dateien verhält sich allerdings analog dazu.
Der Einfachheit halber wird in den nachfolgenden Beispielen allerdings nur das Prüfen einer einzelnen Datei behandelt. Das Prüfen mehrerer Dateien verhält sich allerdings analog dazu.


=== Überprüfen ===
=== Überprüfen ===
Das Überprüfen von MD5-Hashes gestaltet sich genau so einfach, wie das Erzeugen von ebendiesem. Man benötigt lediglich die Datei, in der die Hashes nach dem o.a. Schema verzeichnet sind.
Das Überprüfen von Hashes gestaltet sich genau so einfach, wie das Erzeugen von ebendiesem. Man benötigt lediglich die Datei, in der die Hashes nach dem o.a. Schema verzeichnet sind.


$ md5sum -c filename.md5
{{hc|sha256sum -c filename.sha256|filename: OK}}
filename: OK


Es werden dann für alle Dateien die entsprechenden Resultate ausgegeben. Sollte der Hash von „filename“ in der Prüfdatei nicht mit dem von md5sum zum Testen selbständig generierten Hash übereinstimmen, wird eine Fehlermeldung ausgegeben.
Es werden dann für alle Dateien die entsprechenden Resultate ausgegeben. Sollte der Hash von {{ic|filename}} in der Prüfdatei nicht mit dem zum Testen selbständig generierten Hash übereinstimmen, wird eine Fehlermeldung ausgegeben.


$ md5sum -c filename.md5
{{hc|sha256sum -c filename.sha256|
filename: FEHLSCHLAG
filename: FEHLSCHLAG
md5sum: Warnung: die berechnete Prüfsumme passte NICHT
sha256sum: WARNUNG: 1 berechnete Prüfsumme passte NICHT
}}


Mittels des Parameters „-c“ wird md5sum angewiesen, die angegebene Datei als Prüfdatei zu verwenden. Im Beispiel ist dies die im ersten Teil generierte Prüfdatei „filename.md5“, in der sich ein Eintrag (der Eintrag für „filename“) befindet. Sollte eine der zu prüfenden Dateien nicht vorhanden sein, wird ebenfalls eine Fehlermeldung ausgegeben.
Mittels des Parameters „-c“ wird das jeweilige Programm angewiesen, die angegebene Datei als Prüfdatei zu verwenden. Im Beispiel ist dies die generierte Prüfdatei „filename.sha256“, in der sich ein Eintrag (der Eintrag für {{ic|filename}}) befindet. Sollte eine der zu prüfenden Dateien nicht vorhanden sein, wird ebenfalls eine Fehlermeldung ausgegeben.


$ md5sum -c filename.md5
{{hc|sha256sum -c filename.sha256|
md5sum: filenameblubb: Datei oder Verzeichnis nicht gefunden
sha256sum: filenameblubb: Datei oder Verzeichnis nicht gefunden
filename: FEHLSCHLAG bei open oder read
filenameblubb: FEHLSCHLAG öffnen oder lesen
md5sum: WARNUNG: die eine aufgeführte Datei konnte nicht gelesen werden
sha256sum: WARNUNG: 1 aufgeführte Datei konnte nicht gelesen werden
}}


Will man informiert werden, welche Zeilen in der übergebenen Prüfdatei nicht der Syntax gemäß formatiert sind, ist dies mit dem Parameter „-w“ beim Überprüfen möglich.
Will man informiert werden, welche Zeilen in der übergebenen Prüfdatei nicht der Syntax gemäß formatiert sind, ist dies mit dem Parameter „-w“ beim Überprüfen möglich.


$ md5sum -cw filename.md5
{{hc|sha256sum -cw filename.sha256|
md5sum: filename.md5: 1: nicht korrekt formatierte MD5‐Prüfsummenzeile
sha256sum: filename.sha256: 1: nicht korrekt formatierte SHA256‐Prüfsummenzeile
md5sum: filename.md5: keine korrekt formatierte MD5‐Prüfsummenzeile gefunden
sha256sum: filename.sha256: keine korrekt formatierte Prüfsummenzeile gefunden
n}}


Je nicht richtig formatierter Zeile wird ein Hinweis ausgegeben, um welche Zeile es sich handelt. Abschließend wird darüber auch noch mal eine Zusammenfassung ausgegeben. Die Syntax der Datei ist recht einfach.
Je nicht richtig formatierter Zeile wird ein Hinweis ausgegeben, um welche Zeile es sich handelt. Abschließend wird darüber auch noch mal eine Zusammenfassung ausgegeben. Die Syntax der Datei ist recht einfach.


  {md5hash} {flag}{dateiname}
  {hash} {flag}{dateiname}


An Anfang einer jeden Zeile steht der MD5-Hash gefolgt von einem Leerzeichen, nach dem Leerzeichen steht das Flag der Datei. Dies ist entweder ein Sternchen oder ein Leerzeichen, je nachdem ob die Datei als Binär- oder als Text-Datei eingelesen wurde. Direkt nach dem Flag folgt der Dateiname. Nach dem Dateinamen erfolgt ein Zeilenumbruch.
An Anfang einer jeden Zeile steht der Hash gefolgt von einem Leerzeichen, nach dem Leerzeichen steht das Flag der Datei. Dies ist entweder ein Sternchen oder ein Leerzeichen, je nachdem ob die Datei als Binär- oder als Text-Datei eingelesen wurde. Direkt nach dem Flag folgt der Dateiname. Nach dem Dateinamen erfolgt ein Zeilenumbruch.


== Binary und Text ==
=== Binary und Text ===
Beim Generieren und Prüfen von MD5-Hashes ermittelt md5sum selbständig, ob es sich um eine Datei mit binärem Inhalt, oder um eine Textdatei handelt. Bei der normalen Verwendung von md5sum ist eine Anpassung hier nicht nötig, daher wird diese Unterscheidung nur kurz angerissen.
Beim Generieren und Prüfen von Hashes ermittelt das jeweilige Programm selbständig, ob es sich um eine Datei mit binärem Inhalt, oder um eine Textdatei handelt. Bei der normalen Verwendung ist eine Anpassung hier nicht nötig, daher wird diese Unterscheidung nur kurz angerissen.


$ md5sum -b filename
{{hc|sha256sum -b filename|5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561 *filename}}
1d38e0faac4f9a83d2775e0c20c275aa *filename


Der Parameter -b“ definiert, dass alle Dateien, die eingelesen werden, als binär markiert werden, und zwar unabhängig von ihrem Inhalt. Durch ein Sternchen vor dem Dateinamen in der Hash-Liste wird die Datei als binär markiert. Der binary-Parameter hat keinen Einfluss auf den Erzeugten MD5-Hash. Dieses Verhalten ist zum Beispiel unter ''MS DOS'' Standard.
Der Parameter {{ic|-b}} definiert, dass alle Dateien, die eingelesen werden, als binär markiert werden, und zwar unabhängig von ihrem Inhalt. Durch ein Sternchen vor dem Dateinamen in der Hash-Liste wird die Datei als binär markiert. Der binary-Parameter hat keinen Einfluss auf den Erzeugten Hash. Dieses Verhalten ist zum Beispiel unter ''MS DOS'' Standard.


$ md5sum -t filename
{{hc|sha256sum -t filename|5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561 filename}}
1d38e0faac4f9a83d2775e0c20c275aa filename


Mittels des Parameters -t“ wird md5sum angewiesen, alle Dateien, die eingelesen werden, als Textdateien zu behandeln. Dies ist unter Linux Standard, unter anderen Systemen ist dies Standard beim einlesen von Dateien.
Mittels des Parameters {{ic|-t}} wird das jeweilige Programm angewiesen, alle Dateien, die eingelesen werden, als Textdateien zu behandeln. Dies ist unter Linux Standard, unter anderen Systemen ist dies Standard beim einlesen von Dateien.


== Weblinks ==
== Weblinks ==
* [http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5#Algorithmus Erläuterung des Algorithmus in der Wikipedia] {{sprache|de}}
* {{wikipedia|BLAKE_(Hashfunktion)|Informationen zur BLAKE-Hashfunktion von b2sum}}
* [http://md5-hash-online.waraxe.us/ Online-MD5-Hash-Generator] {{sprache|en}}
* {{wikipedia|Message-Digest_Algorithm_5|Informationen zum veraltetem MD5-Algorithmus}}
* [http://www.heise.de/security/Konsequenzen-der-erfolgreichen-Angriffe-auf-MD5--/artikel/121148 „Konsequenzen der erfolgreichen Angriffe auf MD5“, heise.de (Januar 2009)] {{sprache|de}}
* {{wikipedia|Secure_Hash_Algorithm|Informationen über die SHA-Algorithmusfamilie}}
* [http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html Liste verfügbarer MD5-Implementationen] {{sprache|en}}
 


[[Kategorie:Grundlagen]]
[[Kategorie:Grundlagen]]
[[Kategorie:Konsole]]
[[Kategorie:Konsole]]
[[Kategorie:Sicherheit]]
[[Kategorie:Sicherheit]]

Aktuelle Version vom 29. November 2025, 04:37 Uhr

Um die Integrität von Dateien zu überprüfen, kann man mehrere Methoden verwenden. Die verbreitetste Methode zu Integritätsprüfung stellt das generieren und validieren einer SHA-Prüfsumme dar. SHA ist ein Algorithmus, der aus der Eingabe in form einer Zeichenkette oder einer Datei eine Prüfsumme (den so genannten „Hash“) berechnet.

Anhand dieses Hashes kann die Integrität der Datei oder Zeichenkette überprüft werden indem z.B. nach dem Download einer Datei dieser Hash erzeugt wird, und man diesen mit dem vom Anbieter angegebenen Hash vergleicht. Wenn beide Hashes übereinstimmen, ist die Datei integer.

Verfügbarkeit

Die nötigen Programme, um Hashes zur Integritätsprüfung von Dateien (oder auch einzelnen Strings) zu erstellen und Dateien oder Strings anhand dieser zu prüfen, sind Teil der coreutils und müssen daher nicht explizit installiert werden.

Programm Sicher Hinweis
b2sum ja Generiert einen 512 Bit langen Hash und gilt aktuell als sicher.
md5sum nein Gilt seit 2008 als vollständig gebrochen und unsicher.
sha1sum nein Ist mit Rechenleistung für Freestart-Kollisionsangriffe anfällig.
sha224sum bedingt Basiert auf SHA-256 aber generiert nur 224 Bit lange Hashes.
sha256sum ja Teil der aktuell als sicher geltenden SHA-2-Algorithmusfamilie.
sha384sum ja Teil der aktuell als sicher geltenden SHA-3-Algorithmusfamilie.
sha512sum ja Teil der aktuell als sicher geltenden SHA-3-Algorithmusfamilie.

Verwendung

Die Syntax der Programme ist im allgemeinen identisch. Alle Beispiele im Artikel werden mittels sha256sum dargestellt, lassen sich aber in dieser Form auch auf die anderen Programmaufrufe anwenden.

Alle in diesem Artikel verwendeten Hashes stellen exemplarische Werte dar oder wurden anhand von Testdateien ermittelt, die nach dem Erstellen des Artikels gelöscht wurden.

Hash-Darstellung

Die Programme generieren den Hash in der entsprechenden Länge, sha256sum also mit 256 Bit. Der Hash wird dabei als Hexadezimalzahl in Form von ASCII-Zeichen ausgegeben und beim testen auch eingelesen.

Aus jeweils 4 Bit des Hashes wird ein Hexadezimalzeichen gebildet. Durch Aneinanderreihung dieser Zeichen entsteht aus einem 256 Bit langen Hash eine 64 Zeichen lange Hexadezimaldarstellung.

Da die einzelnen Programme nicht über die Möglichkeit verfügen, den Hash in seiner „Rohform“ auszugeben, kann man sich folgenden Workarounds bedienen. Der Aufruf selbst, und alle anderen Programme sind POSIX-konform. Es wird lediglich noch bc als Extraprogramm benötigt.

sha256sum meine_testdatei.txt | awk '{print $1}' | fold -w2 | while read byte; do
  upper=$(echo "$byte" | tr 'a-f' 'A-F')
  bin=$(echo "ibase=16; obase=2; $upper" | bc)
  printf "%08d" "$bin"
done

Damit wird der Hash aus der üblichen Hexadezimalform in seine Binärform umgewandelt. Die Darstellung erfolgt mittels 0 und 1 für die einzelnen Bits. Es ist jedoch nicht üblich, diese Darstellung des Hashes zu verwenden und dient rein zu Erklärungszwecken.

sha256sum meine_testdatei.txt | awk '{print $1}' | fold -w2 | while read byte; do
  upper=$(echo "$byte" | tr 'a-f' 'A-F')
  bin=$(echo "ibase=16; obase=2; $upper" | bc)
  printf "%08d" "$bin"
done | fold -w75; echo
111000111111010010110010000010000011110011111101000010000001111001111101000
001011001000010101100100010101010010100111100100001111011000100010001010110
110111100011101000010100100101100010011101011010111001101100011001011101111
1000110011110101011000000100100

Zu Darstellungszwecken hier im Wiki, wurde der Aufruf noch um fold für die einfachere Darstellung im Codeblock, und ein einfaches echo für einen abschließenden Zeilenumbruch erweitert.

Erzeugen

Die einfachste Verwendung stellt das Erzeugen und Anzeigen eines Hashes einer Datei dar.

sha256sum testfile
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  testfile

Der Hash von der Datei testfile ist also e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855. Eine weitere Methode ist das direkte Eingeben von Informationen über STDIN.

sha256sum
Aus diesem Text wird nun ein Hash ermittelt.↵ Enter, Strg+D
dc96b993e520003b2102b53007fbcc7e487f0dfe98973404a7eb2fd71d6c00e4  -

Sofern der String keinen Zeilenumbruch am Ende enthalten soll, geht dies auch, generiert dann aber einen anderen Hash. Zudem wird der Hash auf der gleichen Zeilen angezeigt.

sha256sum
Aus diesem Text wird nun ein Hash ermittelt.Strg+D, Strg+D025349c88013e9476580884279c252a087b4ddd793c0f65ef09432f5a60c8772  -

Auch kann man per Ausgabeumleitung (hier am Beispiel von ls) Ausgaben anderer Befehle als Eingabe verwenden.

ls | sha256sum
26c131df1f064c2c329aeba7a5ef9b0c44fc9801ca4450978a0eb6d9b5662cfc  -

Will man eine Prüfdatei erstellen, genügt es, wenn man die Ausgabe von sha256sum in eine Datei umleitet.

sha256sum testfile > testfile.sha256

Es hat sich eingebürgert, bei einzelnen Dateien die Prüfdatei genau so zu benennen, wie die zu prüfende Datei, und den verwendeten Algorithmus, im Beispiel also .sha256, an den Dateinamen anzuhängen. Für die Funktionsweise der Programme ist dies allerdings nicht von Bedeutung. Will man mehrere Hashes von Dateien zum Prüfen in die Prüfdatei schreiben, kann man einfach mehrere Dateinamen angeben.

sha256sum * > mehreredateien.sha256
sha256sum: testkram: Ist ein Verzeichnis
sha256sum: zeugs: Ist ein Verzeichnis
[…]

Verzeichnisse werden hier natürlich nicht mit in die Liste der zu prüfenden Dateien aufgenommen. Wenn man sich nun den Inhalt der Datei betrachtet, sieht man mehrere Hashes mit den dazugehörigen Dateinamen.

cat mehreredateien.sha256
5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561  filename
72223d043cd5cea11af4901e1908e6c29cc254de296a134afd7d9f6481fc9b71  komplett.png
8b6473e9836114615e0e78edb17d44b21de6d1b16e42013dd8590efbe06d1370  screenshot.png
[…]

Über einen „Trick“ können jedoch auch Dateien in Unterverzeichnissen berücksichtigt werden.

find . -type f -print0 | xargs -0 sha256sum > mehreredateien.sha256

Die entsprechende Datei beinhaltet dann auch Dateien in Unterverzeichnissen.

cat mehreredateien.sha256
72223d043cd5cea11af4901e1908e6c29cc254de296a134afd7d9f6481fc9b71  ./komplett.png
5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561  ./filename
645516d485152f376f61e73d7219e2556ba983474e20f253c3fb3ec3ac8a8fe1  ./testkram/script.sh
210f9984c9766b1d31882e16844549d4684eecd45ac873eb949551e26789f9b9  ./testkram/wwwcheck
8b6473e9836114615e0e78edb17d44b21de6d1b16e42013dd8590efbe06d1370  ./screenshot.png
[…]

Es ist allerdings sinnvoller, Verzeichnisse zu packen und für das erzeugte Archiv einen Hash zu generieren, als alle Dateien in Unterverzeichnissen zu erfassen. Damit das Prüfen erfolgreich ist, müssen alle Dateien später in der selben Verzeichnisstruktur vorhanden sein, wie beim Generieren der Prüfdatei.

Der Einfachheit halber wird in den nachfolgenden Beispielen allerdings nur das Prüfen einer einzelnen Datei behandelt. Das Prüfen mehrerer Dateien verhält sich allerdings analog dazu.

Überprüfen

Das Überprüfen von Hashes gestaltet sich genau so einfach, wie das Erzeugen von ebendiesem. Man benötigt lediglich die Datei, in der die Hashes nach dem o.a. Schema verzeichnet sind.

sha256sum -c filename.sha256
filename: OK

Es werden dann für alle Dateien die entsprechenden Resultate ausgegeben. Sollte der Hash von filename in der Prüfdatei nicht mit dem zum Testen selbständig generierten Hash übereinstimmen, wird eine Fehlermeldung ausgegeben.

sha256sum -c filename.sha256
filename: FEHLSCHLAG
sha256sum: WARNUNG: 1 berechnete Prüfsumme passte NICHT

Mittels des Parameters „-c“ wird das jeweilige Programm angewiesen, die angegebene Datei als Prüfdatei zu verwenden. Im Beispiel ist dies die generierte Prüfdatei „filename.sha256“, in der sich ein Eintrag (der Eintrag für filename) befindet. Sollte eine der zu prüfenden Dateien nicht vorhanden sein, wird ebenfalls eine Fehlermeldung ausgegeben.

sha256sum -c filename.sha256
sha256sum: filenameblubb: Datei oder Verzeichnis nicht gefunden
filenameblubb: FEHLSCHLAG öffnen oder lesen
sha256sum: WARNUNG: 1 aufgeführte Datei konnte nicht gelesen werden

Will man informiert werden, welche Zeilen in der übergebenen Prüfdatei nicht der Syntax gemäß formatiert sind, ist dies mit dem Parameter „-w“ beim Überprüfen möglich.

sha256sum -cw filename.sha256
sha256sum: filename.sha256: 1: nicht korrekt formatierte SHA256‐Prüfsummenzeile
sha256sum: filename.sha256: keine korrekt formatierte Prüfsummenzeile gefunden
n

Je nicht richtig formatierter Zeile wird ein Hinweis ausgegeben, um welche Zeile es sich handelt. Abschließend wird darüber auch noch mal eine Zusammenfassung ausgegeben. Die Syntax der Datei ist recht einfach.

{hash} {flag}{dateiname}

An Anfang einer jeden Zeile steht der Hash gefolgt von einem Leerzeichen, nach dem Leerzeichen steht das Flag der Datei. Dies ist entweder ein Sternchen oder ein Leerzeichen, je nachdem ob die Datei als Binär- oder als Text-Datei eingelesen wurde. Direkt nach dem Flag folgt der Dateiname. Nach dem Dateinamen erfolgt ein Zeilenumbruch.

Binary und Text

Beim Generieren und Prüfen von Hashes ermittelt das jeweilige Programm selbständig, ob es sich um eine Datei mit binärem Inhalt, oder um eine Textdatei handelt. Bei der normalen Verwendung ist eine Anpassung hier nicht nötig, daher wird diese Unterscheidung nur kurz angerissen.

sha256sum -b filename
5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561 *filename

Der Parameter -b definiert, dass alle Dateien, die eingelesen werden, als binär markiert werden, und zwar unabhängig von ihrem Inhalt. Durch ein Sternchen vor dem Dateinamen in der Hash-Liste wird die Datei als binär markiert. Der binary-Parameter hat keinen Einfluss auf den Erzeugten Hash. Dieses Verhalten ist zum Beispiel unter MS DOS Standard.

sha256sum -t filename
5de982509b99fba3048192d3c532991a2e8c2db1c2b9a487b0faea057319e561  filename

Mittels des Parameters -t wird das jeweilige Programm angewiesen, alle Dateien, die eingelesen werden, als Textdateien zu behandeln. Dies ist unter Linux Standard, unter anderen Systemen ist dies Standard beim einlesen von Dateien.