Skip to content
Powrót do bloga
Bezpieczeństwo

Konwersja MD5 na SHA-256? Dlaczego to niemożliwe i co zrobić

Nie da się przekonwertować skrótu MD5 na SHA-256 — hash jest funkcją jednokierunkową. Co naprawdę robią konwertery. Darmowe narzędzia online.

11 min czytania

Konwersja MD5 na SHA-256? Dlaczego to niemożliwe i co zrobić

Sporo stron obiecuje taką konwersję, a część z nich wygląda na działające narzędzia. Reklamowana operacja nie istnieje. Powód, dla którego nie istnieje, wskazuje jednocześnie, co zrobić zamiast niej.

Krótka odpowiedź: nie da się przekonwertować MD5 na SHA-256 (ani SHA-256 na MD5)

Skrótu MD5 nie można przekonwertować na SHA-256. Skrót MD5 to 128 bitów wyjścia, które nie zawierają danych wejściowych, z jakich powstały. SHA-256 potrzebuje tych danych, żeby cokolwiek policzyć. Bez oryginału brakuje środkowego kroku i żadna biblioteka ani strona tego nie nadrobi.

Te same dane wejściowe pod trzema algorytmami:

AlgorytmSkrót z helloZnaki szesnastkoweBity
MD55d41402abc4b2a76b9719d911017c59232128
SHA-1aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d40160
SHA-2562cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b982464256

Te trzy skróty można czytać jak zwykłe ciągi znaków. Nie mają wspólnego prefiksu ani żadnej zależności arytmetycznej. Łączy je wyłącznie słowo hello, którego żaden z nich nie przenosi. Każdy da się policzyć samodzielnie w generatorze MD5 i generatorze SHA-256, a przy dopisywaniu kolejnych znaków widać, że zmieniają się niezależnie od siebie.

Kierunek nic tu nie zmienia. Droga z SHA-256 do MD5 zawodzi z tego samego powodu: obie funkcje celowo niszczą informację, więc z żadnego skrótu nie da się cofnąć do danych wejściowych, których potrzebowałby ten drugi.

Ciekawsze jest inne pytanie. Nikt nie wpisuje takiej frazy z ciekawości teoretycznej, więc za zapytaniem stoi konkretne zadanie. W praktyce jest to jedno z czterech zadań, a każde ma rozwiązanie:

  1. Weryfikacja pobranego pliku albo porównanie sum kontrolnych
  2. Migracja bazy haseł z MD5 na coś bezpieczniejszego
  3. Odzyskanie oryginalnych danych ukrytych za hashem
  4. Policzenie skrótu tych samych danych innym algorytmem

Każde z nich ma niżej własną sekcję. Najpierw jednak o tym, co robią strony obiecujące konwersję, bo kto raz rozpozna ten schemat, przestaje ufać ich wynikom.

Co się dzieje na stronie „konwertera MD5 na SHA-256”

Możliwości są tylko trzy i żadna z nich nie jest konwersją.

Pierwsza możliwość: strona prosi o oryginalny tekst. Po wklejeniu ciągu znaków wypisuje oba skróty, a tekst marketingowy nazywa to konwersją. To generator hashy z mylącą etykietą: nic nie zostało przekonwertowane, te same dane wejściowe przeliczono dwa razy, dwoma algorytmami.

Druga: strona wyszukuje skrót w tablicy. Trzyma tablicę par „dane wejściowe → skrót”, zebranych ze słowników i wycieków danych logowania. Po wklejeniu MD5, którego oryginał znajduje się w tej tablicy, odnajduje ten oryginał, liczy z niego skrót SHA-256 i pokazuje wynik. Działa to dla password, 123456 i długiego ogona innych krótkich ciągów. Dla wszystkiego innego zawodzi po cichu, dlatego takie strony często zwracają pusty wynik bez żadnego wyjaśnienia.

Trzecia jest najprostsza: strona nie robi nic. Zaskakująco wiele z nich wyświetla ponownie to, co zostało wklejone, albo zwraca SHA-256 z wklejonego ciągu szesnastkowego, sugerując, że to SHA-256 oryginalnych danych. Te dwie wartości są różne, a sekcja o podwójnym liczeniu skrótu niżej pokazuje, jak bardzo.

Test jest szybki. Wystarczy podać stronie 32-znakowy ciąg szesnastkowy i nic poza tym, a potem zadać sobie pytanie, skąd miałaby znać oryginał. Jeśli mimo to zwraca 64-znakowy wynik i nazywa go konwersją, to albo odpytuje tablicę, albo zwyczajnie kłamie. Konwerter hashy, który nigdy nie pyta o oryginalne dane, nie ma jak trafić inaczej niż przypadkiem.

