Wie erstelle und validiere ich Dateiprüfsummen effizient?

Wie erstelle und validiere ich Dateiprüfsummen effizient?

Ich möchte in der Lage sein, Prüfsummen für umfangreiche Dateisammlungen zu erfassen und zu validieren, die normalerweise in einer komplexen Verzeichnishierarchie verschachtelt sind.

Benötigt jede einzelne Datei eine Prüfsumme? Gibt es Möglichkeiten, die vorhandene Verzeichnisstruktur zu nutzen, um beispielsweise nur einen Knoten im Dateibaum und nicht unbedingt jede Datei darin zu validieren?

Antwort1

Die effizienteste Art, Prüfsummen zu verwenden, besteht darin, den Computer alles machen zu lassen. Verwenden Sie ein Dateisystem wie ZFS, das alle Daten beim Schreiben prüft (genauer gesagt verwendet es Hashes, die stärker sind als Prüfsummen) und sie bei jedem Lesen der Daten überprüft. Der Nachteil besteht natürlich darin, dass ZFS nicht weiß, wann das Löschen oder Überschreiben einer Datei ein Fehler und wann es normal ist. Da ZFS jedoch für alles die Copy-on-Write-Semantik verwendet, können Sie die Snapshotting-Funktion verwenden, um das Risiko zu verringern.

ZFS kann außerdem automatisch Daten wiederherstellen, die eine Hash-Prüfung nicht bestehen, indem es die von Ihnen eingerichtete Redundanz nutzt, sei es Parität im RAID-5-Stil, Laufwerksspiegelungen oder doppelte Kopien (fügen Sie jedem ZFS-Dateisystem die Eigenschaft copies=N hinzu, und es werden N Kopien aller Daten gespeichert, die Sie schreiben). Außerdem werden die Hashes in einem Merkle-Baum gespeichert, wobei der Hashwert einer Datei von den Hashes der Blöcke abhängt, der Hash eines Verzeichniseintrags von den Hashwerten der darin enthaltenen Dateien und Verzeichnisse, der Hash eines Dateisystems vom Hash des Stammverzeichnisses usw.

Unabhängig davon, für welche Lösung Sie sich letztendlich entscheiden, werden Sie unweigerlich feststellen, dass der Prozess durch die Geschwindigkeit Ihrer Festplatten und nicht durch die Geschwindigkeit Ihrer CPU begrenzt wird.

Vergessen Sie auch nicht, die BER Ihrer Festplatten zu berücksichtigen. Sie sind schließlich bloß rotierende Rostplatten. Ein Laufwerk auf Verbraucherebene hat eine Fehlerrate von 1 falsch gelesenem Bit pro 10^14 gelesenen Bits, was 1 Bit pro 11 gelesenen Terabyte entspricht. Wenn Sie einen 11 Terabyte großen Datensatz haben und den Hash jeder Datei darin berechnen, haben Sie eine dieser Prüfsummen falsch berechnet und einen Block einer der Dateien im Datensatz dauerhaft beschädigt. ZFS kennt jedoch den Hash jedes Blocks, den es auf jede Festplatte in Ihrem Pool geschrieben hat, und weiß daher, welcher Block verloren gegangen ist. Es kann dann die Redundanz (Parität, Spiegelungen oder zusätzliche Kopien) in Ihrem Pool verwenden, um die Daten in diesem Block mit den richtigen Werten neu zu schreiben. Diese Sicherheitsfunktionen gelten auch, wenn Sie zfs send oder receive verwenden, um Daten von Ihrem primären System in die Backups zu kopieren.

Ben bringt in den Kommentaren jedoch einen guten Punkt vor. ZFS legt dem Benutzer keine der Hashwerte offen, die es berechnet, daher sollten Daten, die ein ZFS-System betreten oder verlassen, von Hashes begleitet werden. Mir gefällt, wie das Internet Archive dies mit einer XML-Datei macht, die jedes Element im Archiv begleitet. Siehehttps://ia801605.us.archive.org/13/items/fakebook_the-firehouse-jazz-band-fake-book/fakebook_the-firehouse-jazz-band-fake-book_files.xmlals Beispiel.

