Przejdź do treści
HexaTransfer
Wróć do bloga
Szyfrowanie i bezpieczenstwo

Funkcje skrótu wyjaśnione: weryfikacja integralności plików

Funkcje skrótu są kluczowe do weryfikacji integralności po transferze. Jak SHA-256 i MD5 zapewniają niezmienione pliki.

Funkcja skrótu pobiera dowolne dane wejściowe i generuje wynik o stałym rozmiarze — SHA-256 zawsze daje dokładnie 256 bitów (32 bajty), niezależnie od tego, czy wejściem jest tweet czy wideo 10 GB. Zmień jeden bit wejścia, a zmieni się około połowy bitów wyjścia. Ta jednokierunkowa, deterministyczna właściwość sprawia, że skróty są standardowym narzędziem do weryfikacji integralności plików: oblicz SHA-256(plik) przed wysłaniem, oblicz ponownie po odebraniu, a jeśli skróty się zgadzają, plik dotarł nienaruszony. W ten sposób dystrybucje Linuksa weryfikują pobrane obrazy ISO, Git identyfikuje commity, a usługi takie jak HexaTransfer potwierdzają, że przesyłanie wielogigabajtowych plików zakończyło się bez uszkodzeń.

Co gwarantuje funkcja skrótu

Trzy właściwości definiują kryptograficzną funkcję skrótu:

  • Deterministyczna. Te same dane wejściowe zawsze dają ten sam wynik. SHA-256("hello") to zawsze 2cf24dba5fb0a30e....
  • Odporność na preinobraz. Mając skrót, nie możesz efektywnie znaleźć danych wejściowych, które go dają.
  • Odporność na kolizje. Nie możesz efektywnie znaleźć dwóch różnych danych wejściowych, które dają ten sam skrót.

Plus dwa przydatne zachowania:

  • Efekt lawinowy. Zmiana jednego bitu wejścia odwraca około 50% bitów wyjścia. Czyni skróty bezużytecznymi do wyszukiwania, ale doskonałymi do odcisków palca.
  • Stały rozmiar wyjścia. SHA-256 to 32 bajty, SHA-512 to 64 bajty, BLAKE2b to 64 bajty, niezależnie od rozmiaru danych wejściowych.

Skróty to nie szyfrowanie. Są jednokierunkowe — nie możesz odtworzyć danych wejściowych z wyjścia. O to właśnie chodzi.

Rodzina SHA

Rodzina Secure Hash Algorithm, znormalizowana przez NIST w FIPS 180-4 i FIPS 202:

  • SHA-1 — 160 bitów, złamany przez atak SHAttered Google w 2017 roku. Nie używaj do celów bezpieczeństwa.
  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512). Koń roboczy nowoczesnych systemów. SHA-256 dominuje.
  • SHA-3 (Keccak). Inna konstrukcja (gąbkowa, a nie Merkle-Damgård), znormalizowana w 2015 roku jako zabezpieczenie przed słabościami SHA-2, które się nie zmaterializowały.

SHA-256 to algorytm, którym podpisują certyfikaty TLS, którego Bitcoin używa do wydobycia, który Git stosuje (z planowanym przejściem na SHA-256 nadal w toku) i który usługi transferu plików obliczają do kontroli integralności. Przepustowość na nowoczesnych procesorach z rozszerzeniami SHA: 2–4 GB/s na rdzeń.

Dlaczego MD5 i SHA-1 są martwe dla celów bezpieczeństwa

MD5 (1991) generuje 128-bitowe skróty i był standardem do 2004 roku, gdy zademonstrowano kolizje. Do 2012 roku złośliwe oprogramowanie Flame sfałszowało certyfikaty podpisywania kodu Microsoft przy użyciu ataku kolizji MD5. Dziś możesz generować kolizje MD5 w sekundy na laptopie.

SHA-1 przetrwał dłużej, ale padł pod atakiem SHAttered Google w 2017 roku, który wyprodukował dwa pliki PDF z identycznymi skrótami SHA-1 po 110 GPU-latach obliczeń — teraz odtwarzalnych za mniej niż 100 000 USD na GPU w chmurze.

