Checksum für Verzeichnis unter Linux oder BSD ermitteln

None

Im Zusammenhang mit Backups stellt sich oft die Frage, ob am Ziel auch die Dateien bzw. ihre Inhalte ankamen, wie sie sollten, um Problemquellen wie vergessene Verzeichnisse oder (noch fieser) vergessene hidden files aufzuspüren. Im Grunde geht es um einen simplen Integritätsschutz, der sich allerdings oft lediglich auf die Inhalte bezieht und gerade nicht auf Metadaten wie Rechte oder Change Time.

In diesem Zusammenhang in der Serie „StackOverflow-Frage der Woche“: How do I get the MD5 sum of a directory's contents as one sum?

Allerdings denken wir uns mal ganz schnell MD5 in dem Zusammenhang weg, da diese Hashfunktion bereits (theoretisch) angreifbar ist. Ich habe es gegen SHA512 ausgetauscht.

Inhalte vergleichen

Für Linux lässt sich in dem Zusammenhang folgendes Kommando verwenden:

find somedir -type f -exec sha512sum {} \; | sort -k 2 | sha512sum

Man sieht, dass diese Variante mit den coreutils auskommt und die Ergebnisse nur an das Checksum-Programm übergibt. Es werden alle Inhalte der Dateien gehasht und diese Hashes samt Dateinamen wiederum gehasht. Wegen letzterem sollte übrigens auch drauf geachtet werden, das Programm möglichst relativ zum Verzeichnis zu starten, damit in der Checksum-Liste Dateinamen wie "somedir/foo" statt "/home/user/somedir/foo" stehen. Diese Angaben beeinflussen nämlich auch den Gesamthash der Ausgabe und führen zu unterschiedlichen Hashes, wenn der absolute Pfad der zu vergleichenden Verzeichnisse unterschiedlich ist und/oder das Kommando von unterschiedlichen Stellen aufgerufen wurde.

Der Umweg über sort wird übrigens gewählt, damit die Hashliste der Dateien nicht zufällig, sondern deterministisch, ausgegeben wird, da – man kann es sich denken – auch das wieder den Gesamthash beeinflusst.

Da BSD find die reproduzierbare Auflistung von Haus aus beherrscht, ist der Weg dort sogar noch eleganter:

find -s somedir -type f -exec sha512sum {} \; | sha512sum

Dateien samt Metadaten vergleichen

Abschließend ist es natürlich auch möglich, die Metadaten miteinzubeziehen, wenn auf z.B. tar zurückgegriffen wird:

tar -cf - somedir | sha512sum

Quelle: Young, Warren. How do I get the MD5 sum of a directory's contents as one sum?. 2012. StackExchange. CC BY-SA

1 Kommentar

  • Simon

    Mindestens bei FreeBSD und NetBSD gibt es übrigens dafür das Tool "mtree" welches exakt für diesen Zweck geschrieben wurde. Unter Debian gibt es mtree als "mtree-netbsd" in den Paketquellen.

    Reply
Kommentar verfassen