SHA-1 vs SHA-256 vs SHA-512: Wybór właściwego algorytmu hash w 2026
Otwórz certyfikat TLS, bazę obiektów Git, nagłówek bloku Bitcoin, menedżer pakietów Linuksa i manifest obrazu Docker — w każdym z nich znajdziesz hash SHA. Ale nie ten sam SHA. SHA-1, SHA-256, SHA-384, SHA-512, SHA-3: rodzina obejmuje trzy dekady, dwie linie projektowe i przełomowy atak kolizyjny, który złamał najstarszy algorytm na produkcji.
Ten przewodnik mapuje całą rodzinę, abyś mógł wybrać właściwy algorytm dla swojego przypadku użycia bez niepotrzebnych wątpliwości.
Szybkie drzewo decyzyjne
Zanim zagłębisz się w szczegóły, oto skrócone podsumowanie, którego większość programistów faktycznie potrzebuje:
| Twoja sytuacja | Najlepszy wybór | Powód |
|---|---|---|
| Certyfikat TLS/HTTPS | SHA-256 (minimum), SHA-384 dla wysokiego bezpieczeństwa | Wymagane przez CA/Browser Forum Baseline Requirements |
| Podpisywanie JWT (HMAC lub RSA) | SHA-256 (HS256/RS256) | Powszechne wsparcie; SHA-384/512 dla reżimów zgodności |
| Suma kontrolna integralności oprogramowania | SHA-256 | Branżowy standard; powszechnie rozumiany |
| Archiwalna lub długoterminowa integralność | SHA-512 | Większe wyjście, bezpieczny margines na nadchodzące dekady |
| Adresowanie treści (IPFS, OCI) | SHA-256 | De facto standard dla pamięci masowej z adresowaniem treści |
| Git (odczyt/zapis istniejących repozytoriów) | SHA-1 dla istniejących; SHA-256 dla nowych przez --object-format=sha256 | Git jest w trakcie migracji; SHA-1 nadal dominuje |
| Współpraca z Ethereum | Keccak-256 (nie NIST SHA-3) | Ethereum używa wariantu Keccak sprzed standaryzacji |
| Obrona warstwowa lub systemy niejawne | SHA-384 lub SHA-512 | NSA Suite B; współpracuje z AES-256-GCM |
| Nowy kod, brak ograniczeń legacy | SHA-3 (SHA3-256) | Inna linia projektowa; brak podatności na atak rozszerzenia długości |
| Przechowywanie haseł | Żaden z powyższych | Używaj bcrypt, Argon2id lub scrypt — SHA jest zbyt szybki |
Rodzina SHA w skrócie
| Algorytm | Standard | Bity wyjścia | Znaki hex | Rok | Status NIST | Główne zastosowanie dziś |
|---|---|---|---|---|---|---|
| SHA-1 | FIPS 180-4 | 160 | 40 | 1995 | Wycofany (2011), usunięty dla podpisów cyfrowych | Git legacy, odciski cyfrowe |
| SHA-256 | FIPS 180-4 | 256 | 64 | 2001 | Aktualny | TLS, JWT, Bitcoin, sumy kontrolne |
| SHA-384 | FIPS 180-4 | 384 | 96 | 2001 | Aktualny | Suite B, TLS wysokiego bezpieczeństwa |
| SHA-512 | FIPS 180-4 | 512 | 128 | 2001 | Aktualny | Archiwizacja, LUKS, HMAC-SHA-512 |
| SHA-3 (dowolny wariant) | FIPS 202 | 224/256/384/512 | różnie | 2015 | Aktualny | Alternatywna linia projektowa, akceleracja sprzętowa |
SHA-1 i SHA-2 (grupa 256/384/512) używają konstrukcji Merkle-Damgård. SHA-3 używa konstrukcji gąbkowej (sponge) — różnica, która ma większe znaczenie niż mogłoby się wydawać, opisana poniżej.
SHA-1: złamany, ale nie martwy
SHA-1 był koniem roboczym lat 2000. Certyfikaty SSL, poczta S/MIME, odciski PGP i Git — wszystko zbiegło się przy nim. Następnie w lutym 2017 roku Google i CWI Amsterdam opublikowali SHAttered: atak kolizyjny z wybranym prefiksem, który wyprodukował dwa różne pliki PDF o identycznych hashach SHA-1. Atak wymagał około 6,5 × 10^19 obliczeń SHA-1 — kosztowny w 2017 roku, dziś dostępny przy użyciu chmury obliczeniowej.
NIST wycofał już SHA-1 dla podpisów cyfrowych w 2011 roku (NIST Special Publication 800-131A). Demonstracja SHAttered przyspieszyła porządki: przeglądarki przestały ufać certyfikatom TLS SHA-1 w 2017 roku, a CA/Browser Forum uczyniło SHA-256 obowiązkowym dla nowych certyfikatów.
Do czego SHA-1 nadal się używa:
- Baza obiektów Git: Git został zaprojektowany wokół SHA-1 jako szybkiego hash treści, a nie prymitywu bezpieczeństwa. Format repozytorium na stałe koduje 40-znakowe identyfikatory obiektów hex. Istnieje ścieżka migracji do SHA-256 (
git init --object-format=sha256), ale adopcja jest powolna, ponieważ każda hostowana platforma, każde narzędzie CI i każdy istniejący klon musiałyby migrować jednocześnie. - Odciski systemów legacy: Stare odciski kluczy hosta SSH, odciski kluczy PGP i schematy numerów seryjnych certyfikatów nadal ujawniają wartości SHA-1. Mają charakter informacyjny, a nie krytyczny dla bezpieczeństwa w większości kontekstów.
Co robić: Nie używaj SHA-1 do niczego nowego. W przypadku Git ryzyko kolizji jest niskie dla typowych przepływów pracy w tworzeniu oprogramowania (atakujący musiałby kontrolować oba pliki w kolizji), ale nowe projekty używające --object-format=sha256 są właściwym kierunkiem długoterminowym.
Wygeneruj hash SHA-1 w przeglądarce: Generator SHA-1.
SHA-256: koń roboczy
SHA-256 to algorytm, który napędza internet w 2026 roku. Każdy certyfikat TLS wystawiony przez publiczne CA używa SHA-256 jako hash podpisu. Każdy JWT podpisany przez HS256, RS256 lub ES256 używa SHA-256 wewnętrznie. Proof-of-work Bitcoina to podwójny SHA-256. Hash treści Dockera to SHA-256. Integralność pakietów npm używa SHA-256.
Powody są praktyczne:
- Margines bezpieczeństwa: 256 bitów wyjścia oznacza 2^128 operacji dla ataku preimage brute-force — poza zasięgiem jakiegokolwiek wyobrażalnego sprzętu w przewidywalnej przyszłości. Rzeczywisty poziom bezpieczeństwa jest nieco niższy ze względu na ataki kolizyjne z granicy urodzinowej (2^128 operacji), nadal nienaruszony.
- Akceleracja sprzętowa: SHA-256 jest zaimplementowany w krzemie na każdym procesorze Intel Goldmont+ (rozszerzenie SHA-NI), każdym układzie Apple silicon, każdym procesorze ARMv8 i dedykowanych ASIC w urządzeniach sieciowych i kontrolerach pamięci masowej. Gdy używana jest ścieżka sprzętowa, przepustowość SHA-256 przewyższa wiele pozornie szybszych alternatyw programowych.
- Powszechna obsługa bibliotek: Każda biblioteka TLS, każda biblioteka JWT, każda standardowa biblioteka języka implementuje SHA-256. Nie napotkasz ściany kompatybilności.
Do adresowania treści, weryfikacji integralności i większości przepływów podpisywania SHA-256 jest właściwym domyślnym wyborem, chyba że konkretny standard wymaga inaczej.
Wygeneruj hash SHA-256 w przeglądarce: Generator SHA-256.
SHA-384: specjalność TLS
SHA-384 to SHA-512 obcięty do 384 bitów. Został stworzony, aby zapewnić 192-bitowy poziom bezpieczeństwa (połowa rozmiaru wyjścia to dolna granica odporności na kolizje) i włączony do kryptografii NSA Suite B obok AES-256-GCM i kluczy krzywej eliptycznej P-384.
Dwie właściwości sprawiają, że SHA-384 jest szczególnie atrakcyjny dla TLS:
- Odporność na rozszerzenie długości przy tym rozmiarze wyjścia: SHA-256 i SHA-512 są podatne na ataki rozszerzenia długości — atakujący, który zna
H(secret || message), może obliczyćH(secret || message || extension)bez znajomości sekretu. SHA-384 i SHA-512/256 są obcięte z pełnego stanu wewnętrznego, więc rozszerzenie długości nie ma zastosowania. Jeśli używasz surowych hashów SHA jako MAC (zamiast HMAC), SHA-384 jest bezpieczniejszy. - Zgodność z Suite B: Organizacje zobowiązane do spełnienia wymagań pakietu NSA/CNSA (Commercial National Security Algorithm) muszą używać SHA-384 lub SHA-512 wraz z RSA-3072+, ECDH P-384 i AES-256-GCM. Jeśli twoim klientem jest agencja federalna USA lub wykonawca działający zgodnie z wymaganiami FIPS 140-3, SHA-384 może być wymagany.
SHA-384 nie jest znacząco bezpieczniejszy niż SHA-256 w większości przypadków użycia — praktyczna przepaść między 128-bitową a 192-bitową odpornością na kolizje jest teoretyczna przy obecnych poziomach obliczeń. Wybieraj go, gdy wymaga tego zgodność lub parowanie z Suite B, a nie do ogólnego użytku.
Wygeneruj hash SHA-384 w przeglądarce: Generator SHA-384.
SHA-512: gdy potrzebujesz więcej bitów
SHA-512 produkuje 512-bitowy (128-znakowy hex) skrót. Na sprzęcie 64-bitowym jest często szybszy niż SHA-256, ponieważ algorytm operuje na słowach 64-bitowych zamiast 32-bitowych — wewnętrzny harmonogram SHA-256 używa arytmetyki 32-bitowej, podczas gdy SHA-512 używa arytmetyki 64-bitowej, która wydajniej mapuje się na nowoczesne procesory.
Testy wydajności na sprzęcie 64-bitowym (orientacyjne; przeglądarkowe Web Crypto API):
| Algorytm | Przybliżona przepustowość |
|---|---|
| SHA-1 | ~600 MB/s |
| SHA-256 | ~500 MB/s |
| SHA-384 | ~700 MB/s |
| SHA-512 | ~700 MB/s |
| SHA-3-256 | ~300 MB/s |
Uwaga: SHA-384 i SHA-512 mają tę samą wewnętrzną funkcję kompresji, więc działają z tą samą prędkością. SHA-256 jest wolniejszy na 64-bitowych systemach, ponieważ jego 32-bitowy rozmiar słowa wymaga więcej iteracji do przetworzenia każdego 512-bitowego bloku wiadomości. Na sprzęcie 32-bitowym lub ograniczonym SHA-256 jest szybszy.
SHA-512 jest dobrze dopasowany do:
- Integralności archiwalnej: Sumy kontrolne przeznaczone do przetrwania dekad korzystają z większego marginesu wyjścia.
- Szyfrowania całego dysku: Linux LUKS używa SHA-512 jako domyślnego hash PBKDF do wyprowadzania kluczy (jako komponent PBKDF2, nie jako samodzielny hash).
- HMAC-SHA-512: Używany w niektórych schematach podpisywania JWT (HS512) i uwierzytelnianiu API, gdzie preferowane są większe MAC.
- Generowania dużych ilości danych pseudolosowych: Aplikacje, które hashują ziarno i potrzebują wielu bitów wyjścia, mogą używać SHA-512, aby zmniejszyć liczbę wywołań hash.
Wygeneruj hash SHA-512 w przeglądarce: Generator SHA-512.
SHA-3: inna filozofia projektowania
SHA-3 to nie SHA-2 z większym wyjściem. To fundamentalnie inny algorytm oparty na konstrukcji gąbkowej zwanej Keccak, zaprojektowany przez Guido Bertoniego, Joana Daemena, Michaëla Peetersa i Gillesa Van Assche’a. NIST wybrał go jako zwycięzcę siedmioletniego publicznego konkursu (2007–2012) mającego na celu wyprodukowanie rodziny hash, która mogłaby służyć jako kopia zapasowa w razie znalezienia słabości w konstrukcji Merkle-Damgård SHA-2.
Konstrukcja gąbkowa działa inaczej niż Merkle-Damgård:
- Dane wejściowe są dopełniane i dzielone na bloki.
- Każdy blok jest XORowany z pierwszą częścią dużego stanu wewnętrznego (czyli „szybkością”), a następnie cały stan jest permutowany permutacją Keccak-f.
- Po wchłonięciu wszystkich danych wejściowych wyjście jest „wyciskane” z części szybkościowej stanu.
Ponieważ wyjście jest wyodrębniane tylko z części stanu, a część pojemnościowa nigdy nie jest bezpośrednio eksponowana, konstrukcje gąbkowe są z natury odporne na ataki rozszerzenia długości bez obcinania.
Standardowe warianty SHA-3 (FIPS 202):
| Wariant | Bity wyjścia | Poziom bezpieczeństwa |
|---|---|---|
| SHA3-224 | 224 | 112-bitowy |
| SHA3-256 | 256 | 128-bitowy |
| SHA3-384 | 384 | 192-bitowy |
| SHA3-512 | 512 | 256-bitowy |
| SHAKE128 | zmienny | 128-bitowy |
| SHAKE256 | zmienny | 256-bitowy |
SHA-3 vs SHA-2 w praktyce:
SHA-3 nie jest jeszcze powszechnie wdrożony w protokołach zaprojektowanych przed 2015 rokiem — TLS, JWT i większość infrastruktury internetowej nadal używa SHA-2. SHA-3 pojawia się w schematach podpisów post-kwantowych (CRYSTALS-Dilithium, SPHINCS+ używają SHA-3 wewnętrznie), nowych projektach protokołów chcących backup z innej linii projektowej oraz sprzęcie, gdzie permutacja Keccak dobrze się akceleruje. W czystym oprogramowaniu SHA-3 jest około 40% wolniejszy niż SHA-256 na x86.
Wygeneruj hash SHA-3 w przeglądarce: Generator SHA-3.
Rozróżnienie Ethereum Keccak-256
Krytyczna pułapka: Ethereum nie używa NIST SHA-3. Ethereum zostało zaprojektowane, gdy konkurs Keccak był w toku i przed finalizacją FIPS 202 przez NIST. Maszyna wirtualna Ethereum używa oryginalnego zgłoszenia Keccak-256, które używa innego dopełnienia niż sfinalizowany standard NIST SHA-3.
Konkretnie:
- NIST SHA3-256 dołącza dopełnienie
0x06przed ostatnim blokiem. - Oryginalny Keccak-256 (używany przez Ethereum) dołącza dopełnienie
0x01.
Ta sama wartość wejściowa produkuje różne hashe. Wywołanie NIST SHA3-256 i wywołanie keccak256 Ethereum nie są zamienne. Większość języków ma oba: w Pythonie hashlib.sha3_256() to NIST SHA-3; dla Keccak-256 używanego przez Ethereum potrzebujesz biblioteki jak pysha3 (która implementuje keccak_256). W JavaScript biblioteka js-sha3 udostępnia oba. Generator SHA-3 implementuje NIST SHA3-256 — jeśli potrzebujesz hashów Ethereum Keccak-256, użyj narzędzia specyficznego dla Ethereum.
Testy wydajności
Poniższe liczby są orientacyjne dla przeglądarkowego Web Crypto API na nowoczesnym laptopie x86-64. Rzeczywista przepustowość zależy od sprzętu, rozmiaru wiadomości i tego, czy platforma używa ścieżki akceleracji sprzętowej.
| Algorytm | Przepustowość strumieniowa (64-bitowa) |
|---|---|
| SHA-1 | ~600 MB/s |
| SHA-256 | ~500 MB/s |
| SHA-384 | ~700 MB/s |
| SHA-512 | ~700 MB/s |
| SHA-3-256 | ~300 MB/s |
Dla małych wiadomości (tokeny API, sumy kontrolne poniżej kilku KB) wszystkie algorytmy kończą się w mniej niż 2 µs — różnica jest niewidoczna. Dla dużych danych (archiwa tar, obrazy dysków) SHA-384/512 bije SHA-256 na 64-bitowych systemach, ponieważ operują na słowach 64-bitowych. SHA-3 jest wolniejszy w czystym oprogramowaniu; preferuj SHA-2 w kodzie krytycznym dla przepustowości, chyba że dostępna jest sprzętowa akceleracja Keccak. Przepustowość SHA-1 nigdy nie jest powodem do jego używania.
Typowe pułapki
Niezgodności kodowania
SHA operuje na bajtach. Jeśli hasujesz ciąg "hello" w przeglądarce, gdzie JavaScript koduje go jako UTF-16 zamiast UTF-8, otrzymasz inny skrót niż skrypt Python, który używa str.encode("utf-8"). Zawsze normalizuj do UTF-8 przed hashowaniem tekstu.
Spójny wzorzec:
const encoder = new TextEncoder(); // UTF-8
const data = encoder.encode(inputString);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
Brak soli dla MAC
Używanie surowego hash SHA jako kodu uwierzytelniania wiadomości (H(secret || message)) jest podatne na ataki rozszerzenia długości w przypadku SHA-256 i SHA-512. Zamiast tego używaj HMAC (RFC 2104): HMAC-SHA256(key, message). HMAC opakowuje hash wewnętrzną i zewnętrzną podkładką z kluczem, która zapobiega atakom rozszerzenia.
Rozszerzenie długości w SHA-256
Jeśli tworzysz podpis API jako SHA256(secret + payload), atakujący znający wynikowy hash może obliczyć SHA256(secret + payload + attacker_extension) bez znajomości sekretu. Rozwiązanie: użyj HMAC, lub użyj SHA-3 (odporny z konstrukcji), lub użyj SHA-384/SHA-512/256 (odporny dzięki obcinaniu).
Mylenie Keccak-256 z NIST SHA-3
Jak opisano powyżej: Ethereum używa Keccak-256 z dopełnieniem 0x01; NIST SHA3-256 używa dopełnienia 0x06. Produkują różne wyjścia z tych samych danych wejściowych. Sprawdź, który wariant implementuje twoja biblioteka, przed integracją z kontraktami Ethereum lub kodowaniem ABI Solidity.
Używanie SHA do haseł
Algorytmy SHA są zaprojektowane, by być szybkie. To dokładnie zła właściwość do przechowywania haseł: klaster GPU może obliczać miliardy hashów SHA-256 na sekundę, co sprawia, że atak słownikowy na bazę danych haseł hashowanych SHA jest praktyczny. Do haseł używaj funkcji wyprowadzania kluczy z dużym zapotrzebowaniem na pamięć: Argon2id (zalecany), bcrypt lub scrypt. Nigdy nie przechowuj haseł jako surowych hashów SHA, nawet z solą.
Najczęściej zadawane pytania
Jaka jest różnica między SHA-1 a SHA-256?
SHA-1 i SHA-256 to obie funkcje hash Merkle-Damgård standaryzowane w FIPS 180-4, ale SHA-256 produkuje 256-bitowy skrót w porównaniu z 160-bitowym skrótem SHA-1. Co ważniejsze, SHA-1 został złamany: rzeczywisty atak kolizyjny (SHAttered, 2017) zademonstrował dwa różne pliki PDF z tym samym hashem SHA-1. SHA-256 nie ma znanych ataków kolizyjnych i zapewnia 128-bitowy poziom odporności na kolizje. Używaj SHA-256 do wszystkiego wymagającego gwarancji integralności; nie używaj SHA-1 do nowych prac.
Czy SHA-512 jest szybszy niż SHA-256?
Na sprzęcie 64-bitowym tak, często o 30–40% dla dużych danych wejściowych. SHA-512 używa arytmetyki słów 64-bitowych, którą nowoczesne procesory przetwarzają natywnie. SHA-256 używa arytmetyki słów 32-bitowych, wymagając dwukrotnie więcej operacji na blok wiadomości na tym samym sprzęcie. Na platformach 32-bitowych lub ograniczonych mikrokontrolerach SHA-256 jest szybszy. Dla krótkich wiadomości (poniżej kilku KB) różnica jest niezauważalna.
Czy powinienem migrować z SHA-1 na SHA-256?
Dla podpisów cyfrowych, certyfikatów TLS i podpisywania kodu: tak, zdecydowanie — SHA-1 jest wycofany i aktywnie złamany. Dla repozytoriów Git: ścieżka migracji istnieje (git init --object-format=sha256), ale adopcja jest powolna ze względu na wymagania koordynacji ekosystemu; ryzyko kolizji dla typowego użycia repozytorium jest niskie. Dla informacyjnych odcisków (wyświetlanie klucza hosta SSH): ekspozycja bezpieczeństwa jest minimalna, ale migracja do SHA-256 to dobra higiena.
Czy SHA-256 można odwrócić?
Nie. SHA-256 jest z założenia funkcją jednokierunkową. Mając hash, nie możesz matematycznie odzyskać oryginalnych danych wejściowych. Co atakujący mogą zrobić, to przeprowadzić atak słownikowy lub brute-force: obliczyć hash milionów kandydujących danych wejściowych i porównać. Dla danych wejściowych o niskiej entropii (krótkie ciągi, popularne hasła, liczby sekwencyjne) wstępnie obliczone tablice tęczowe czynią to praktycznym. Dla danych wejściowych o wysokiej entropii (losowe UUID, duże pliki) odwrócenie nie jest obliczeniowo wykonalne. Dlatego sam SHA jest nieodpowiedni do haseł — potrzebujesz wolnej, osolonej funkcji KDF.
Kiedy powinienem używać SHA-3 zamiast SHA-2?
SHA-3 jest odpowiedni, gdy: (a) chcesz hash z innej linii projektowej jako ubezpieczenie przed przyszłymi słabościami SHA-2; (b) twój protokół wymaga odporności na rozszerzenie długości bez używania HMAC; (c) implementujesz schematy podpisów post-kwantowych, które wewnętrznie określają SHA-3; lub (d) masz akcelerację sprzętową dla Keccak i potrzebujesz przepustowości. W przypadku większości codziennych zastosowań (TLS, JWT, sumy kontrolne) SHA-256 ma szersze wsparcie ekosystemu i jest pragmatycznym domyślnym wyborem. SHA-3 nie jest bezpieczniejszy niż SHA-2 przy równoważnych rozmiarach wyjścia — to inny zakład na długoterminowe bezpieczeństwo.
Dlaczego Ethereum używa Keccak-256 zamiast NIST SHA-3?
Ethereum zostało zaprojektowane w latach 2013–2014, przed opublikowaniem przez NIST FIPS 202 (sierpień 2015) finalizującego standard SHA-3. W tamtym czasie zgłoszenie Keccak było uważane za prawdopodobnego zwycięzcę, a autorzy Ethereum użyli go bezpośrednio. Gdy NIST sfinalizował standard, zmienił dopełnienie separacji dziedziny z 0x01 (oryginał Keccak) na 0x06, produkując inne wyjście z tych samych danych wejściowych. Ethereum było już wdrożone z oryginalnym dopełnieniem Keccak i nie mogło tego zmienić. Zatem „ethereum keccak256” i „NIST SHA3-256” to różne algorytmy mimo wspólnej bazowej permutacji Keccak-f.
Wypróbuj narzędzia: SHA-1 · SHA-256 · SHA-384 · SHA-512 · SHA-3 — wszystkie działają w przeglądarce, żadne dane nie opuszczają twojego komputera.