Oba nadal nadają się do zastosowań niezwiązanych z bezpieczeństwem: wykrywanie przypadkowego uszkodzenia, deduplikacja pamięci masowej, odciski palca kluczy pamięci podręcznej. Nie nadają się do podpisów cyfrowych, weryfikacji haseł ani czegokolwiek, gdzie atakujący korzysta na sfałszowaniu dopasowania.

BLAKE2 i BLAKE3: szybkość spotyka bezpieczeństwo

BLAKE2 (2012) i BLAKE3 (2020) oferują bezpieczeństwo na poziomie SHA-3 przy 2–10-krotnie wyższej prędkości niż SHA-256. BLAKE3 osiąga około 6 GB/s jednowątkowo i skaluje się liniowo na rdzeniach — maszyna 16-rdzeniowa może osiągnąć ponad 100 GB/s.

Adopcja rośnie: WireGuard używa BLAKE2s do uwierzytelniania, Zcash używa BLAKE2b, a b3sum staje się powszechnym zamiennikiem sha256sum w narzędziach programistycznych. Usługi transferu plików przetwarzające wielogigabajtowe przesyłania coraz częściej używają BLAKE3, by uniknąć wąskiego gardła obliczania skrótów.

Przeglądarki nie udostępniają jeszcze BLAKE3 przez Web Crypto API, więc implementacje JavaScript opierają się na skompilowanym do WASM kodzie referencyjnym, osiągając około 500 MB/s w przeglądarce.

Skróty w przepływach transferu plików

Kilka miejsc, gdzie skróty zdają egzamin:

  • Kontrola integralności po przesłaniu. Klient oblicza SHA-256 podczas przesyłania, serwer oblicza go po dotarciu, niezgodności uruchamiają ponowne przesłanie. S3 używa MD5 do tego celu, ponieważ szybkość jest ważniejsza niż odporność na kolizje wobec pasywnego uszkodzenia.
  • Weryfikacja przesyłania podzielonego na fragmenty. Duże pliki podzielone na fragmenty 4 MB lub 5 MB; każdy fragment dostaje skrót, a drzewo skrótów (drzewo Merkle) generuje jeden skrót korzenia dla całego pliku.
  • Deduplikacja. Jeśli dwóch użytkowników przesyła ten sam plik, skróty się zgadzają, a pamięć masowa przechowuje go raz. Używane przez deduplikację na poziomie bloków Dropbox i pamięć podręczną CDN.
  • Weryfikacja pobierania. Niektóre usługi wyświetlają SHA-256 na stronie pobierania, by odbiorcy mogli zweryfikować.
  • Identyfikacja wersji. Git używa SHA-1 (migrujący na SHA-256) jako identyfikatorów commitów — zawartość pliku określa jego tożsamość.

Rozszerzenie HMAC

Zwykłe skróty mogą weryfikować integralność, ale nie autentyczność — każdy może obliczyć SHA-256(plik). Dodanie tajnego klucza zamienia skrót w kod uwierzytelniania wiadomości (MAC): tylko ktoś z kluczem może wygenerować lub zweryfikować MAC.

HMAC (RFC 2104) to standardowa konstrukcja: HMAC(key, msg) = SHA-256(key' ⊕ opad || SHA-256(key' ⊕ ipad || msg)). Stosowany w TLS 1.2, tokenach JWT podpisanych HS256, podpisywaniu żądań AWS i wielu schematach ciasteczek sesji.

Przy transferze plików HMAC pojawia się w znaczniku uwierzytelnienia AES-GCM (który używa GHASH, a nie HMAC, ale pełni tę samą rolę) oraz w podpisywaniu żądań API niektórych usług.

Drzewa Merkle: skróty na dużą skalę

Przy bardzo dużych plikach lub kolekcjach plików obliczanie skrótu całości za każdym razem jest marnotrawstwem. Drzewo Merkle organizuje skróty w drzewo binarne: liście to skróty fragmentów, węzły wewnętrzne to skróty ich dzieci, skrót korzenia reprezentuje cały zestaw danych.

Korzyści:

  • Efektywne aktualizacje. Zmiana jednego fragmentu wymaga przeliczenia tylko log(n) węzłów.
  • Dowód przynależności. Możesz udowodnić, że konkretny fragment należy do korzenia, używając tylko log(n) skrótów rodzeństwa.
  • Obliczenia równoległe. Gałęzie są skrótem niezależnie.