Samo sformułowanie trzyma się mocno, bo brzmi jak nazwa operacji, która gdzie indziej działa bez zarzutu.

Hash, kodowanie i szyfrowanie: odwracalne są tylko dwa z trzech

Programista spotyka wszystkie trzy w ciągu jednego tygodnia i wrzuca je do tej samej mentalnej szuflady. Zachowują się jednak zupełnie inaczej:

OperacjaPrzykładOdwracalna?Co jest potrzebne
KodowanieBase64, hex, kodowanie URLTak, zawszeZupełnie nic
SzyfrowanieAES, RSATakKlucz
HashMD5, SHA-1, SHA-256NigdyNic nie pomoże

To Base64 wyrabia złą intuicję. Każdy może zdekodować ciąg Base64 z powrotem na bajty, bez klucza i bez żadnych uprawnień, a konwersja Base64 na hex to codzienna operacja. Oba zapisy to alternatywne sposoby zapisania tych samych bajtów. Kto raz widział to w działaniu, temu „MD5 na SHA-256” brzmi jak ten sam rodzaj przepisania.

A jednak nim nie jest. Kodowanie zachowuje każdy bit danych wejściowych, szyfrowanie chowa je za kluczem, a hash wyrzuca niemal wszystko. Skrót MD5 ma 16 bajtów niezależnie od tego, czy na wejściu było hasło, czy obraz dysku o rozmiarze 40 GB. Te 40 GB nie trafiło w żadne sprytne miejsce, tylko przepadło. FAQ narzędzia MD5 rozwija porównanie z szyfrowaniem, ale tutaj wystarczy jedno zdanie: nie ma klucza, więc nie ma czego odszyfrować.

„MD5 jest złamany” nie znaczy „MD5 jest odwracalny”

Mylą to nawet uczciwe artykuły, a pomyłka kosztuje, bo od zdania „MD5 złamano lata temu” prowadzi prosta droga do wniosku „więc ktoś na pewno potrafi to już odwrócić”.

W grze są dwa różne ataki:

  • Atak kolizyjny znajduje dwa różne wejścia dające ten sam skrót. Atakujący wybiera oba wejścia i nie zależy mu na tym, co konkretnie zawierają.
  • Atak na przeciwobraz (preimage) startuje od skrótu i odzyskuje wejście, które go daje. To właśnie ten atak pozwoliłby przekonwertować MD5 na SHA-256, bo oddałby z powrotem coś, co można podać na wejście SHA-256.

Odporność MD5 na kolizje padła w 2004 roku, a dziś kolizję da się skonstruować na zwykłym sprzęcie w kilka sekund. Dlatego MD5 nie nadaje się do podpisów, certyfikatów ani niczego, na co może wpłynąć przeciwnik.

Odporność MD5 na przeciwobraz nie padła. Najlepszy znany atak tego typu pozostaje teoretyczny, o złożoności 2^123.4 (Sasaki i Aoki, 2009). To ledwie odrobinę szybciej niż brute-force i wciąż daleko poza zasięgiem. Nikt nie odwraca dowolnych skrótów MD5, ani w 2004 roku, ani dziś.

Te dwa fakty stoją obok siebie bez sprzeczności: MD5 jest kryptograficznie złamany i MD5 nadal nie jest odwracalny. Jeśli chodzi o wybór jednego z dwóch algorytmów dla nowego systemu, a nie o konwersję między nimi, tę decyzję rozkłada na części porównanie MD5 i SHA-256.

Cztery zadania, które kryją się za tym pytaniem, i odpowiedź na każde

O co chodzi w praktyceWłaściwa odpowiedź
Weryfikacja pobranego pliku albo porównanie sum kontrolnychPoliczyć skrót z pliku od nowa, potrzebnym algorytmem
Migracja haseł zapisanych jako MD5Opakować je w bcrypt i podnosić przy logowaniu
Odzyskanie oryginalnych danych wejściowychTo łamanie, nie konwersja, i zależy od entropii
Skrót tych samych danych z innego algorytmuWrócić do bajtów źródłowych

Zadanie 1: porównanie sum kontrolnych albo weryfikacja pobranego pliku

Przeliczyć od nowa, nie konwertować. Plik leży na dysku, a to znaczy, że dostępna jest ta jedna rzecz, którą skrót utracił. Wystarczy uruchomić na nim potrzebny algorytm:

