Często przesyłam obrazy maszyn wirtualnych z hiperwizorów na serwer archiwum w celu długotrwałego przechowywania.
Przesyłam za pomocą netcata, ponieważ jest szybszy niż scp, rsync, itp.
hypervisor$ cat foo.box | nc <archive IP> 1234
archive$ nc -l -p 1234 > foo.box
Po zakończeniu przesyłania pliku sprawdzam, czy nie wystąpiło uszkodzenie, działając md5sum
zarówno na celu, jak i źródle.
Niestety uruchomienie md5sum na dużym pliku może zająć bardzo dużo czasu. Jak mogę szybciej porównać integralność dwóch dużych plików?
Aktualizacja:
- Moja transmisja rzadko jest przerywana, więc możliwość ponownego uruchomienia nie stanowi problemu.
- Przekazanie przez NC zajmuje zwykle 3-4 godziny, a następnie 40 minut, aby uzyskać sumę md5.
- W tym przypadku bezpieczeństwo skrótu nie stanowi problemu.
Odpowiedzi:
Możesz użyć tee do zrobienia sumy w locie za pomocą czegoś takiego (dostosuj polecenia netcat do swoich potrzeb):
Serwer:
Klient:
źródło
md5deep
ma tryb „chunk” ( md5deep.sourceforge.net/md5deep.html ), który może być do tego przydatny.Odpowiedź Nerdwallera na temat
tee
jednoczesnego przesyłania i obliczania sumy kontrolnej jest dobrym podejściem, jeśli martwisz się przede wszystkim o uszkodzenie w sieci. Nie ochroni cię jednak przed uszkodzeniem w drodze na dysk itp., Ponieważ pobiera sumę kontrolną, zanim trafi na dysk.Ale chciałbym coś dodać:
1 TiB / 40 minut ≈ 437 MiB / s 1 .
Właściwie to dość szybko. Pamiętaj, że jeśli nie masz dużo pamięci RAM, musi ona wrócić z pamięci. Pierwszą rzeczą do sprawdzenia jest obserwowanie,
iostat -kx 10
jak uruchamiane są sumy kontrolne; w szczególności chcesz zwrócić uwagę na%util
kolumnę. Jeśli ustawiasz dyski (prawie 100%), odpowiedzią jest zakup szybszej przestrzeni dyskowej.W przeciwnym razie, jak wspomniano w innych plakatach, możesz wypróbować różne algorytmy sumy kontrolnej. Wszystkie MD4, MD5 i SHA-1 są zaprojektowane jako skróty kryptograficzne (chociaż żadnego z nich nie należy już używać do tego celu; wszystkie są uważane za zbyt słabe). Jeśli chodzi o szybkość, możesz je porównać
openssl speed md4 md5 sha1 sha256
. Wrzuciłem SHA256, aby mieć przynajmniej jeden wystarczająco silny skrót.Z powyższego widać, że MD4 jest najszybszy, a SHA256 najwolniejszy. Ten wynik jest typowy przynajmniej na sprzęcie podobnym do komputera PC.
Jeśli chcesz jeszcze większej wydajności (kosztem bycia trywialnym do manipulacji, a także mniejszym prawdopodobieństwem wykrycia korupcji), chcesz spojrzeć na skrót CRC lub Adlera. Z tych dwóch Adler jest zazwyczaj szybszy, ale słabszy. Niestety nie znam żadnych naprawdę szybkich implementacji wiersza poleceń; wszystkie programy w moim systemie działają wolniej niż md4 OpenSSL.
Tak więc, najlepiej postawić na szybkość
openssl md4 -r
(-r
sprawia, że wygląda to jak wyjście md5sum).Jeśli chcesz trochę kompilować i / lub minimalnie programować, zobacz kod Mark Adlera w Stack Overflow, a także xxhash . Jeśli masz SSE 4.2, nie będziesz w stanie pokonać szybkości sprzętowej instrukcji CRC.
1 1 TiB = 1024⁴ bajtów; 1 MiB = 1024² bajtów. Dostarcza ≈417 MB / s przy mocy 1000 jednostek.
źródło
shasum
zamiast tego?openssl
Komenda obsługuje kilka streszczeń komunikatów. Z tych, które udało mi się wypróbować,md4
wydaje się , że działa w około 65% czasumd5
i około 54% czasusha1
(dla jednego pliku, z którym testowałem).md2
Dokumentacja znajduje się również w dokumentacji, ale wydaje się, że daje takie same wyniki jakmd5
.Z grubsza prędkość wydaje się być odwrotnie związana z jakością, ale ponieważ (prawdopodobnie) nie martwisz się, że przeciwnik stworzy celową kolizję, nie powinno to stanowić większego problemu.
Możesz rozejrzeć się za starszymi i prostszymi skrótami wiadomości (
md1
na przykład, czy istnieje )?Drobna uwaga: masz Bezużyteczne wykorzystanie
cat
. Zamiast:możesz użyć:
lub nawet:
Takie postępowanie oszczędza proces, ale prawdopodobnie nie będzie miało znaczącego wpływu na wydajność.
źródło
cat
Dlatego „bezużyteczny ” niekoniecznie jest całkowicie zły. Jeśli uniknięcie tego nie zwiększy wydajności, lepiej wybrać coś, z czym czujesz się lepiej, zakładając, że będziesz opiekunem tego kodu.Dwie opcje:
Posługiwać się
sha1sum
W niektórych okolicznościach sha1sum jest szybszy .
Posługiwać się
rsync
Transfer potrwa dłużej, ale rsync sprawdza, czy plik dotarł nienaruszony.
Ze strony podręcznika rsync
źródło
Nauka się rozwija. Wygląda na to, że nowa funkcja skrótu BLAKE2 jest szybsza niż MD5 (i kryptograficznie silniejsza do uruchomienia).
Odniesienie: https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html
Ze slajdów Zooko:
źródło
Prawdopodobnie nie możesz zrobić nic lepszego niż dobry skrót. Możesz sprawdzić inne funkcje skrótu / sumy kontrolnej, aby sprawdzić, czy są one znacznie szybsze niż
md5sum
. Pamiętaj, że możesz nie potrzebować czegoś tak silnego jak MD5. MD5 (i rzeczy takie jak SHA1) są zaprojektowane tak, aby były silne pod względem kryptograficznym, więc atakujący / oszust nie jest w stanie stworzyć nowego pliku, który ma taką samą wartość skrótu jak istniejąca wartość (tj. Utrudnia manipulowanie podpisanym e -maile i inne dokumenty). Jeśli nie obawiasz się ataku na twoją komunikację, ale tylko błąd komunikacji, to coś w rodzaju cyklicznej kontroli nadmiarowej (CRC) może być wystarczające. (Ale nie wiem, czy byłoby to szybsze.)Innym podejściem jest próba wykonania skrótu równolegle z przeniesieniem. Może to skrócić całkowity czas i zdecydowanie zmniejszyć czynnik podrażnienia związany z koniecznością oczekiwania na zakończenie transferu, a następnie ponownego oczekiwania na zakończenie MD5. Nie testowałem tego, ale powinno być możliwe zrobienie czegoś takiego:
Na maszynie źródłowej:
Na maszynie docelowej:
Oczywiście sprawdzanie rozmiarów plików to dobry, szybki sposób na wykrycie, czy jakieś bajty zostały upuszczone.
źródło
Wysyłanie dużych plików jest uciążliwe. Dlaczego nie spróbować podzielić plików generujących skrót dla każdego fragmentu, a następnie wysłać go do miejsca docelowego, a następnie sprawdzić skrót i dołączyć fragmenty.
Możesz także skonfigurować osobistą sieć BitTorrent. To zapewni, że całość dotrze bezpiecznie.
źródło