Funkcje hash są wszędzie w rozwoju oprogramowania, nawet jeśli tego nie zauważasz. Za każdym razem, gdy pobierasz plik i sprawdzasz jego sumę kontrolną, logujesz się na stronie internetowej, robisz commit w Git lub kopiesz Bitcoina (dobra, może nie to ostatnie), funkcje hash wykonują ciężką pracę za kulisami.
Zrozummy, czym są, czym się różnią i kiedy której używać.
Czym jest funkcja hash?
Funkcja hash przyjmuje dowolne dane wejściowe — pojedynczy znak, powieść, plik wideo o wielkości 4 GB — i generuje wynik o stałym rozmiarze zwany „hashem" lub „digestem". Pomyśl o tym jak o odcisku palca dla danych. Niezależnie od tego, jak duże lub małe są dane wejściowe, wynik zawsze ma tę samą długość.
Oto co czyni funkcje hash wyjątkowymi:
- Deterministyczna: To samo wejście zawsze daje to samo wyjście.
hash("hello")zwróci tę samą wartość za każdym razem, na każdej maszynie, w każdym języku programowania. - Jednokierunkowa: Nie da się odtworzyć wejścia z wyjścia. Mając hash, nie ma sposobu na ustalenie, co go wygenerowało (poza zgadywaniem). To sprawia, że są przydatne do przechowywania haseł.
- Efekt lawinowy: Zmiana jednego bitu wejścia drastycznie zmienia wyjście. Na przykład hasze SHA-256 dla „hello" i „Hello" to zupełnie różne ciągi znaków.
- Odporność na kolizje: Powinno być praktycznie niemożliwe znalezienie dwóch różnych danych wejściowych, które dają ten sam hash. Im silniejszy algorytm, tym trudniej znaleźć kolizje.
Zobaczmy to w akcji:
Zupełnie różne wyniki dla danych wejściowych różniących się tylko jednym znakiem — małe „h" kontra wielkie „H". To właśnie efekt lawinowy w akcji.
Jak działają funkcje hash pod maską
Chociaż matematyka stojąca za funkcjami hash jest złożona, ogólny proces jest prosty. Większość funkcji hash wykonuje następujące kroki:
1. Dopełnianie (Padding): Wiadomość wejściowa jest dopełniana, aby jej długość stała się wielokrotnością stałego rozmiaru bloku (np. 512 bitów dla SHA-256). Zapewnia to, że algorytm może przetwarzać dane w jednolitych blokach.
2. Podział na bloki: Dopełniona wiadomość jest dzielona na bloki o stałym rozmiarze.
3. Rundy kompresji: Każdy blok jest przetwarzany przez wiele rund operacji bitowych — XOR, AND, OR, przesunięcia bitowe i dodawanie modularne. Operacje te dokładnie mieszają bity, tak że każdy bit wyjściowy zależy od każdego bitu wejściowego.
4. Łańcuchowanie: Wynik przetwarzania jednego bloku zasila przetwarzanie następnego bloku. Dlatego nawet drobna zmiana na początku danych wejściowych kaskadowo przechodzi przez każdy kolejny blok.
5. Końcowy digest: Po przetworzeniu wszystkich bloków stan wewnętrzny jest wyprowadzany jako końcowa wartość hash.
Kluczowa obserwacja jest taka, że operacje te są łatwe do obliczenia w przód, ale praktycznie niemożliwe do odwrócenia. Nie da się „odmieszać" bitów, aby odzyskać oryginalne dane wejściowe.
MD5: Emerytowany weteran
MD5 został zaprojektowany przez Ronalda Rivesta w 1991 roku i generuje 128-bitowy hash (32 znaki szesnastkowe). Przez dekady był standardem — widziałeś sumy kontrolne MD5 obok każdego pobrania pliku w internecie.
Jednakże MD5 jest teraz uznawany za kryptograficznie złamany. Badacze zademonstrował praktyczne ataki kolizyjne — co oznacza, że potrafią stworzyć dwa różne pliki, które dają ten sam hash MD5. W 2008 roku badacze użyli kolizji MD5 do stworzenia fałszywego certyfikatu SSL, udowadniając, że to nie była tylko teoretyczna słabość.
Jeszcze akceptowalny do: sprawdzania integralności plików (weryfikacja, czy pobieranie zakończyło się poprawnie), sum kontrolnych do deduplikacji, niezwiązanych z bezpieczeństwem tablic hash oraz szybkiego odcisku palca danych, gdy bezpieczeństwo nie jest problemem.
Nigdy nie używaj do: przechowywania haseł, podpisów cyfrowych, certyfikatów bezpieczeństwa ani niczego, gdzie ktoś mógłby celowo tworzyć kolizje.
SHA-1: Również na emeryturze
SHA-1 został zaprojektowany przez NSA i opublikowany w 1995 roku. Generuje 160-bitowy hash (40 znaków hex). Przez lata był standardem w certyfikatach SSL, podpisach PGP i systemach kontroli wersji.
Został wycofany po tym, jak Google zademonstrował praktyczny atak kolizyjny w 2017 roku (słynny atak SHAttered). Stworzyli dwa różne pliki PDF z tym samym hashem SHA-1. Atak wymagał 9 223 372 036 854 775 808 obliczeń SHA-1 — ogromna liczba, ale wykonalna przy współczesnych zasobach chmury obliczeniowej.
Git nadal używa SHA-1 wewnętrznie do haszy commitów, ale przechodzi na SHA-256. Przeglądarki i urzędy certyfikacji przestały akceptować certyfikaty SHA-1 lata temu. Jeśli widzisz SHA-1 używany do celów bezpieczeństwa w jakimkolwiek kodzie dzisiaj, powinno to zostać oznaczone i zmigrowane.
SHA-256 i SHA-512: Obecne standardy
Należą do rodziny SHA-2, zaprojektowanej przez NSA i opublikowanej w 2001 roku. To jest to, czego powinieneś używać dzisiaj do większości celów.
- SHA-256: 256-bitowe wyjście (64 znaki hex). Używany w Bitcoinie, certyfikatach TLS i większości aplikacji bezpieczeństwa. To idealny balans między bezpieczeństwem a wydajnością. Cały system proof-of-work Bitcoina jest zbudowany na podwójnym hashowaniu SHA-256.
- SHA-512: 512-bitowe wyjście (128 znaków hex). Większe wyjście oznacza większą odporność na kolizje. Co ciekawe, SHA-512 jest często szybszy niż SHA-256 na procesorach 64-bitowych, ponieważ operuje natywnie na słowach 64-bitowych, podczas gdy SHA-256 używa słów 32-bitowych.
- SHA-384 i SHA-512/256: To skrócone warianty SHA-512. SHA-384 daje 384-bitowe wyjście, podczas gdy SHA-512/256 daje 256-bitowe wyjście, ale z zaletami wydajnościowymi operacji 64-bitowych SHA-512.
Szybkie porównanie:
SHA-3: Następna generacja
SHA-3 został ustandaryzowany w 2015 roku po publicznym konkursie przeprowadzonym przez NIST. W przeciwieństwie do SHA-2, który używa konstrukcji Merkle-Damgard, SHA-3 jest oparty na konstrukcji gąbkowej Keccak — fundamentalnie innym projekcie.
Dlaczego to ważne? Jeśli przełom matematyczny kiedykolwiek skompromituje podejście projektowe SHA-2, SHA-3 nie będzie zagrożony, ponieważ działa zupełnie inaczej. To polisa ubezpieczeniowa dla społeczności kryptograficznej.
SHA-3 występuje w tych samych rozmiarach wyjścia — SHA3-256, SHA3-384, SHA3-512 — i wprowadza również SHAKE128 i SHAKE256, które są „funkcjami o rozszerzalnym wyjściu", mogącymi wygenerować hash o dowolnej żądanej długości.
W praktyce SHA-2 jest nadal szerzej stosowany i szybszy na większości sprzętu. Adopcja SHA-3 rośnie, ale jest to raczej standard zapasowy niż zamiennik.
Zastosowania w praktyce
Kontrola wersji Git: Każdy commit, drzewo i blob w Git jest identyfikowany przez swój hash SHA-1. Kiedy uruchamiasz git commit, Git hashuje zawartość twoich zmian, strukturę drzewa, hash nadrzędnego commita, twoje dane autora i znacznik czasu. Dlatego hasze commitów wyglądają jak a1b2c3d4e5f6... — są dosłownie digestami SHA-1.
Kopanie Bitcoina: Górnicy rywalizują o znalezienie wartości nonce, która, połączona z danymi bloku i zahashowana podwójnym SHA-256, daje hash poniżej progu docelowego. Trudność znalezienia tego hasha zabezpiecza całą sieć. W 2024 roku sieć Bitcoin oblicza około 500 trylionów haszy SHA-256 na sekundę.
Deduplikacja plików: Usługi przechowywania w chmurze, takie jak Dropbox, hashują każdy przesłany plik. Jeśli hash pasuje do istniejącego pliku, nie przechowują duplikatu — po prostu dodają wskaźnik. To oszczędza ogromne ilości przestrzeni dyskowej.
Podpisy cyfrowe: Kiedy podpisujesz dokument lub wydanie oprogramowania, nie podpisujesz całego pliku. Zamiast tego plik jest hashowany, a hash jest podpisywany twoim kluczem prywatnym. Odbiorca hashuje plik samodzielnie i weryfikuje podpis względem tego hasha.
Uwierzytelnianie API: HMAC (kod uwierzytelniania wiadomości oparty na hashu) łączy tajny klucz z hashem wiadomości, aby zweryfikować zarówno integralność, jak i autentyczność żądań API. AWS, Stripe i większość głównych API używa HMAC-SHA256 do podpisywania żądań.
Typowe błędy programistów przy hashowaniu
Używanie funkcji hash do haseł: Zwykły SHA-256 jest zbyt szybki do hashowania haseł. Atakujący z GPU może obliczyć miliardy haszy SHA-256 na sekundę, co czyni ataki brute-force trywialnymi. Zawsze używaj dedykowanych funkcji hashowania haseł, takich jak bcrypt, scrypt lub Argon2, które są celowo wolne i intensywne pamięciowo.
Brak użycia soli (salt): Jeśli hashujesz hasła bez soli (losowej wartości dodawanej do każdego hasła przed hashowaniem), identyczne hasła dają identyczne hasze. Atakujący z wstępnie obliczoną „tęczową tablicą" może natychmiast odszukać popularne hasła. Zawsze dodawaj unikalną, losową sól dla każdego użytkownika.
Porównywanie haszy w sposób niebezpieczny czasowo: Używanie == do porównywania haszy w kodzie wrażliwym na bezpieczeństwo może ujawniać informacje przez kanały boczne czasu. Atakujący może mierzyć czas porównania i wywnioskować hash znak po znaku. Używaj funkcji porównania w stałym czasie, takich jak crypto.timingSafeEqual() w Node.js lub hmac.compare_digest() w Pythonie.
Obcinanie haszy: Niektórzy programiści obcinają hasze, aby zaoszczędzić miejsce (np. przechowują tylko pierwsze 16 znaków hasha SHA-256). To dramatycznie zmniejsza odporność na kolizje. Pełny hash SHA-256 ma 2^256 możliwych wartości; obcięcie do 16 znaków hex zostawia tylko 2^64 — liczbę, którą nowoczesny sprzęt może złamać brute-force'em.
Której funkcji hash użyć?
- Integralność plików (bez bezpieczeństwa): SHA-256 lub nawet MD5 wystarczy. Sprawdzasz przypadkowe uszkodzenie, nie złośliwą manipulację.
- Przechowywanie haseł: Żadnej z tych! Użyj bcrypt, scrypt lub Argon2 — są celowo wolne, co czyni ataki brute-force niepraktycznymi. Zwykłe funkcje hash są zbyt szybkie do hashowania haseł.
- Podpisy cyfrowe i certyfikaty: SHA-256 lub SHA-512.
- HMAC (uwierzytelnianie wiadomości): SHA-256 lub SHA-512.
- Adresowanie treści w stylu Git: SHA-256 (dokąd zmierza Git).
- Przyszłościowość: Jeśli budujesz system, który ma przetrwać dekady i chcesz plan awaryjny na wypadek, gdyby SHA-2 został kiedyś skompromitowany, rozważ SHA-3.
- Sumy kontrolne w potokach danych: SHA-256 do weryfikacji integralności danych między etapami potoku. CRC32 jest szybszy, ale wychwytuje tylko przypadkowe błędy, nie celową manipulację.
Funkcje hash w kodzie: Praktyczne przykłady
Dobra, dość teorii — napiszmy trochę kodu. Bo szczerze mówiąc, najlepszy sposób na zrozumienie hashowania to po prostu... zrobić to. Oto jak obliczasz hasze w językach, których prawdopodobnie używasz na co dzień.
Node.js — Wbudowany moduł crypto sprawia, że to banalnie proste:
A najfajniejsze jest to, że hashowanie pliku wygląda prawie tak samo:
Python — Pythonowy hashlib jest równie prosty. Uważam, że Python ma najładniejsze API do tego:
Go — Biblioteka standardowa Go jest do tego niesamowicie dobrze zaprojektowana:
Java — Trochę bardziej rozwlekła (bo... Java), ale działa świetnie:
Weryfikacja pobranego pliku: To jedno z najbardziej praktycznych zastosowań hashowania. Załóżmy, że pobierasz obraz ISO Linuksa i strona mówi, że suma kontrolna SHA-256 powinna być abc123.... Oto jak to zweryfikować:
Wiem, że to brzmi prosto, ale zdziwiłbyś się, ilu programistów pomija ten krok. Jeden uszkodzony bajt w 4 GB pobraniu może zrujnować ci całe popołudnie.
Tęczowe tablice i dlaczego są przerażające
Dobra, teraz ta część, która mnie powaliła, gdy po raz pierwszy się o niej dowiedziałem. Wyobraź sobie, że ktoś wstępnie oblicza hash dla każdego możliwego hasła do, powiedzmy, 8 znaków. Każda kombinacja liter, cyfr i symboli. Wszystkie te mapowania hash-do-hasła przechowują w ogromnej tablicy wyszukiwania.
To jest tęczowa tablica. I są absolutnie przerażające.
Dlaczego? Jeśli przechowywałeś hasła jako zwykłe hasze SHA-256 (bez soli), atakujący, który zdobędzie twoją bazę danych, nie musi niczego „łamać". Po prostu wyszukuje każdy hash w swojej tęczowej tablicy. Bum — natychmiastowe odzyskanie hasła. Wyszukiwanie trwa mikrosekundy.
Jak duże są te tablice? Tęczowa tablica pokrywająca wszystkie alfanumeryczne hasła do 8 znaków może mieć około 100-200 GB. Brzmi jak dużo, ale to mieści się na jednym dysku SSD. Strony takie jak CrackStation mają tablice z miliardami wstępnie obliczonych haszy i łamią popularne hasze haseł w sekundy za darmo.
A teraz dobra wiadomość: solenie całkowicie pokonuje tęczowe tablice. Sól to po prostu losowy ciąg, który dodajesz do hasła przed hashowaniem:
Widzisz, co się stało? To samo hasło ("password123") daje zupełnie różne hasze z powodu różnych soli. Atakujący musiałby zbudować osobną tęczową tablicę dla każdej możliwej soli, co jest obliczeniowo niemożliwe.
Każda nowoczesna biblioteka hashowania haseł (bcrypt, Argon2, scrypt) obsługuje solenie automatycznie. Jeśli kiedykolwiek kusi cię, żeby napisać własne hashowanie haseł — nie rób tego. Serio. Użyj bcrypt i zajmij się życiem.
HMAC: Hashowanie z sekretem
HMAC oznacza kod uwierzytelniania wiadomości oparty na hashu, i wiem, wiem, brzmi to groźnie. Ale zostań ze mną — to w zasadzie dość proste pojęcie, które prawdopodobnie już używałeś, nie zdając sobie z tego sprawy.
Zwykłe hashowanie bierze wiadomość i tworzy hash. HMAC bierze wiadomość ORAZ tajny klucz i tworzy hash. Kluczowa różnica (gra słów zamierzona) polega na tym, że tylko ktoś znający tajny klucz może wygenerować lub zweryfikować HMAC. Dowodzi to dwóch rzeczy jednocześnie: wiadomość nie została zmieniona I pochodzi od kogoś, kto zna sekret.
Gdzie to widzisz w praktyce? Sygnatury webhooków. Kiedy GitHub lub Stripe wysyła webhook do twojego serwera, dołączają sygnaturę HMAC-SHA256 w nagłówkach. Twój serwer może zweryfikować, że webhook naprawdę pochodzi od GitHuba (a nie został sfałszowany przez przypadkowego atakującego), obliczając HMAC samodzielnie i porównując.
Oto praktyczny przykład weryfikacji sygnatury webhooka GitHuba w Node.js:
Zwróć uwagę na wywołanie timingSafeEqual. To kluczowe. Zwykłe porównanie === zwraca false, gdy tylko znajdzie pierwszy niezgodny znak, co oznacza, że atakujący może zmierzyć czas odpowiedzi i odgadnąć sygnaturę bajt po bajcie. Porównanie bezpieczne czasowo zawsze trwa tyle samo, niezależnie od tego, gdzie występuje niezgodność.
Benchmarki wydajności funkcji hash
Rozumiem — wydajność ma znaczenie. Szczególnie jeśli hashujesz miliony plików w potoku budowania lub przetwarzasz strumień danych. Oto jak główne funkcje hash wypadają pod względem szybkości (przybliżone benchmarki na nowoczesnym sprzęcie x86_64):
Chwila, zauważyłeś to? BLAKE3 jest 10x szybszy niż SHA-256 będąc jednocześnie kryptograficznie bezpiecznym. To nie jest literówka.
BLAKE3 to najnowsza gorąca nowość w świecie hashowania, i nie bez powodu. Jest oparty na rodzinie BLAKE2 (która już prześcignęła SHA-3 w konkursie NIST), ale przeprojektowany, aby wykorzystać paralelizm SIMD i wielowątkowość. Potrafi hashować dane praktycznie z prędkością memcpy.
Dlaczego powinno cię to obchodzić? Narzędzia do budowania się tym przejmują. Bardzo. Narzędzia takie jak Bazel, Buck i różne systemy przechowywania adresowalnego treścią spędzają zadziwiającą ilość czasu na hashowaniu plików. Przejście z SHA-256 na BLAKE3 może przyspieszyć sprawdzanie zależności o rząd wielkości. Ekosystem Rust agresywnie adoptuje BLAKE3 i pojawia się on w coraz większej liczbie miejsc.
Mimo to, SHA-256 i SHA-512 są nadal właściwym wyborem, gdy potrzebujesz szerokiej kompatybilności lub zgodności ze standardami takimi jak FIPS. Nie wszystko obsługuje jeszcze BLAKE3 i w wielu przypadkach szybkość hashowania i tak nie jest wąskim gardłem.
Blockchain i drzewa Merkle'a: Hashowanie na dużą skalę
Dobra, teraz robi się naprawdę fajnie. Wiesz, jak Git potrafi ci dokładnie powiedzieć, który plik się zmienił w ogromnym repozytorium? I jak Bitcoin może zweryfikować transakcję bez pobierania całego blockchainu? Sekret to struktura danych zwana drzewem Merkle'a (nazwana na cześć Ralpha Merkle'a, który ją opatentował w 1979).
Drzewo Merkle'a to w zasadzie drzewo haszy. Oto jak to działa — wyobraź sobie, że masz cztery bloki danych:
Każdy liść to hash bloku danych. Każdy węzeł nadrzędny to hash połączenia jego dwóch dzieci. Hash korzenia (czasem nazywany „Merkle root") to pojedynczy hash reprezentujący WSZYSTKIE dane w drzewie.
Oto naprawdę elegancka część: jeśli zmieni się choć jeden bit danych w Data C, zmieni się Hash(C), co oznacza, że zmieni się Hash(CD), co oznacza, że zmieni się Root Hash. Możesz natychmiast wykryć manipulację, sprawdzając tylko korzeń.
Ale jest jeszcze lepiej. Załóżmy, że chcesz udowodnić, że Data C jest częścią drzewa, nie ujawniając Data A, B ani D. Musisz dostarczyć tylko: Data C, Hash(D) i Hash(AB). Weryfikator może zrekonstruować ścieżkę do korzenia i sprawdzić, czy się zgadza. To się nazywa „dowód Merkle'a" i jest niesamowicie wydajny — dla drzewa z milionem liści, dowód ma tylko około 20 haszy (log2 z 1 000 000).
Gdzie to jest używane w praktyce?
- Git: Całe twoje repozytorium to drzewo Merkle'a. Commity wskazują na drzewa, drzewa wskazują na bloby i wszystko jest identyfikowane przez swój hash SHA-1. Dlatego Git może natychmiast wykryć, czy coś się zmieniło.
- Bitcoin: Każdy blok zawiera korzeń Merkle'a wszystkich transakcji. Lekkie klienty (jak portfele mobilne) mogą zweryfikować konkretną transakcję za pomocą dowodu Merkle'a bez pobierania pełnego bloku.
- IPFS: InterPlanetary File System dzieli pliki na fragmenty, buduje Merkle DAG (skierowany graf acykliczny) i używa hasha korzenia jako identyfikatora treści (CID) pliku.
- Certificate Transparency: Logi Certificate Transparency Google'a używają drzew Merkle'a, aby każdy mógł efektywnie sprawdzić, czy certyfikat został (lub nie został) zalogowany.
Przyszłość: Post-kwantowe funkcje hash
Być może słyszałeś, że komputery kwantowe złamią całe nasze szyfrowanie. I tak, to częściowo prawda — RSA, ECC i Diffie-Hellman są skończone, gdy pojawią się komputery kwantowe na dużą skalę. Algorytm Shora potrafi efektywnie faktoryzować duże liczby i obliczać logarytmy dyskretne, od czego te systemy zależą.
Ale oto zaskakująco dobra wiadomość: funkcje hash są w rzeczywistości dość bezpieczne przed komputerami kwantowymi. Głównym kwantowym zagrożeniem dla funkcji hash jest algorytm Grovera, który może przeszukiwać nieustrukturyzowaną przestrzeń kwadratowo szybciej. W praktyce oznacza to, że zmniejsza bity bezpieczeństwa o połowę — SHA-256 spada z 2^256 do 2^128 siły przeciwko atakom kwantowym.
2^128 to nadal absolutnie ogromna liczba. To mniej więcej liczba atomów w obserwowalnym wszechświecie podniesiona do kwadratu. Nikt tego nie złamie brute-force'em, z komputerem kwantowym czy bez.
Tak więc, podczas gdy NIST aktywnie pracuje nad standardami kryptografii post-kwantowej (i sfinalizował kilka w 2024 roku), pilność dotyczy głównie szyfrowania kluczem publicznym i podpisów — nie funkcji hash. Jeśli używasz dziś SHA-256, możesz spać spokojnie, wiedząc, że komputery kwantowe go nie unieważnią.
Mimo to, jeśli jesteś naprawdę paranoiczny (a w kryptografii paranoja jest cnotą), przejście na SHA-512 lub SHA3-256 daje dodatkowy margines bezpieczeństwa. Niektóre post-kwantowe schematy podpisów, takie jak SPHINCS+, są w całości zbudowane na funkcjach hash, co jest miłym wotum zaufania dla ich odporności na ataki kwantowe.
Kolizje hash: Atak urodzinowy wyjaśniony
Porozmawiajmy o jednej z najbardziej nieintuicyjnych rzeczy w całej informatyce: ataku urodzinowym. Nazwa pochodzi od paradoksu urodzinowego i to jest powód, dla którego funkcje hash muszą być większe, niż intuicyjnie byś oczekiwał.
Oto paradoks urodzinowy: w pokoju z zaledwie 23 osobami jest 50% szans, że dwie z nich mają urodziny tego samego dnia. Nie konkretnego dnia — po prostu jakakolwiek pasująca para. Przy 70 osobach prawdopodobieństwo skacze do 99,9%. Większość ludzi zgaduje, że potrzeba około 183 osób (połowa z 365), ale rzeczywista liczba jest znacznie niższa, ponieważ szukamy JAKIEJKOLWIEK kolizji, nie konkretnej.
Dokładnie ta sama matematyka dotyczy funkcji hash. Jeśli funkcja hash produkuje N możliwych wyników, nie musisz obliczać N haszy, aby znaleźć kolizję — potrzebujesz tylko mniej więcej pierwiastka kwadratowego z N.
Dla 256-bitowego hasha jak SHA-256 istnieje 2^256 możliwych wyników. Znalezienie kolizji wymaga około 2^128 operacji (pierwiastek kwadratowy z 2^256). To nadal niemożliwie duża liczba — ale to jest powód, dla którego nie możemy po prostu użyć 64-bitowego hasha i na tym skończyć.
Dokładnie dlatego MD5 (128-bitowy) się załamał. Jego odporność na kolizje wynosiła od początku tylko 2^64, a strukturalne słabości algorytmu jeszcze ją obniżyły. Badacze ostatecznie znaleźli kolizje w sekundy na zwykłym laptopie.
Praktyczny wniosek? Zawsze używaj co najmniej 256-bitowej funkcji hash do wszystkiego związanego z bezpieczeństwem. SHA-256, SHA3-256 lub BLAKE3 to doskonałe wybory. A jeśli ktoś sugeruje użycie 64-bitowego lub 128-bitowego hasha do celów bezpieczeństwa, teraz wiesz dokładnie, dlaczego to okropny pomysł.
Wypróbuj sam
Ciekaw, jaki hash mają Twoje dane? Użyj naszego Generatora hash MD5, Generatora hash SHA-256 lub Generatora hash SHA-512. Wklej tekst i zobacz, jak nawet drobne zmiany tworzą zupełnie inne hasze — to najlepszy sposób na zbudowanie intuicji, jak te algorytmy się zachowują.