# GNU coreutils
md5sum    ubuntu-24.04-desktop-amd64.iso
sha256sum ubuntu-24.04-desktop-amd64.iso

# macOS
md5           ubuntu-24.04-desktop-amd64.iso
shasum -a 256 ubuntu-24.04-desktop-amd64.iso

Typowy zgrzyt wygląda tak: wydawca podaje wyłącznie MD5, a wewnętrzna polityka bezpieczeństwa wymaga SHA-256. Konwersja opublikowanego MD5 niczego by nie dowiodła, nawet gdyby była możliwa, bo skrót wyprowadzony z innego skrótu nie jest oświadczeniem wydawcy na temat pliku. Potrzebny jest SHA-256, który wydawca podpisał. Jeśli takiego nie udostępnia, policzenie własnego SHA-256 w generatorze SHA-256 i tak daje stabilny odcisk na użytek wewnętrzny: można go przypiąć, porównać między serwerami lustrzanymi i później wykryć zmianę. Nie zastąpi to jednak poświadczenia wydawcy.

Zadanie 2: migracja bazy haseł z MD5

Tu stawka jest najwyższa, a rozwiązanie dobrze wydeptane: opakować stare hashe, a potem przezroczyście podnosić każde konto przy logowaniu. Jedno zadanie wsadowe przepuszcza każdy zapisany hash MD5 przez bcrypt, a od tej pory ścieżka logowania najpierw liczy MD5 z przesłanego hasła i dopiero ten wynik porównuje z rekordem bcrypt.

Najpierw jedno ostrzeżenie, bo sporo starszych porad odwraca tę kwestię do góry nogami. Opakowanie MD5 w SHA-256 nie sprawia, że przechowywanie haseł staje się bezpieczne. SHA-256 to szybki hash, ta sama kategoria problemu co MD5, a karty graficzne przemielają oba bez wysiłku. Porada wskazująca wbudowaną funkcję bazy SHA2() jako lekarstwo rozwiązuje niewłaściwy problem. Potrzebny jest hash celowo wolny: bcrypt, scrypt albo Argon2. Zapisywać należy bcrypt(md5(password)), nigdy sha256(md5(password)). Porównanie bcrypt, Argon2 i scrypt pokazuje, jak wybrać jeden z tej trójki, a generator bcrypt pozwala przetestować współczynniki kosztu przed wdrożeniem.

Migracje wykłada zwykle co innego: sformułowanie „MD5 hasła” jest wieloznaczne, a dwa jego odczytania dają różne wyniki:

const { createHash } = require('node:crypto');

const md5Hex = createHash('md5').update('hello').digest('hex');
const md5Raw = createHash('md5').update('hello').digest();   // the same value as 16 bytes

createHash('sha256').update(md5Hex).digest('hex');
// 4914e23374bb211e3dca0df7636fefffc7fedd94f1340ae81c7d6c07b7113e9b

createHash('sha256').update(md5Raw).digest('hex');
// 88e20f0abb88153e3f0a9683668ccb5b84ed771817dc448a2b73254ed02c8d8c

createHash('sha256').update('hello').digest('hex');
// 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

Trzy wyniki, wszystkie poprawne, wszystkie różne. Skrót z 32-znakowego ciągu szesnastkowego daje jedną wartość, skrót z 16 surowych bajtów, które ten ciąg reprezentuje — drugą, a skrót z oryginalnego hasła — trzecią. Trzeba wybrać jedną konwencję, zapisać ją i stosować tę samą w skrypcie migracji oraz na ścieżce logowania. Pomyłka w tym miejscu odcina od kont wszystkich użytkowników naraz, a objaw wygląda na błąd biblioteki bcrypt, nie na decyzję o kodowaniu.

Przy opakowaniu w bcrypt bezpieczniejszą konwencją jest hex. Surowe bajty skrótu mogą zawierać bajt zerowy, a kilka implementacji bcrypt traktuje swoje wejście jak łańcuch w stylu C i kończy czytanie w tym miejscu. Hex omija to całkowicie, a przy 32 znakach mieści się z dużym zapasem w limicie długości wejścia bcrypt. Trzeba też ujednolicić wielkość liter, bo 5D41402A... i 5d41402a... to dla bcrypt różne ciągi, mimo że reprezentują ten sam skrót.

const bcrypt = require('bcrypt');
const { createHash } = require('node:crypto');

const legacyDigest = (password) =>
  createHash('md5').update(password, 'utf8').digest('hex');   // lowercase hex

