it-swarm.com.de

Wie kann ich überprüfen, ob eine 1-TB-Datei korrekt übertragen wurde?

Ich übertrage häufig VM Bilder von Hypervisoren auf einen Archivserver, um sie langfristig zu speichern.

Ich übertrage mit Netcat, da es schneller ist als scp, rsync, ect ..

hypervisor$ cat foo.box | nc <archive IP> 1234

archive$ nc -l -p 1234 > foo.box

Wenn die Übertragung der Datei abgeschlossen ist, stelle ich sicher, dass keine Beschädigung vorliegt, indem md5sum sowohl auf dem Ziel als auch auf der Quelle ausgeführt wird.

Leider kann das Ausführen einer md5sum für eine große Datei sehr lange dauern. Wie kann ich die Integrität von zwei großen Dateien schneller vergleichen?

Update:

  • Meine Übertragung wird selten unterbrochen, so dass ein Neustart kein Problem darstellt.
  • Die Übertragung per NC dauert in der Regel 3-4 Stunden und dann 40 Minuten, um die MD5-Summe zu erhalten.
  • Die Sicherheit des Hashs spielt in diesem Fall keine Rolle.
25
tbenz9

Sie können tee verwenden, um die Summe im laufenden Betrieb zu berechnen (passen Sie die netcat-Befehle an Ihre Bedürfnisse an):

Server:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )

Klient:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111
18
nerdwaller

Die Antwort von Nerdwaller über die Verwendung von tee zum gleichzeitigen Übertragen und Berechnen einer Prüfsumme ist ein guter Ansatz, wenn Sie in erster Linie über Korruption im Netzwerk besorgt sind. Es schützt Sie jedoch nicht vor Beschädigung auf dem Weg zur Festplatte usw., da es die Prüfsumme verwendet, bevor sie auf die Festplatte trifft.

Aber ich möchte noch etwas hinzufügen:

1 TiB/40 Minuten ≈ 437 MiB/Sek1.

Das geht eigentlich ziemlich schnell. Denken Sie daran, dass, wenn Sie nicht über eine Menge RAM verfügen, diese aus dem Speicher zurückkehren muss. Das erste, was Sie überprüfen müssen, ist, iostat -kx 10 zu beobachten, während Sie Ihre Prüfsummen ausführen. Insbesondere möchten Sie auf die Spalte %util achten. Wenn Sie die Datenträger fixieren (nahezu 100%), ist die Antwort der Kauf eines schnelleren Speichers.

Ansonsten können Sie, wie in anderen Postern erwähnt, andere Prüfsummenalgorithmen ausprobieren. MD4, MD5 und SHA-1 sind alle als kryptografische Hashes konzipiert (obwohl keines mehr für diesen Zweck verwendet werden sollte; alle gelten als zu schwach). Geschwindigkeitsmäßig können Sie sie mit openssl speed md4 md5 sha1 sha256 vergleichen. Ich habe in SHA256 geworfen, um mindestens einen noch stark genug Hash zu haben.

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md4              61716.74k   195224.79k   455472.73k   695089.49k   820035.58k
md5              46317.99k   140508.39k   320853.42k   473215.66k   539563.35k
sha1             43397.21k   126598.91k   283775.15k   392279.04k   473153.54k
sha256           33677.99k    75638.81k   128904.87k   155874.91k   167774.89k

Davon können Sie sehen, dass MD4 am schnellsten und SHA256 am langsamsten ist. Dieses Ergebnis ist zumindest für PC-ähnliche Hardware typisch.

Wenn Sie noch mehr Leistung (auf Kosten von Trivialität und einer geringeren Wahrscheinlichkeit der Erkennung von Korruption) möchten, sollten Sie sich einen CRC- oder Adler-Hash anschauen. Von den beiden ist Adler normalerweise schneller, aber schwächer. Leider sind mir keine wirklich schnellen Befehlszeilenimplementierungen bekannt. Die Programme auf meinem System sind alle langsamer als OpenSSLs md4.

Daher ist openssl md4 -r Ihre beste Wette in Bezug auf die Geschwindigkeit (der -r lässt es wie eine md5sum-Ausgabe aussehen).

Wenn Sie bereit sind, etwas zu kompilieren und/oder minimal zu programmieren, lesen Sie Mark Adlers Code bei Stack Overflow und auch xxhash . Wenn Sie SSE 4.2 haben, können Sie die Geschwindigkeit des Hardware-CRC-Befehls nicht übertreffen.


1 1 TiB = 1024 Bytes; 1 MiB = 1024² Bytes. Kommt zu ~ 417 MB/Sek. Mit einer Leistung von 1000 Einheiten.

10
derobert

