Przejdź do treści
Toova
Wszystkie narzędzia

MD5 vs SHA-256 vs SHA-512 — Funkcje Skrótu Wyjaśnione

Toova

Funkcje skrótu są wszędzie w rozwoju oprogramowania: sprawdzanie integralności plików, przechowywanie haseł, podpisy cyfrowe, uwierzytelnianie API, klucze cache, deduplikacja. Mimo to większość programistów pracuje z nimi jako czarnymi skrzynkami - podajesz string, dostajesz z powrotem stałej długości skrót hex. Szczegóły którą funkcję skrótu używać, a której unikać, okazują się mieć duże znaczenie.

MD5 jest złamane. SHA-1 jest przestarzałe. SHA-256 i SHA-512 są obecnie bezpieczne. SHA-3 istnieje, jeśli chcesz future-proofingu. Ale "złamane" nie oznacza tego samego w każdym kontekście - MD5 jest w porządku dla niektórych przypadków użycia i katastrofalnie złe dla innych. Ten przewodnik wyjaśnia właściwości, które mają znaczenie, jak każda funkcja stoi wobec nich, i daje ci jasny framework decyzyjny do wyboru właściwego skrótu w 2026.

Co Faktycznie Robi Funkcja Skrótu

Kryptograficzna funkcja skrótu mapuje wejście o dowolnej długości na wyjście o stałej długości (skrót lub hash). Trzy właściwości definiują kryptograficznie bezpieczną funkcję skrótu:

  • Odporność na preimage - dany skrót h, powinno być obliczeniowo niewykonalne znaleźć dowolne wejście m takie, że hash(m) = h. To właściwość "jednokierunkowa".
  • Odporność na second preimage - dane wejście m1, powinno być niewykonalne znaleźć inne wejście m2 takie, że hash(m1) = hash(m2).
  • Odporność na kolizje - powinno być niewykonalne znaleźć dowolne dwa różne wejścia m1 i m2 takie, że hash(m1) = hash(m2).

Funkcja zawodząca w którejkolwiek z tych właściwości jest uważana za złamaną dla użytku kryptograficznego. Zauważ, że "niewykonalne" ma tu konkretne znaczenie: nie oznacza matematycznie niemożliwe, oznacza wymagające więcej obliczeń niż jest praktyczne na obecnym lub przewidywalnym sprzęcie.

Dodatkowo, kryptograficzne funkcje skrótu wykazują efekt lawiny: zmiana pojedynczego bitu w wejściu produkuje wyjście różniące się w mniej więcej połowie swoich bitów. To zapewnia, że podobne wejścia produkują całkowicie różne skróty.

Wejście:  "hello"
MD5:      5d41402abc4b2a76b9719d911017c592  (128-bit / 32 znaków hex)

Wejście:  "Hello"
MD5:      8b1a9953c4611296a827abf8c47804d7  (zmiana jednego znaku = całkowicie inne wyjście)

MD5 — Szybki, Wszędobylski i Złamany

Historia i design

MD5 (Message Digest 5) został zaprojektowany przez Rona Rivesta w 1991 i produkuje 128-bitowy (16-bajtowy) skrót. Przez większość lat 90. był standardowym wyborem do weryfikacji integralności plików, podpisywania certyfikatów i hashowania haseł. Jest niezwykle szybki - nowoczesny CPU może obliczyć dziesiątki milionów hashy MD5 na sekundę, a GPU może obliczyć miliardy.

Dlaczego MD5 jest złamane

W 2004 Xiaoyun Wang i koledzy zademonstrowali praktyczny atak kolizyjny przeciwko MD5 - dwa różne pliki produkujące ten sam hash MD5. Atak biegnie w minutach na sprzęcie konsumenckim. W 2008 naukowcy stworzyli fałszywy certyfikat CA używając kolizji MD5, demonstrując, że rzeczywista infrastruktura PKI była podatna. Do 2012 malware Flame użył kolizji MD5 do sfałszowania certyfikatu podpisywania kodu Microsoftu.

NIST oficjalnie wycofał MD5 dla większości zastosowań kryptograficznych. Urzędy certyfikacji przestały wydawać certyfikaty podpisane MD5 do 2009. Dostawcy przeglądarek usunęli wsparcie dla podpisów certyfikatów MD5 około 2011.

Kiedy MD5 jest wciąż akceptowalne