// Batch job, run once: wrap each stored MD5, then drop the old column.
async function wrapRow(row) {
  return bcrypt.hash(row.md5_hash.toLowerCase(), 12);
}

// Login path
async function verify(password, row) {
  if (row.scheme === 'bcrypt') {
    return bcrypt.compare(password, row.hash);
  }
  const ok = await bcrypt.compare(legacyDigest(password), row.hash);
  if (ok) {
    const upgraded = await bcrypt.hash(password, 12);
    await saveCredential(row.id, { scheme: 'bcrypt', hash: upgraded });  // your DB write
  }
  return ok;
}

Konta przechodzą na czysty bcrypt w miarę tego, jak ich właściciele się logują. Dla maruderów wyznacza się termin, po którym logowanie wymusza reset hasła.

Zadanie 3: próba odzyskania oryginalnych danych wejściowych

Nazwanie tego wprost, choćby przed samym sobą, zmienia i narzędzia, i oczekiwania. Odzyskiwanie danych wejściowych ze skrótu to łamanie, nie konwersja, a to, czy się uda, nie ma nic wspólnego z tym, który algorytm wyprodukował ten skrót. Zależy od samych danych wejściowych.

Krótkie, popularne ciągi wybrane przez człowieka padają szybko. Słowa ze słownika, imiona z cyfrą na końcu i wszystko, co pojawiło się w zbiorze z wycieku, ustępuje wyszukaniu w tablicy albo krótkiemu przebiegowi brute-force. Długie losowe ciągi nie padają w ogóle, a przepaść między tymi dwoma przypadkami to nie kwestia dokupienia sprzętu.

Tablice tęczowe opisuje się zwykle zbyt ogólnie. Tablica odzyskuje dane wejściowe wyłącznie wtedy, gdy skrót policzono bez soli, a same dane znajdują się już w tablicy. Oba warunki muszą być spełnione naraz. Wystarczy dodać sól osobną dla każdego użytkownika, a wcześniej wyliczona tablica traci wartość, bo atakujący potrzebowałby osobnej tablicy na każdą sól. A jeśli na wejście trafi losowy token o długości 128 bitów, nie ma na świecie tablicy, która go zawiera. Przewodnik po entropii hasła podaje liczby, które wyznaczają tę granicę.

Jeśli chodzi o własne hasło, którego nie da się odtworzyć, to sprawa na reset, a nie na odzyskiwanie. Jeśli hasło należy do kogoś innego, uczciwe nazwanie sytuacji jest takie, jak wyżej.

Zadanie 4: te same dane ze skrótem z innego algorytmu („md5 to sha1 converter”)

Ten sam kształt co zadanie 1, tylko uogólniony. Para algorytmów w zapytaniu nie ma znaczenia, bo odpowiedź zawsze brzmi tak samo: wrócić do bajtów źródłowych i policzyć skrót jeszcze raz:

sha1sum   payload.bin
sha256sum payload.bin

Każdy znaleziony „md5 to sha1 converter” liczy skrót od nowa albo zagląda do tablicy, z tych samych powodów co wyżej. Jeśli oryginalne dane są niedostępne, zadanie nie ma rozwiązania i nie jest to ograniczenie dostępnych narzędzi. Algorytm docelowy pomaga wybrać porównanie rodziny SHA, a generator SHA-1 obsługuje starsze systemy, które wciąż go wymagają, choć żaden nowy system wymagać go nie powinien.

Jedyny przypadek, w którym wyszukiwanie w konwerterze naprawdę działa

Niektóre klasy danych są zbierane centralnie i indeksowane naraz po każdym popularnym skrócie. Standardowym przykładem są próbki złośliwego oprogramowania. Serwisy takie jak VirusTotal przechowują samą próbkę, więc policzyły jej MD5, SHA-1 i SHA-256 z tych samych bajtów i podpięły wszystkie trzy pod jeden rekord. Wyszukanie tam MD5 próbki zwraca jej SHA-256.

To złączenie w bazie danych, nie konwersja. Działa dlatego, że ktoś miał oryginalny plik i policzył z niego skrót każdym algorytmem, czyli wykonał ten sam krok przeliczenia co wyżej, tylko z wyprzedzeniem i przez kogoś innego. Warunki są ostre: obiekt musi już być w indeksie, a jego twórcy trzeba zaufać. Procesy threat intelligence opierają się na tym codziennie. Nie mówi to jednak nic o dowolnych skrótach MD5 i nigdy nie pomoże przy hashu własnych danych.