Der Befehl openssl unterstützt mehrere Message Digests. Von denen, die ich ausprobieren konnte, scheint md4 in etwa 65% der Zeit von md5 und in etwa 54% der Zeit von sha1 zu laufen (für die eine Datei, mit der ich getestet habe).

Es gibt auch einen md2 in der Dokumentation, aber er scheint die gleichen Ergebnisse zu liefern wie md5.

In groben Zügen scheint die Geschwindigkeit in einem umgekehrten Verhältnis zur Qualität zu stehen, aber da Sie (wahrscheinlich) keine Bedenken haben, dass ein Gegner eine absichtliche Kollision hervorruft, sollte dies kein großes Problem sein.

Sie könnten sich nach älteren und einfacheren Nachrichtenübersichten umsehen (gab es zum Beispiel einen md1)?

Ein kleiner Punkt: Sie haben eine unbrauchbare Verwendung von cat . Eher, als:

cat foo.box | nc <archive IP> 1234

sie können verwenden:

nc <archive IP> 1234 < foo.box

oder auch:

< foo.box nc <archive IP> 1234

Dies spart einen Prozess, hat aber wahrscheinlich keine signifikanten Auswirkungen auf die Leistung.

9
Keith Thompson

Zwei Optionen:

Verwende sha1sum

sha1sum foo.box

Unter bestimmten Umständen ist sha1sum schneller .


Verwende rsync

Die Übertragung dauert länger, aber rsync überprüft, ob die Datei intakt eingetroffen ist.

Von der rsync-Manpage

Beachten Sie, dass rsync immer überprüft, ob jede übertragene Datei auf der Empfängerseite korrekt rekonstruiert wurde, indem eine Prüfsumme für die gesamte Datei überprüft wird, die beim Übertragen der Datei generiert wird ...

4
spuder

Die Wissenschaft macht Fortschritte. Es scheint, dass die neue BLAKE2-Hash-Funktion schneller als MD5 ist (und kryptografisch viel stärker zu booten ist).

Referenz: https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html

Von Zookos Folien:

 Zyklen pro Byte auf Intel Core i5-3210M (Ivy Bridge)
Funktionszyklen pro Byte
lange Nachricht 4096 B 64 B MD5 5.0 5.2 13.1 SHA1 4.7 4.8 13.7 SHA256 12.8 13.0 30.0 Keccak 8.2 8.5 26.0 BLAKE1 5.8 6.0 14.9 BLAKE2 3.5 3.5 9.3
3
Ninveh

Sie können wahrscheinlich nichts Besseres tun als einen guten Hash. Möglicherweise möchten Sie andere Hash-/Prüfsummenfunktionen überprüfen, um festzustellen, ob sie wesentlich schneller als md5sum sind. Beachten Sie, dass Sie möglicherweise nicht so etwas Starkes wie MD5 benötigen. MD5 (und Dinge wie SHA1) sind so konzipiert, dass sie kryptografisch stark sind. Daher ist es für einen Angreifer/Betrüger nicht möglich, eine neue Datei zu erstellen, die denselben Hash-Wert wie ein vorhandener Wert hat (dh es ist schwierig, signiertes e zu manipulieren) -Mails und andere Dokumente). Wenn Sie nicht über einen Angriff auf Ihre Kommunikation, sondern nur über einen normalen Kommunikationsfehler besorgt sind, ist möglicherweise eine zyklische Redundanzprüfung (CRC) ausreichend. (Aber ich weiß nicht, ob es schneller gehen würde.)

Ein anderer Ansatz besteht darin, zu versuchen, den Hash parallel zur Übertragung durchzuführen. Dies kann die Gesamtzeit verkürzen und auf jeden Fall den Irritationsfaktor verringern, dass auf den Abschluss der Übertragung gewartet werden muss und dann erneut auf den Abschluss des MD5 gewartet werden muss. Ich habe das noch nicht getestet, aber es sollte möglich sein, Folgendes zu tun:

  • Auf dem Quellcomputer:

     mkfifo myfifo 
     tee myfifo < quelldatei | nc dest_Hostport-Nummer & md5sum myfifo 
    
  • Auf dem Zielcomputer:

     mkfifo myfifo 
     nc -l -p port-Nummer | tee myfifo> dest_file & md5sum myfifo 
    

Das Überprüfen der Dateigrößen ist natürlich eine gute und schnelle Methode, um festzustellen, ob Bytes verloren gegangen sind.

2
Scott

Riesige Dateien zu verschicken ist ein Schmerz. Warum nicht versuchen, die Dateien zu zerlegen, die einen Hash für jeden Chunk erzeugen, und ihn dann an das Ziel senden und dann den Hash prüfen und die Chunks zusammenfügen?.

Sie können auch ein persönliches BitTorrent-Netzwerk einrichten. Das würde dafür sorgen, dass das Ganze sicher ankommt.

2
Gaurav Joseph