Stosowane przez BitTorrent (post-v2), adresowanie zawartości IPFS, obiekty drzewa Git, logi przejrzystości certyfikatów i korzenie transakcji blockchain. Usługi transferu plików używają drzew Merkle do wznawianych przesyłań, gdzie częściowe przesyłania wymagają weryfikacji względem oryginału.

Hasła i skróty

Zastosowanie skrótów: zamiana haseł w wartości bezpieczne do przechowywania. Naiwny SHA-256(hasło) jest niewystarczający — farmy GPU obliczają miliardy SHA-256 na sekundę, więc każde pospolite hasło pada natychmiast.

Skróty specyficzne dla haseł dodają koszt obliczeniowy:

  • PBKDF2-HMAC-SHA-256 z 600 000 iteracji (OWASP 2023).
  • bcrypt z współczynnikiem kosztu 12 (około 250 ms na skrót).
  • scrypt z odpornością na pamięć, by opierać się GPU.
  • Argon2id — aktualna najlepsza praktyka, odporna na pamięć i równoległość.

Celem nie jest bezpieczeństwo przez sam skrót — chodzi o sprawienie, że każde odgadnięcie jest wystarczająco kosztowne, by offline brute-force stał się niepraktyczny dla wszystkiego poza słabymi hasłami.

Ręczna weryfikacja pobrania

Każdy plik, na którym Ci zależy, można zweryfikować za pomocą narzędzi wiersza poleceń. W macOS lub Linuksie:

shasum -a 256 ubuntu-24.04.iso

W Windows PowerShell:

Get-FileHash ubuntu-24.04.iso -Algorithm SHA256

Porównaj wynik z opublikowanym skrótem na ubuntu.com. Jeśli się zgadzają, plik pobrał się nienaruszony i odpowiada temu, co podpisał Canonical. Jeśli się różnią, albo pobieranie uległo uszkodzeniu, albo ktoś podmienił plik.

Dla maksymalnego zaufania zweryfikuj podpis na pliku skrótu za pomocą GPG i klucza podpisującego Canonical. Wieloetapowy łańcuch — podpisany plik skrótu → skrót pliku → plik — to sposób, w jaki dystrybucje Linuksa utrzymują zaufanie od dziesięcioleci.

Pytania do usługi transferu plików o obsługę integralności

Cztery pytania, które warto zadać każdemu dostawcy usług transferu plików:

  • Jakiego algorytmu skrótu używasz do weryfikacji przesyłań? (SHA-256 lub BLAKE3 to dobry wybór; MD5 jest tolerowany wyłącznie do wykrywania uszkodzeń; milczenie to sygnał ostrzegawczy.)
  • Czy udostępniasz skrót odbiorcy? (Nie wszystkie usługi to robią, ale jest to przydatna funkcja.)
  • Czy przy przesyłaniach podzielonych na fragmenty stosujesz weryfikację drzewem Merkle?
  • Czy istnieje sposób porównania skrótów między punktami końcowymi?

SwissTransfer, Tresorit, Proton Drive i HexaTransfer wszystkie obliczają SHA-256 podczas transferu i weryfikują go po dotarciu. Błędy integralności uruchamiają automatyczne ponowne przesłanie dotkniętych fragmentów, zamiast kończyć niepowodzeniem cały transfer.

Zastosowanie w praktyce

Przy następnym wrażliwym transferze: oblicz shasum -a 256 plik.pdf przed przesłaniem, zapisz skrót i poproś odbiorcę o to samo po pobraniu. Zgodne skróty potwierdzają integralność bajt po bajcie. To 30 sekund pracy, które wyłapują uszkodzenia, manipulacje i sporadycznie błędnie skonfigurowane CDN.

Wypróbuj na hexatransfer.com — bezpłatnie, bez konta, do 10 GB.

Wysyłaj duże pliki bezpiecznie z szyfrowaniem end-to-end

Przesyłaj pliki do 10 GB za darmo z szyfrowaniem end-to-end. Bez rejestracji. Twoje pliki są szyfrowane w przeglądarce przed przesłaniem — nikt inny nie może ich odczytać.

Wyślij plik