Antwort2

Vielleicht ist dies ein guter Zeitpunkt, um das Thema anzusprechenSteck es ein. Dies ist ein sehr einfaches, aber leistungsstarkes Dateipaketformat, das für die Archivierung, Langzeitaufbewahrung und Übertragung digitaler Objekte vorgesehen ist. Zu den Benutzern zählen die Library of Congress und die California Digital Library.

Ein BagIt-Tool (es gibt sie in mehreren Programmiersprachen) fügt Ihre Dateien in eine bestimmte Verzeichnisstruktur ein und führt die Prüfsummenberechnung/Hashing für Sie durch. Das ist alles.

PS: Natürlich können BagIt-Tools auch Bags anhand der enthaltenen Prüfsummen/Hashes überprüfen und Sie können Bags einige Metadaten hinzufügen. Aber komplexer werden Bags nicht.

Antwort3

Ich würde für jede Datei eine Prüfsumme generieren. Prüfsummen sind sehr klein und das Generieren einer Prüfsumme für das gesamte Verzeichnis würde erfordern, dass Sie auch jede Datei verarbeiten (zumindest wenn Sie nicht von Verzeichnisprüfsummen sprechen, die nur aus Verzeichniseinträgen erstellt werden – ich würde sie auch erstellen, um sicherzustellen, dass keine Daten gelöscht werden).

Angenommen, Sie haben eine Prüfsumme für das gesamte Archiv. Sie wissen, dass die Daten beschädigt sind, aber Sie wissen nicht, ob es sich nur um eine Datei handelt und, was noch wichtiger ist, um welche davon. Separate Prüfsummen geben Ihnen mehr Flexibilität. Sie können einzelne beschädigte Dateien erkennen und sie durch die Datei aus einem anderen Backup ersetzen (was wiederum andere Dateien beschädigen kann).

Auf diese Weise ist die Überlebenschance Ihrer Daten größer.

Antwort4

Ich habe die Antworten durchgesehen, und obwohl mir die Idee gefällt, sich bei der Behandlung von Datenschichtfehlern auf ZFS zu verlassen, besteht immer noch das Problem, dass die Dateien entweder versehentlich oder böswillig geändert werden. ZFS schützt Sie in diesem Fall nicht, und wie jemand anderes erwähnt hat, erhalten Sie keinen für den Benutzer sichtbaren „Hash“, den Sie zur externen Validierung an einem anderen Ort speichern können.

Es gibt eine Linux-Anwendung namens TripWire, die häufig zur Überwachung von System-Programmdateien verwendet wurde, um sicherzustellen, dass sie nach einem Angriff nicht geändert wurden. Dieses Projekt wurde anscheinend inzwischen aufgegeben, aber es gibt ein neues namens AIDE (Advanced Intrusion Detection Environment), das auf ServerFault empfohlen wird:

https://serverfault.com/questions/62539/tripwire-and-alternatives

Bei der Installation wird es alle x Minuten ausgeführt (vom Benutzer konfigurierbar) und überprüft alle von Ihnen angegebenen Ordner auf Änderungen in den Dateien. Es muss einmal ausgeführt werden, um alle Datei-Hashes zu berechnen. Danach werden alle Hashes mit der aktuellen Datei verglichen und sichergestellt, dass sie immer noch gleich sind. Sie können angeben, welche Art von Hash oder Hash-Kombination verwendet werden soll (ich würde nichts Schwächeres als SHA-256 empfehlen), welche Dateiattribute verwendet werden sollen (Inhalt, Größe, geänderter Zeitstempel usw.), wie oft geprüft wird, wie/wo die Hash-Datenbank gespeichert werden soll usw.

Manche halten das vielleicht für übertrieben, aber je nach den Anforderungen des OP kann es ihm mehr Sicherheit geben, dass die von ihm gespeicherten Daten nach einem bestimmten Zeitpunkt dieselben bleiben.

verwandte Informationen