MD5 nie jest uniwersalnie bezużyteczne. Dla niebezpiecznych sum kontrolnych - wykrywania przypadkowego uszkodzenia danych w transferach plików, adresowania opartego na zawartości w systemie cache, gdzie atakujący nie może wpływać na wejścia, lub generowania unikalnych identyfikatorów w zamkniętym systemie wewnętrznym - MD5 pozostaje adekwatne. Kluczowy test: jeśli atakujący może skorzystać na stworzeniu kolizji, nie używaj MD5. Jeśli liczy się tylko przypadkowe uszkodzenie, MD5 jest w porządku.

  • Bezpieczne: wewnętrzna deduplikacja, klucze cache, niebezpieczne wykrywanie zmiany plików
  • Niebezpieczne: certyfikaty, podpisy cyfrowe, hashowanie haseł, weryfikacja autentyczności plików, tokeny bezpieczeństwa

SHA-1 — Wycofane, Ale Jeszcze Nie Martwe

SHA-1 produkuje 160-bitowy skrót i był następcą MD5. Pozostawał standardem do podpisywania certyfikatów i kodu przez większość lat 2000. W 2017 atak SHAttered zademonstrował pierwszą praktyczną kolizję SHA-1, produkując dwa różne pliki PDF z identycznymi hashami SHA-1 używając około 110 GPU-lat obliczeń - drogo, ale w granicach budżetów państw narodowych i coraz bardziej dostępnie.

SHA-1 jest wycofane przez NIST i wszystkie główne urzędy certyfikacji. Nie powinno być używane dla certyfikatów, podpisywania kodu ani żadnej nowej aplikacji wrażliwej na bezpieczeństwo. Niektóre starsze systemy nadal używają SHA-1 wewnętrznie, ale migracja do SHA-256 jest mocno rekomendowana. Git nadal używa SHA-1 do adresowania obiektów (choć przejście na SHA-256 trwa), ale jest to wycofywane.

SHA-256 — Obecny Standard

SHA-256 jest częścią rodziny SHA-2, zaprojektowanej przez NSA i ustandaryzowanej przez NIST w FIPS 180-4. Produkuje 256-bitowy (32-bajtowy) skrót. SHA-256 było intensywnie analizowane od jego publikacji w 2001 i nie znaleziono żadnego praktycznego ataku. Jest de facto standardem dla:

  • Certyfikatów TLS (zasadniczo wszystkie certyfikaty wydawane dziś używają SHA-256)
  • Podpisywania kodu (Windows Authenticode, Apple notarization, JAR)
  • HMAC-SHA256 do uwierzytelniania API (AWS Signature v4, weryfikacja webhooków GitHub)
  • Podpisów tokenów JWT (HS256 i RS256 oba używają SHA-256 wewnętrznie)
  • ID transakcji blockchain (Bitcoin używa podwójnego SHA-256)
  • Weryfikacji integralności plików w menedżerach pakietów (npm, pip, apt)
Wejście:  "hello"
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
         (256-bit / 64 znaków hex)

SHA-512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d
         99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
         (512-bit / 128 znaków hex)

Wydajność SHA-256

SHA-256 używa wewnętrznie operacji na słowach 32-bitowych. Na sprzęcie 32-bitowym lub starszych CPU bez sprzętowej akceleracji jest zauważalnie wolniejszy niż MD5. Na nowoczesnych 64-bitowych CPU z rozszerzeniami SHA (Intel Goldmont+, AMD Zen+, Apple Silicon, ARM Cortex-A57+), SHA-256 jest sprzętowo akcelerowany i niezwykle szybki - często zbliżający się do prędkości MD5. Większość środowisk serwerowych ma akcelerację sprzętową, więc w praktyce SHA-256 jest wystarczająco szybki dla praktycznie wszystkich aplikacji.

SHA-512 — Szerszy, Czasem Szybszy

SHA-512 produkuje 512-bitowy (64-bajtowy) skrót używając wewnętrznie operacji na słowach 64-bitowych. Na sprzęcie 64-bitowym bez rozszerzeń SHA, SHA-512 może faktycznie być szybszy niż SHA-256, ponieważ jego operacje 64-bitowe lepiej wykorzystują nowoczesne szerokości rejestrów. Na sprzęcie z rozszerzeniami SHA, SHA-256 jest zwykle szybszy, ponieważ rozszerzenia są specyficznie zoptymalizowane dla SHA-256.