Mechanizm jest ten sam, z którego korzystają podejrzane strony konwerterów. Różnica polega na tym, że repozytorium złośliwego oprogramowania otwarcie mówi, że to wyszukiwanie w tablicy, i pokazuje sam rekord.

Jak sprawdzić to samodzielnie

Najszybciej widać to na dwóch skrótach tych samych danych, które zmieniają się razem, choć nic ich nie łączy:

$ printf 'hello' | md5sum
5d41402abc4b2a76b9719d911017c592  -
$ printf 'hello' | sha256sum
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824  -

Po zmianie jednego znaku oba wyjścia wyglądają zupełnie inaczej i nie mają ze sobą nic wspólnego. Ten sam tekst można wkleić obok siebie do generatora MD5 i generatora SHA-256 i zobaczyć to na żywo, albo sięgnąć po generator HMAC, gdy potrzebny jest skrót z kluczem do podpisania żądania API. Wszystkie trzy działają w całości w przeglądarce.

FAQ

Czy da się przekonwertować MD5 na SHA-256?

Nie. Skrót MD5 nie zawiera oryginalnych danych wejściowych, a SHA-256 potrzebuje ich, żeby cokolwiek wyprodukować. Każda strona twierdząca, że konwertuje, albo liczy skrót od nowa z podanego tekstu, albo wyszukuje wartość w bazie wcześniej wyliczonych par.

Dlaczego tyle serwisów oferuje „konwerter MD5 na SHA-256”?

Bo pozycjonują się na frazę, którą ludzie faktycznie wpisują. Po wejściu strona albo prosi o oryginalny tekst, czyli liczy skrót od nowa zamiast konwertować, albo nie zwraca nic użytecznego. Sformułowanie trzyma się dlatego, że stojące za nim nieporozumienie jest powszechne.

Czy można przekonwertować SHA-256 z powrotem na MD5?

Nie, a kierunek nie ma tu znaczenia. Obie funkcje są jednokierunkowe, więc żadnego ze skrótów nie da się zamienić w drugi bez oryginalnych danych wejściowych. Narzędzie oferujące podróż w drugą stronę stosuje tę samą sztuczkę z tablicą albo z ponownym liczeniem skrótu.

MD5 jest złamany — czy to nie znaczy, że da się go odwrócić?

Nie. Odporność MD5 na kolizje padła w 2004 roku, co oznacza, że da się wymusić wspólny skrót dla dwóch wejść. Odwrócenie skrótu to atak na przeciwobraz, a najlepszy znany wciąż kosztuje 2^123.4 operacji. Złamany dla podpisów, nadal nieodwracalny.

Jak zmigrować bazę haseł zapisanych jako MD5 na coś bezpieczniejszego?

W MySQL najbardziej oczywista jednolinijkowa poprawka, UPDATE users SET password = SHA2(password, 256), jest błędna — liczy skrót z zapisanego skrótu MD5, a nie z hasła, więc zapisywać trzeba bcrypt(md5(password)) i weryfikować przez tę samą otoczkę, podnosząc każdy rekord przy najbliższym udanym logowaniu. Opakowanie MD5 w SHA-256 nie pomaga, bo oba to szybkie hashe, a karta graficzna liczy jedno i drugie równie szybko.

Dlaczego podwójne liczenie skrótu daje nieoczekiwany wynik?

Skrót z szesnastkowego ciągu MD5 i skrót z jego 16 surowych bajtów dają różne wyjścia SHA-256. Oba są poprawne, bo to różne dane wejściowe. Trzeba wybrać jedną konwencję i stosować ją identycznie w skrypcie migracji oraz na ścieżce logowania.

Czy tablica tęczowa odzyska dane wejściowe ukryte za hashem MD5?

Tylko wtedy, gdy dane wejściowe były bez soli i znajdują się już w tablicy, co w praktyce oznacza ciągi krótkie lub popularne. Długich losowych danych wejściowych nie da się w ten sposób odzyskać, a sól osobna dla każdego użytkownika całkowicie unieważnia wcześniej wyliczone tablice.

Czy istnieje konwerter MD5 na SHA-1?

Nie. Każdy „konwerter MD5 na SHA-1” liczy skrót od nowa albo zagląda do tablicy, bo droga z MD5 do SHA-1 jest zablokowana dokładnie tak samo jak droga do SHA-256: obie funkcje są jednokierunkowe. Mając oryginalne dane wejściowe, wystarczy policzyć skrót jeszcze raz w generatorze SHA-1; bez nich nie zrobi tego nic.

Tagi: md5 sha-256 hashing security checksum cryptography

Powiązane artykuły

Zobacz wszystkie artykuły