MD5 vs SHA-256 — Dlaczego Powinieneś Przestać Używać MD5
MD5 jest wszędzie. Występuje w każdym języku programowania, każdej bazie danych, każdym SDK dostawcy chmury. Programiści sięgają po niego z przyzwyczajenia - jest szybki, produkuje schludny 32-znakowy string hex, a API to dwie linie kodu. Problem: MD5 jest kryptograficznie złamane od 2004, a ataki tylko stawały się szybsze i tańsze od tamtego czasu.
To nie jest teoria. Cyberatak na infrastrukturę irańską z 2012 - malware Flame - sfałszował certyfikat podpisywania kodu Microsoftu, wykorzystując kolizję MD5. Ta sama technika, którą akademiccy kryptografowie zademonstrowali w artykule, stała się bronią używaną w szpiegostwie geopolitycznym. MD5 nie jest lekko osłabione; jest fundamentalnie skompromitowane dla każdej aplikacji, gdzie przeciwnik może wybrać wejścia.
SHA-256, część rodziny SHA-2 ustandaryzowanej przez NIST, nie ma znanych ataków kolizyjnych i pozostaje standardem dla integralności kryptograficznej w 2026. Ten artykuł wyjaśnia dokładnie, co oznacza różnica, kiedy (rzadko) MD5 jest nadal akceptowalne, i jak bezpiecznie migrować. Możesz obliczyć oba hashe natychmiast narzędziami Toova MD5 hash i Toova SHA-256 hash.
Jak Działają Funkcje Skrótu
Kryptograficzna funkcja skrótu bierze wejście dowolnej długości i produkuje wyjście stałej długości (skrót) z tymi właściwościami:
- Deterministyczna: to samo wejście zawsze produkuje to samo wyjście.
- Efekt lawiny: pojedyncza zmiana bitu w wejściu całkowicie zmienia wyjście.
- Odporność na preimage: dany hash, obliczeniowo niewykonalne znaleźć wejście.
- Odporność na kolizje: obliczeniowo niewykonalne znaleźć dwa różne wejścia produkujące ten sam hash.
Efekt lawiny to powód, dlaczego zarówno MD5, jak i SHA-256 wyglądają podobnie na pierwszy rzut oka:
MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6
MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be Jeden znak zmieniony w wejściu ("dog" → "cog"), a wyjście całkowicie inne. Ta właściwość obowiązuje dla obu algorytmów. Różnica to to, co się dzieje, gdy atakujący próbuje znaleźć kolizję celowo.
MD5 — Oś Czasu Porażki (1996–2025)
MD5 zostało zaprojektowane przez Rona Rivesta w 1991 jako zamiennik dla MD4. Do 1996 Hans Dobbertin znalazł kolizje w funkcji kompresji MD5 - nie pełnym algorytmie, ale znaku ostrzegawczym, że design był kruchy. Społeczność bezpieczeństwa zaczęła rekomendować migrację do SHA-1. Większość systemów to zignorowała.
2004 — Pełne kolizje zademonstrowane
W sierpniu 2004 Xiaoyun Wang i Hongbo Yu zaprezentowali praktyczny atak kolizyjny na MD5 na konferencji CRYPTO. Mogli wygenerować dwie różne wiadomości 1024-bitowe z tym samym hashem MD5 w mniej niż godzinę na klastrze. Fundamentalna gwarancja MD5 - odporność na kolizje - była złamana.
NIST natychmiast zaczął wycofywać MD5 z użytku federalnego. Większość wytycznych branżowych podążyła. Rzeczywiste wdrożenie MD5 w systemach produkcyjnych ledwo się zmieniło.
2008 — Fałszywe certyfikaty CA
Grupa naukowców (Sotirov, Stevens, i in.) zademonstrowała, że mogą stworzyć fałszywy certyfikat Urzędu Certyfikacji, który byłby zaufany przez wszystkie główne przeglądarki. Atak wykorzystał fakt, że kilka urzędów certyfikacji nadal podpisywało certyfikaty z MD5. Naukowcy wygenerowali kolizję między żądaniem certyfikatu wyglądającym legalnie a samodzielnie spreparowanym certyfikatem CA - następnie skłonili prawdziwe CA do podpisania legalnego, produkując podpis, który był również poprawny dla sfałszowanego certyfikatu CA.
Każda główna przeglądarka natychmiast zablokowała certyfikaty podpisane MD5. Większość urzędów certyfikacji przestała je wydawać. Jedna główna lekcja: słabości kryptograficzne stają się wykorzystywalne w momencie, gdy atakujący kontroluje wejście do funkcji skrótu.
2012 — Malware Flame
Cyberszpiegowski malware Flame, odkryty w 2012 i przypisany aktorom państwowym, sfałszował certyfikat Microsoft Windows Update używając kolizji MD5 z wybranym prefiksem. Atak był bardziej zaawansowany niż demonstracja z 2008: atakujący mogli spreparować złośliwy payload, który kolidował z legalnym certyfikatem Microsoftu w warunkach, gdzie infrastruktura podpisywania Microsoftu współpracowałaby nieświadomie.
Wynik: Flame mógł rozprzestrzeniać się przez Windows Update, jakby był legalną aktualizacją Microsoftu, z poprawnym podpisem Microsoftu. Setki tysięcy maszyn Windows w Iranie, Libanie, Syrii i Sudanie zostało zainfekowanych. To była rzeczywista eksploitacja ataków kolizyjnych MD5 w skali państwa narodowego. Zobacz artykuł Wikipedii o malware Flame dla pełnej historii.
2019–2025 — HashClash i natychmiastowe kolizje
Projekt HashClash (Marc Stevens, CWI Amsterdam) kontynuował pchanie generowania kolizji MD5 do praktycznych granic. Do 2019 kolizje MD5 z wybranym prefiksem - gdzie atakujący może wybrać arbitralne prefiksy dla obu kolidujących wiadomości - mogły być generowane w dniach na sprzęcie komercyjnym. Do 2022 zoptymalizowane implementacje zredukowały to do godzin. W 2024 artykuł HashClash zademonstrował kolizje w mniej niż minutę na pojedynczym nowoczesnym GPU.
Trajektoria jest jasna: ataki kolizyjne MD5 nie stają się trudniejsze wraz z poprawą sprzętu - stają się łatwiejsze. To, co zajmowało klaster w 2004, zajmuje laptop w 2026.
SHA-256 — Dlaczego Się Trzyma
SHA-256 jest częścią rodziny SHA-2, zaprojektowanej przez NSA i ustandaryzowanej przez NIST w 2001. Produkuje 256-bitowy (32-bajtowy) skrót. Żadne praktyczne ataki kolizyjne na SHA-256 nie są znane od 2026. Najlepsze opublikowane ataki redukują teoretyczny czynnik pracy dla znajdowania kolizji do około 2^187 operacji - nadal daleko poza dowolny zasób obliczeniowy istniejący lub przewidywalny.
Margines bezpieczeństwa SHA-256 jest celowo konserwatywny. Nawet jeśli sprzęt poprawi się o czynnik miliarda (mniej więcej 30 podwojeń w terminach prawa Moore'a), łamanie SHA-256 pozostaje obliczeniowo niewykonalne. Efektywny czynnik pracy MD5 2^18 do 2^23 dla kolizji był w zasięgu skromnego sprzętu w 2004.
SHA-256 jest też szybsze, niż mogłoby się wydawać: nowoczesne CPU zawierają dedykowane instrukcje SHA (Intel SHA Extensions, ARM Cryptography Extensions) pozwalające oprogramowaniu obliczać miliony hashy SHA-256 na sekundę na rdzeń. Nie jest znacząco wolniejsze niż MD5 dla typowych przypadków użycia.
Kiedy MD5 Jest Nadal Akceptowalne (Rzadko)
"Złamane" nie znaczy "bezużyteczne dla każdego celu". MD5 pozostaje akceptowalne w kontekstach gdzie:
- Nie ma przeciwnika: wykrywanie przypadkowego uszkodzenia plików w zaufanym systemie wewnętrznym - nie weryfikowanie pobrań z internetu, ale sprawdzanie, czy kopia pliku zakończyła się pomyślnie.
- Szybkość ma większe znaczenie niż bezpieczeństwo: obliczanie kluczy cache lub identyfikatorów shardów, gdzie kolizja oznacza po prostu miss cache, nie naruszenie bezpieczeństwa. Model atakującego jest nieobecny.
- Dopasowujesz się do istniejącego zewnętrznego systemu: niektóre starsze API nadal wysyłają ETagi MD5 lub sumy kontrolne. Możesz akceptować i obliczać MD5, aby współpracować, jeśli nie używasz go do decyzji bezpieczeństwa.
- Partycjonowanie tablicy hashy: dystrybucja danych przez wiadra przez MD5 klucza. Kolizje tutaj powodują nierównowagę, nie awarie bezpieczeństwa.
Wspólny wątek: MD5 jest akceptowalne, gdy aplikacja nie zależy od odporności na kolizje i nie ma atakującego, który może spreparować wejścia. Gdy tylko któryś warunek się łamie - atakujący obecny lub kolizja = awaria bezpieczeństwa - przełącz się na SHA-256.
Częste Mity o MD5
"MD5 jest w porządku, jeśli dodamy sól"
Salting zmienia wejście, więc dwóch użytkowników z tym samym hasłem dostaje różne hashe - zapobiega atakom z tablicami tęczowymi. Ale nie naprawia problemu kolizji. Atakujący z osolonym hashem MD5 nadal może go brute-forceować wydajnie, ponieważ MD5 jest szybkie: nowoczesne GPU obliczają około 10-30 miliardów hashy MD5 na sekundę. Sól dodaje pracę proporcjonalną do przestrzeni przeszukiwania, nie do trudności algorytmu.
Do hashowania haseł, ani MD5, ani SHA-256 nie są odpowiednie niezależnie od saltingu. Użyj bcrypt, scrypt lub Argon2.
"MD5 jest w porządku, ponieważ używamy go tylko wewnętrznie"
Wewnętrzne systemy są łamane. Model zagrożeń "atakujący nie może uzyskać dostępu do naszych wejść" zwykle trzyma się, dopóki atak supply-chain, zagrożenie wewnętrzne lub błędna konfiguracja nie ujawni systemu. Atak Flame zdarzył się przeciwko systemom, które przypuszczalnie miały podobną pewność co do swoich wewnętrznych kontroli.
"SHA-256 to overkill — MD5 jest szybsze"
Na nowoczesnym sprzęcie z instrukcjami akceleracji SHA, SHA-256 jest mniej więcej 2-5x wolniejsze niż MD5. Dla większości aplikacji - sprawdzeń integralności plików, podpisów API, kluczy cache - różnica to mikrosekundy na operację, niezauważalne w praktyce. Argument wydajności za MD5 nad SHA-256 obowiązuje tylko w ekstremalnie wysokoprzepustowych scenariuszach, gdzie nawet mikrosekundy mają znaczenie, a nawet wtedy są zwykle lepsze rozwiązania niż używanie złamanego algorytmu.
Przewodnik Migracji — MD5 do SHA-256
Hashowanie haseł
// ŹLE: MD5 do hashowania haseł
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// Czas złamania nowoczesnym GPU: sekundy do minut // ŹLE: SHA-256 do hashowania haseł (wciąż zbyt szybkie)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');
// POPRAWNIE: użyj bcrypt, scrypt lub Argon2 do haseł
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12); Migrowanie przechowywanych hashy haseł wymaga stopniowego podejścia. Przy każdym pomyślnym logowaniu: zweryfikuj hasło wobec istniejącego hasha MD5, następnie natychmiast przehashuj z bcrypt i zastąp przechowywaną wartość. Oznaczaj każde konto jako zmigrowane. Po rozsądnym okresie (typowo 90 dni) wymuś reset hasła dla pozostałych kont nadal używających hashy MD5.
Integralność plików / sumy kontrolne
# Linux: zweryfikuj pobrany plik
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256
# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso
# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256 Przełączanie sprawdzeń integralności plików z MD5 na SHA-256 jest zwykle prostym find-and-replace w kodzie. Dwie pułapki: (1) istniejące sumy kontrolne przechowywane w bazach danych lub plikach muszą być przeliczone i zaktualizowane - nie ma skrótu; (2) zewnętrzne API lub systemy pamięci masowej dostarczające ETagi MD5 (jak niektóre konfiguracje S3) wymagają koordynacji do przełączenia.
HMAC do uwierzytelniania API
// HMAC-SHA-256 do uwierzytelniania wiadomości
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
.update(message)
.digest('hex'); Jeśli używasz HMAC-MD5 do podpisywania żądań API, przełącz się na HMAC-SHA-256. Konstrukcja HMAC dodaje tajny klucz, co ogranicza niektóre ataki MD5, ale HMAC-MD5 ma podatności rozszerzania długości, a podstawowy prymityw jest nadal skompromitowany. Nowoczesne standardy (JWT, AWS SigV4, OAuth 2.0) wszystkie określają HMAC-SHA-256. Generator HMAC Toova obsługuje zarówno HMAC-SHA-256, jak i HMAC-SHA-512 do testowania.
Podpisy cyfrowe i certyfikaty
Każdy certyfikat podpisany MD5 powinien być natychmiast wystawiony ponownie - większość urzędów certyfikacji przestała wydawać certyfikaty podpisane MD5 po 2008, a wszystkie główne przeglądarki i systemy operacyjne je odrzucają. Dla wewnętrznego PKI, audytuj konfigurację twojego CA i upewnij się, że SHA-256 to minimalny dozwolony algorytm podpisu. RSA-SHA256 lub ECDSA-SHA256 to obecne standardy.
MD5 vs SHA-256 — Szybka Referencja
| Właściwość | MD5 | SHA-256 |
|---|---|---|
| Długość wyjścia | 128 bitów (32 znaki hex) | 256 bitów (64 znaki hex) |
| Odporność na kolizje | Złamana (praktyczne ataki) | Bezpieczna (brak znanych ataków) |
| Hashowanie haseł | Nigdy | Nie (użyj bcrypt/Argon2) |
| Podpisy cyfrowe | Nigdy | Tak |
| Integralność plików (bezpieczeństwo) | Nigdy | Tak |
| Niebezpieczne sumy kontrolne | Akceptowalne (brak atakującego) | Zawsze w porządku |
| Klucze cache | Akceptowalne | Zawsze w porządku |
| Podpisywanie certyfikatów TLS | Odrzucane przez przeglądarki | Standard |
| Zgodne z FIPS 140-3 | Nie (wycofane) | Tak |
Wnioski
MD5 jest kryptograficznie złamane od 2004. Kolizje z wybranym prefiksem - technika, która zasiliła malware Flame - są teraz obliczeniowo tanie. Każda aplikacja polegająca na MD5 dla bezpieczeństwa (podpisy, weryfikacja integralności, uwierzytelnianie) jest podatna na ataki kosztujące minuty czasu obliczeniowego do wykonania.
SHA-256 nie ma znanych praktycznych ataków, jest sprzętowo akcelerowane na nowoczesnych CPU i jest standardem dla integralności kryptograficznej w TLS, podpisywaniu kodu i uwierzytelnianiu API. Koszt wydajności w porównaniu do MD5 jest pomijalny dla niemal każdego przypadku użycia.
Ścieżka migracji jest prosta: sprawdzenia integralności plików to find-and-replace. Podpisy API wymagają skoordynowania bump'a wersji. Hashe haseł potrzebują stopniowej strategii rehashowania przy logowaniu. Dla każdego nowego kodu, SHA-256 powinno być domyślnym wyborem. Obliczaj i porównuj hashe bezpośrednio narzędziami Toova MD5 i Toova SHA-256 - lub generuj kody uwierzytelniania HMAC-SHA-256 narzędziem HMAC generator.