SHA-512 zapewnia większy margines bezpieczeństwa - 256-bitowa odporność na kolizje vs. 128-bitowa dla SHA-256. Dla większości obecnych modeli zagrożeń, 128-bitowa odporność na kolizje SHA-256 jest więcej niż wystarczająca (złamanie jej wymagałoby około 2^128 operacji). SHA-512 jest odpowiednie, gdy:

  • Targetujesz serwery 64-bitowe i chcesz maksymalnej przepustowości bez rozszerzeń sprzętowych
  • Potrzebujesz dłuższych skrótów jako materiału klucza dla innych operacji kryptograficznych
  • Chcesz dodatkowy margines bezpieczeństwa dla danych, które muszą pozostać chronione przez dekady
  • Implementujesz protokoły, które konkretnie wymagają SHA-512 (np. niektóre cipher suites TLS)

SHA-384 i SHA-512/256

SHA-384 to obcięta wersja SHA-512 produkująca 384 bity - użyteczna, gdy chcesz wewnętrznych operacji 64-bitowych SHA-512, ale potrzebujesz krótszego wyjścia. SHA-512/256 to inny obcięty wariant produkujący 256-bitowe wyjście używając wewnętrznych obliczeń SHA-512. SHA-512/256 jest odporne na ataki rozszerzania długości, które dotykają SHA-256, czyniąc go użytecznym w kontekstach, gdzie rozszerzanie długości jest problemem (chociaż HMAC już to mityguje w większości praktycznych scenariuszy).

SHA-3 — Inna Architektura, Future-Proof

SHA-3 (ustandaryzowane w NIST FIPS 202, 2015) używa konstrukcji gąbczastej Keccak - fundamentalnie innego designu niż struktura Merkle-Damgard SHA-2. To ważne, ponieważ każda przyszła słabość odkryta w designie Merkle-Damgard wpłynęłaby na MD5, SHA-1 i SHA-2 równocześnie, podczas gdy SHA-3 pozostałby nienaruszony.

SHA-3 jest obecnie bezpieczne i jest właściwym wyborem dla nowych systemów potrzebujących długoterminowej pewności lub chcących zabezpieczyć się przed przyszłymi słabościami SHA-2. Jest wolniejsze niż SHA-256 w czystych implementacjach programowych. Gdzie SHA-3 błyszczy, to w implementacjach sprzętowych - jego design jest bardzo wydajny w krzemie. SHA-3-256 i SHA-3-512 produkują te same rozmiary skrótów co ich odpowiedniki SHA-2.

Tabela Porównawcza

Algorytm Wyjście Odporność na kolizje Status Szybkość (SW) Użyć do haseł?
MD5 128-bit Złamane Wycofane Bardzo szybkie Nigdy
SHA-1 160-bit Złamane Wycofane Szybkie Nigdy
SHA-256 256-bit 128-bit Obecny standard Szybkie (HW akcel) Nigdy (zbyt szybkie)
SHA-512 512-bit 256-bit Bezpieczne Szybkie na 64-bit Nigdy (zbyt szybkie)
SHA-3-256 256-bit 128-bit Future-proof Umiarkowane (SW) Nigdy (zbyt szybkie)
bcrypt 60-znakowy string N/A Tylko hasła Celowo wolne Tak

Hashowanie Haseł: Całkowicie Inny Problem

To zasługuje na własną sekcję, ponieważ jest to jeden z najczęstszych błędów popełnianych przez programistów. SHA-256 to właściwe narzędzie do sprawdzeń integralności plików, podpisywania API i weryfikacji certyfikatów. Jest to złe narzędzie do hashowania haseł, a używanie go w tym celu powoduje rzeczywiste incydenty bezpieczeństwa.

Problemem jest szybkość. SHA-256 jest zaprojektowane, aby być szybkie - nowoczesny GPU może obliczyć miliardy hashy SHA-256 na sekundę. Atakujący, który zdobędzie twoją bazę zahashowanych haseł, może próbować miliardów odgadnięć haseł na sekundę. Nawet długie, losowe hasło może być szybko złamane, jeśli hash jest szybki.

// NIGDY tego nie rób dla haseł
const hash = crypto.createHash('sha256').update(password).digest('hex');
// Użyj bcrypt, scrypt lub Argon2 dla haseł
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);  // czynnik kosztu 12

