Ich übertrage häufig VM-Images von Hypervisoren zur Langzeitspeicherung auf einen Archivserver.
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 durch Ausführen sicher, dass keine Beschädigung vorliegt md5sum
auf dem Ziel und der Quelle.
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?
Aktualisieren:
- 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.
Antworten:
Sie können verwenden tee Um die Summe im Handumdrehen mit so etwas zu machen (passen Sie die netcat-Befehle an Ihre Bedürfnisse an):
Server:
Klient:
quelle
md5deep
hat einen "Chunk" -Modus ( md5deep.sourceforge.net/md5deep.html ), die hierfür nützlich sein können.Nerdwallers Antwort über die Verwendung
tee
Das gleichzeitige Übertragen und Berechnen einer Prüfsumme ist ein guter Ansatz, wenn Sie vor allem ü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 / Sek 1 .
Das geht eigentlich ziemlich schnell. Denken Sie daran, es sei denn, Sie haben eine Menge RAM, das muss aus dem Speicher zurückkommen. Das erste, was Sie überprüfen müssen, ist zuschauen
iostat -kx 10
wie Sie Ihre Prüfsummen ausführen; Insbesondere möchten Sie auf die%util
Säule. 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). Was die Geschwindigkeit angeht, kann man sie mit der vergleichen
openssl speed md4 md5 sha1 sha256
. Ich habe in SHA256 geworfen, um mindestens einen noch stark genug Hash zu haben.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 wollen (auf Kosten des Seins) trivial Um Korruption zu manipulieren und auch weniger zu erkennen, möchten Sie sich einen CRC oder Adler-Hash ansehen. 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.
Also ist Ihre beste Wette in Bezug auf die Geschwindigkeit
openssl md4 -r
(das-r
sieht aus wie md5sum output).Wenn Sie bereit sind, Kompilierung und / oder Minimalprogrammierung durchzuführen, lesen Sie Mark Adlers Code über Stack Overflow und auch xxhash . Wenn Sie über SSE 4.2 verfügen, 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.
quelle
shasum
stattdessen?Das
openssl
Befehl unterstützt mehrere Message Digests. Von denen konnte ich versuchen,md4
scheint in etwa 65% der Zeit zu laufenmd5
und ungefähr 54% der Zeit vonsha1
(für die eine Datei, mit der ich getestet habe).Es gibt auch eine
md2
in der Dokumentation, aber es scheint die gleichen Ergebnisse zu geben wiemd5
.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 eine
md1
, zum Beispiel)?Ein kleiner Punkt: Sie haben eine Nutzloser Gebrauch von
cat
. Eher, als:Sie können verwenden:
oder auch:
Dies spart einen Prozess, hat aber wahrscheinlich keine signifikanten Auswirkungen auf die Leistung.
quelle
cat
"Daher ist es nicht unbedingt ganz schlecht. Wenn es keinen Leistungsgewinn gibt, wenn Sie ihn vermeiden, ist es besser, mit dem zu arbeiten, mit dem Sie sich wohler fühlen, vorausgesetzt Sie wird der Betreuer dieses Codes sein.Zwei Optionen:
Benutzen
sha1sum
Unter bestimmten Umständen sha1sum ist schneller .
Benutzen
rsync
Die Übertragung dauert länger, aber rsync überprüft, ob die Datei intakt eingetroffen ist.
Von der rsync-Manpage
quelle
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:
quelle
Sie können wahrscheinlich nichts Besseres tun als einen guten Hash. Möglicherweise möchten Sie andere Hash- / Prüfsummenfunktionen ausprobieren um zu sehen, ob welche deutlich schneller sind als
md5sum
. 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 das hat den gleichen Hash-Wert wie ein vorhandener Wert (d. h. um das Manipulieren signierter E-Mails und anderer Dokumente zu erschweren). Wenn Sie nicht über einen Angriff auf Ihre Kommunikation besorgt sind, aber nur ein gewöhnlicher Kommunikationsfehler, So etwas wie eine zyklische Redundanzprüfung (CRC) ist möglicherweise 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 könnte die Gesamtzeit reduzieren, und könnte definitiv den Reizfaktor reduzieren zu warten, bis die Übertragung abgeschlossen ist, und warten Sie dann erneut, bis der MD5 fertig ist. Ich habe das noch nicht getestet, aber es sollte möglich sein, Folgendes zu tun:
Auf dem Quellcomputer:
Auf dem Zielcomputer:
Das Überprüfen der Dateigrößen ist natürlich eine gute und schnelle Methode, um festzustellen, ob Bytes verloren gegangen sind.
quelle
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.
quelle