Narzędzie Bcrypt Test pozwala hashować i weryfikować hasła bcrypt w przeglądarce. Do zrozumienia czynników kosztu bcrypt i ich czasu obliczeń, jest to użyteczna referencja podczas konfigurowania czynnika pracy twojej aplikacji.

HMAC: Dodawanie Uwierzytelniania do Hasza

Zwykły hash niczego nie udowadnia co do tego, kto go obliczył - każdy, kto ma dane, może obliczyć ten sam hash SHA-256. HMAC (Hash-based Message Authentication Code) dodaje tajny klucz do obliczenia, produkując tag, który może być odtworzony tylko przez kogoś, kto zna klucz. HMAC-SHA256 to standard dla:

  • Weryfikacji podpisów webhooków (GitHub, Stripe, Shopify wszystkie używają HMAC-SHA256)
  • AWS Signature Version 4 (podpisywanie żądań)
  • Tokenów JWT HS256 (HMAC-SHA256 nagłówka + payload)
  • Integralności ciasteczek (podpisywanie ciasteczek sesji, aby zapobiec manipulacji)
const crypto = require('crypto');

// Podpisz wiadomość z HMAC-SHA256
const mac = crypto
  .createHmac('sha256', secretKey)
  .update(message)
  .digest('hex');

// Weryfikuj: porównaj w stałym czasie (zapobiega atakom czasowym)
const isValid = crypto.timingSafeEqual(
  Buffer.from(mac, 'hex'),
  Buffer.from(received, 'hex')
);

Zauważ użycie timingSafeEqual do porównania. Porównywanie wartości MAC zwykłym sprawdzaniem równości stringów wycieka informacje czasowe, które mogą być wykorzystane w ataku czasowym. Zawsze używaj funkcji porównania o stałym czasie podczas weryfikacji MAC. Użyj HMAC Generator, aby obliczyć wartości HMAC-SHA256 do testowania i debugowania bez pisania kodu.

Rzeczywiste Rekomendacje

Ogólna integralność plików (sumy kontrolne)

Użyj SHA-256. To standard dla weryfikacji pakietów (lockfile'i npm, hashe wymagań pip, warstwy obrazów Docker). Narzędzie SHA-256 Hash oblicza skróty SHA-256 w twojej przeglądarce dla wejścia tekstowego lub wartości stringowych. Do szybkich niebezpiecznych sum kontrolnych, gdzie szybkość jest krytyczna i ufasz źródłu, MD5 pozostaje akceptowalne, ale SHA-256 jest preferowane w dowolnym kontekście współdzielonym lub zautomatyzowanym.

Certyfikaty TLS i podpisywanie kodu

SHA-256 to wymagany standard. Wszystkie urzędy certyfikacji wydają certyfikaty SHA-256. Nigdy nie używaj MD5 ani SHA-1 dla nowych certyfikatów - zostaną odrzucone przez nowoczesne przeglądarki i systemy operacyjne.

Uwierzytelnianie API

Użyj HMAC-SHA256. To ustanowiony standard, dobrze obsługiwany we wszystkich językach, i algorytm oczekiwany przez większość dokumentacji bezpieczeństwa API. Obliczaj skróty narzędziem MD5 Hash lub SHA-256 Hash do szybkich porównań i generuj podpisy HMAC narzędziem HMAC Generator.

Hashowanie haseł

Użyj bcrypt (czynnik kosztu 12+), scrypt lub Argon2id. Nigdy nie używaj bezpośrednio MD5, SHA-1, SHA-256 ani SHA-512 dla haseł, nawet z saltingiem. Narzędzie Bcrypt Test może pomóc ci zweryfikować hashe bcrypt podczas rozwoju.

Długożyciowe dane wymagające dekad bezpieczeństwa

Preferuj SHA-512 lub SHA-3-256. Większy rozmiar skrótu zapewnia dodatkowy margines przed postępami w kryptoanalizie. NIST rekomenduje SHA-512 i SHA-3 dla aplikacji wymagających długoterminowego bezpieczeństwa. Zobacz oficjalne wytyczne w NIST FIPS 180-4 dla autorytatywnej specyfikacji algorytmów SHA-2.

Nowe systemy bez ograniczeń legacy

SHA-256 do ogólnego użytku. Argon2id do haseł. HMAC-SHA256 do kodów uwierzytelniania. Jeśli chcesz future-proofingu i możesz zaakceptować nieco niższą wydajność, SHA-3-256 to solidna alternatywa dla SHA-256 dla hashowania ogólnego przeznaczenia.