Mengonversi MD5 ke SHA-256? Mengapa Mustahil dan Apa Solusinya
Banyak halaman menjanjikan konversi ini, dan sebagian di antaranya bahkan terlihat seperti alat yang benar-benar berfungsi. Operasi yang mereka iklankan itu tidak ada, dan alasannya menentukan apa yang sebaiknya Anda lakukan berikutnya.
Jawaban singkatnya: MD5 tidak bisa dikonversi ke SHA-256 (atau sebaliknya)
Tidak, dan bukan karena alatnya belum ada. Digest MD5 adalah keluaran sepanjang 128 bit yang tidak menyimpan input yang menghasilkannya. SHA-256 memerlukan input itu untuk bisa menghitung apa pun. Tanpa data aslinya, langkah di tengah hilang permanen, dan tidak ada alat atau pustaka (library) yang sanggup mengisinya.
Berikut input yang sama setelah melewati tiga algoritma:
| Algoritma | Digest dari hello | Karakter heks | Bit |
|---|---|---|---|
| MD5 | 5d41402abc4b2a76b9719d911017c592 | 32 | 128 |
| SHA-1 | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d | 40 | 160 |
| SHA-256 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | 64 | 256 |
Lihat ketiga digest itu sebagai deretan karakter. Tidak ada awalan atau potongan yang sama di antara ketiganya, dan tidak ada hubungan aritmetika apa pun. Satu-satunya yang menghubungkan ketiganya adalah kata hello, dan tidak satu pun dari ketiganya membawa kata itu. Hitung sendiri dengan generator hash MD5 dan generator SHA-256 kalau Anda ingin melihat keduanya berubah secara mandiri sambil Anda mengetik.
Arahnya pun tidak berpengaruh. Dari SHA-256 ke MD5 gagal karena alasan yang persis sama: kedua fungsi ini sengaja membuang informasi, jadi tidak ada digest yang bisa ditelusuri mundur menjadi input yang dibutuhkan fungsi satunya.
Yang tersisa tinggal pertanyaan yang berguna. Tidak ada orang mengetik kueri ini karena penasaran pada teori hash, jadi sebenarnya apa yang sedang Anda kerjakan? Dalam praktik, jawabannya salah satu dari empat pekerjaan berikut, dan masing-masing punya solusi nyata:
- Memverifikasi unduhan atau membandingkan checksum
- Memigrasikan basis data password dari MD5
- Memulihkan input asli di balik suatu hash
- Mendapatkan data yang sama di-hash dengan algoritma berbeda
Semuanya dibahas di bawah. Lebih dulu soal halaman-halaman yang menjanjikan konversi itu, karena mengenali polanya menyelamatkan Anda dari mempercayai hasil keluarannya.
Apa yang sebenarnya dilakukan halaman “MD5 to SHA-256 converter”
Hanya ada tiga kemungkinan, dan tidak satu pun berupa konversi.
Sebagian besar halaman itu meminta teks asli Anda. Anda menempelkan satu string, halaman menghasilkan kedua digest sekaligus, lalu teks promosinya menyebut itu konversi. Yang Anda pakai sebenarnya generator hash dengan label menyesatkan. Tidak ada yang dikonversi; input yang sama di-hash dua kali.
Ada juga yang mencari nilainya di tabel. Halaman tersebut menyimpan tabel pasangan input-ke-digest yang dipanen dari wordlist dan bocoran kredensial. Tempelkan MD5 yang input-nya ada di tabel itu, halaman akan menemukan input-nya, meng-hash-nya dengan SHA-256, lalu menampilkan hasilnya. Cara ini berhasil untuk password, 123456, dan sederet panjang string pendek lainnya. Untuk selain itu ia gagal diam-diam, dan inilah sebabnya halaman semacam ini sering mengembalikan hasil kosong tanpa penjelasan apa pun.
Cukup banyak yang sama sekali tidak melakukan apa-apa. Halaman seperti ini sekadar menampilkan ulang input Anda, atau menghasilkan SHA-256 dari string heks yang Anda tempel sambil menyiratkan bahwa itu adalah SHA-256 dari data asli Anda. Kedua nilai itu berbeda, dan bagian tentang hashing berlapis di bawah menunjukkan persis seberapa berbedanya.
Ujinya cepat. Berikan halaman itu string heks 32 karakter dan tidak ada yang lain, lalu tanyakan: mungkinkah ia tahu input aslinya? Kalau ia tetap mengembalikan hasil 64 karakter dan menyebutnya konversi, berarti ia sedang mengueri tabel pencarian atau sedang membohongi Anda. Konverter hash yang tidak pernah menanyakan data asli Anda tidak punya cara untuk benar selain kebetulan.
Istilah ini bertahan karena bunyinya mirip sesuatu di sebelahnya yang memang bisa dilakukan.
Hashing, encoding, dan enkripsi: hanya dua dari tiga yang bisa dibalik
Developer bertemu ketiganya dalam minggu yang sama lalu menyimpannya di laci mental yang sama. Padahal perilaku ketiganya sama sekali berbeda:
| Operasi | Contoh | Bisa dibalik? | Yang Anda butuhkan |
|---|---|---|---|
| Pengkodean (encoding) | Base64, heks, URL-encoding | Ya, selalu | Tidak perlu apa pun |
| Enkripsi | AES, RSA | Ya | Kuncinya |
| Hashing | MD5, SHA-1, SHA-256 | Tidak pernah | Tidak ada yang menolong |
Base64-lah yang melatih intuisi yang keliru. Siapa pun bisa mendekode string Base64 kembali menjadi byte-nya tanpa kunci dan tanpa izin, dan mengubah Base64 menjadi heks adalah operasi sah yang dilakukan sehari-hari. Keduanya hanyalah cara penulisan alternatif untuk byte yang sama. Kalau Anda pernah melihat itu berhasil, “MD5 ke SHA-256” terdengar seperti penulisan ulang sejenis.
Padahal bukan. Pengkodean mempertahankan setiap bit input, enkripsi menyimpannya di balik kunci, sedangkan hashing membuang hampir seluruhnya. Digest MD5 tetap berukuran 16 byte, entah Anda menyuapinya password pendek atau image disk 40 GB. 40 GB itu tidak berpindah ke tempat penyimpanan pintar mana pun; data itu hilang. FAQ pada alat MD5 membahas perbandingan dengan enkripsi lebih rinci kalau Anda memerlukannya, tapi versi satu barisnya sudah cukup di sini: tidak ada kunci, jadi tidak ada yang bisa didekripsi.
”MD5 sudah bobol” tidak berarti “MD5 bisa dibalik”
Bahkan artikel yang jujur pun sering salah di titik ini. Orang melompat dari “MD5 sudah dibobol bertahun-tahun lalu” langsung ke “berarti sekarang pasti ada yang bisa membatalkannya”.
Ada dua jenis serangan berbeda yang terlibat:
- Serangan tabrakan (collision attack) mencari dua input berbeda yang menghasilkan digest yang sama. Penyerang memilih kedua input itu sendiri dan tidak peduli isinya apa.
- Serangan preimage (preimage attack) berangkat dari sebuah digest dan memulihkan input yang menghasilkannya. Inilah yang akan memungkinkan Anda mengonversi MD5 ke SHA-256, karena ia mengembalikan sesuatu untuk disuapkan ke fungsi berikutnya.
Ketahanan MD5 terhadap tabrakan runtuh pada 2004, dan hari ini tabrakan bisa dibuat di perangkat keras biasa dalam hitungan detik. Itulah sebabnya MD5 tidak layak dipakai untuk tanda tangan digital, sertifikat, dan apa pun yang bisa dipengaruhi lawan.
Ketahanan MD5 terhadap preimage belum runtuh. Serangan preimage terbaik yang diketahui masih bersifat teoretis, dengan kompleksitas 2^123.4 (Sasaki dan Aoki, 2009). Itu hanya setipis rambut lebih cepat daripada brute force, dan tetap jauh di luar jangkauan. Tidak ada seorang pun yang membalik digest MD5 sembarangan, baik pada 2004 maupun sekarang.
Jadi kedua fakta ini bisa benar sekaligus tanpa saling bertentangan: MD5 sudah bobol, dan MD5 tetap tidak bisa dibalik. Kalau yang sedang Anda lakukan adalah memilih di antara kedua algoritma untuk sistem baru, bukan mencoba mengonversi keduanya, perbandingan MD5 vs SHA-256 membahas keputusan itu lebih jauh.
Yang sebenarnya Anda inginkan: empat pekerjaan dan jawabannya
| Yang sebenarnya Anda kerjakan | Jawaban sesungguhnya |
|---|---|
| Memverifikasi unduhan atau membandingkan checksum | Hitung ulang dari file dengan algoritma yang Anda butuhkan |
| Memigrasikan hash password MD5 | Bungkus dengan bcrypt lalu tingkatkan saat login |
| Memulihkan input asli | Itu cracking, bukan konversi, dan hasilnya bergantung pada entropi |
| Meng-hash ulang data yang sama dengan algoritma lain | Kembali ke byte sumbernya |
Pekerjaan 1: Anda sedang membandingkan checksum atau memverifikasi unduhan
Hitung ulang, jangan konversi. File-nya ada di disk Anda, artinya Anda memegang satu-satunya hal yang hilang dari digest. Jalankan algoritma mana pun yang Anda perlukan terhadap file itu:
# 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
Ketidakcocokan yang paling sering muncul: penerbit hanya mencantumkan MD5, sementara kebijakan keamanan Anda menuntut SHA-256. Mengonversi MD5 yang dipublikasikan itu tidak akan membuktikan apa pun sekalipun hal itu mungkin, karena digest yang Anda turunkan dari digest lain bukanlah pernyataan penerbit tentang file tersebut. Yang Anda butuhkan adalah SHA-256 yang ditandatangani penerbitnya. Kalau mereka tidak menyediakannya, menghitung SHA-256 sendiri dengan generator SHA-256 tetap memberi Anda sidik jari yang stabil untuk keperluan internal: Anda bisa menguncinya dan mendeteksi perubahan di kemudian hari. Hanya saja itu tidak bisa menggantikan atestasi dari penerbit.
Pekerjaan 2: Anda sedang memigrasikan basis data password dari MD5
Inilah pekerjaan dengan taruhan paling besar, dan solusinya sudah lama mapan: bungkus hash lama, lalu tingkatkan setiap akun secara transparan saat login. Anda mem-bcrypt setiap hash MD5 yang tersimpan dalam satu batch job, dan sejak itu jalur login akan mem-MD5 password yang dikirim lebih dulu, lalu membandingkannya dengan record bcrypt.
Satu peringatan dulu, karena banyak saran lama justru terbalik soal ini. Membungkus MD5 dengan SHA-256 tidak membuat penyimpanan password menjadi aman. SHA-256 adalah hash cepat, satu kategori masalah dengan MD5, dan GPU melahap keduanya sama cepatnya. Saran yang mengarahkan Anda ke fungsi bawaan SHA2() di basis data sebagai solusinya sedang menyelesaikan masalah yang salah. Sasarannya adalah hash yang sengaja dibuat lambat: bcrypt, scrypt, atau Argon2. Simpan bcrypt(md5(password)), jangan pernah sha256(md5(password)). Perbandingan bcrypt vs Argon2 vs scrypt membahas cara memilih di antara ketiganya, dan generator bcrypt memungkinkan Anda menguji cost factor sebelum memilihnya.
Yang paling sering merusak migrasi justru frasa “MD5 dari password” itu sendiri: ia ambigu, dan kedua pembacaannya menghasilkan nilai yang berbeda:
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
Tiga hasil yang semuanya benar dan semuanya berbeda. Hash string heks 32 karakter itu, Anda dapat satu nilai; hash 16 byte mentah yang diwakilinya, Anda dapat nilai lain; hash password aslinya, Anda dapat nilai ketiga. Pilih satu konvensi, tuliskan, lalu pakai konvensi yang sama di skrip migrasi dan di jalur login. Salah di titik ini akan mengunci seluruh pengguna sekaligus, dan gejalanya terlihat seperti bug bcrypt alih-alih keputusan pengkodean.
Untuk pembungkus bcrypt, heks adalah konvensi yang lebih aman. Byte digest mentah bisa memuat byte nol, dan beberapa implementasi bcrypt memperlakukan input-nya sebagai C string lalu berhenti membaca di titik itu. Heks menghindari persoalan itu sepenuhnya, dan dengan 32 karakter ia masih jauh di bawah batas panjang input bcrypt. Normalkan juga huruf besar-kecilnya, karena 5D41402A... dan 5d41402a... adalah dua string berbeda bagi bcrypt meskipun keduanya digest yang sama.
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;
}
Akun berpindah ke bcrypt murni seiring pemiliknya masuk. Tetapkan tenggat untuk yang tertinggal dan paksa reset setelah tenggat itu lewat.
Pekerjaan 3: Anda sedang berusaha memulihkan input aslinya
Katakan itu terus terang, setidaknya kepada diri Anda sendiri, karena hal itu mengubah pilihan alat sekaligus ekspektasinya. Memulihkan input dari digest adalah cracking, bukan konversi, dan berhasil atau tidaknya sama sekali tidak bergantung pada algoritma mana yang menghasilkan digest itu. Yang menentukan adalah input-nya.
String pendek yang dipilih manusia tumbang dengan cepat. Kata kamus, nama dengan satu angka di ujungnya, dan apa pun yang pernah muncul di korpus kebocoran data akan tumbang oleh satu pencarian tabel atau brute force singkat. String acak yang panjang tidak tumbang sama sekali, dan jurang di antara kedua kasus ini bukan soal membeli perangkat keras lebih banyak.
Soal rainbow table, versi yang biasa beredar terlalu longgar. Tabel semacam itu hanya memulihkan input jika input tersebut di-hash tanpa salt dan sudah ada di dalam tabel. Kedua syarat itu wajib terpenuhi. Tambahkan salt per pengguna, dan tabel prakomputasi itu jadi tidak berguna, karena penyerang butuh tabel terpisah untuk setiap salt. Suapkan token acak 128 bit ke fungsi hash, dan tidak ada tabel mana pun di dunia yang memuatnya. Panduan entropi password memberi angka konkret tentang di mana batasnya berada.
Kalau input-nya adalah password milik Anda sendiri dan Anda tidak bisa menghadirkannya kembali, perlakukan ini sebagai reset, bukan pemulihan. Kalau itu milik orang lain, pakai istilah jujurnya seperti yang disebut di atas.
Pekerjaan 4: Anda butuh data yang sama di-hash dengan algoritma berbeda (“md5 to sha1 converter”)
Bentuknya sama dengan Pekerjaan 1, hanya digeneralisasi. Pasangan algoritma yang diminta tidak berpengaruh, karena jawabannya selalu sama: kembali ke byte sumbernya lalu hash ulang:
sha1sum payload.bin
sha256sum payload.bin
Setiap “md5 to sha1 converter” yang Anda temukan adalah alat hash ulang atau tabel pencarian, dengan alasan yang sama seperti dibahas di atas. Kalau data aslinya sudah tidak ada, pekerjaan ini tidak punya solusi, dan itu bukan kekurangan alatnya. Pilih algoritma tujuan lewat perbandingan keluarga SHA; generator SHA-1 tersedia untuk sistem lawas yang masih mensyaratkannya, meski tidak ada sistem baru yang seharusnya begitu.
Satu-satunya kasus ketika pencarian di konverter hash benar-benar berhasil
Ada satu pengecualian, dan syaratnya sempit. Sebagian jenis data dikumpulkan secara terpusat lalu diindeks sekaligus oleh setiap digest umum. Sampel malware adalah contoh bakunya. Layanan seperti VirusTotal menyimpan sampelnya sendiri, jadi mereka sudah menghitung MD5, SHA-1, dan SHA-256 dari byte yang sama lalu mengarsipkan ketiganya di bawah satu record. Cari MD5 satu sampel di sana dan Anda akan mendapatkan SHA-256-nya.
Itu adalah join basis data, bukan konversi. Cara ini berhasil karena ada pihak yang memegang file aslinya dan meng-hash-nya dengan setiap algoritma, yaitu persis langkah hitung ulang yang dijelaskan di atas, hanya saja sudah dikerjakan lebih dulu oleh pihak ketiga. Syaratnya ketat: objeknya harus sudah ada di dalam indeks, dan Anda harus memercayai siapa pun yang membangunnya. Alur kerja threat intelligence bergantung pada ini setiap hari. Hal itu tidak mengatakan apa pun tentang digest MD5 sembarangan, dan ia tidak akan pernah menolong untuk hash data Anda sendiri.
Mekanismenya sama dengan yang dipakai halaman konverter abal-abal itu. Bedanya, repositori malware memberi tahu Anda bahwa itu memang pencarian, dan menunjukkan record-nya kepada Anda.
Coba sendiri
Cara tercepat memahaminya adalah melihat dua digest dari input yang sama berubah bersamaan namun tetap tidak berhubungan:
$ printf 'hello' | md5sum
5d41402abc4b2a76b9719d911017c592 -
$ printf 'hello' | sha256sum
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 -
Ubah satu karakter dan kedua keluaran berubah total, dengan cara yang tidak berkaitan satu sama lain. Tempelkan teks yang sama ke generator hash MD5 dan generator SHA-256 secara berdampingan untuk melihatnya langsung, atau pakai generator HMAC kalau yang sebetulnya Anda butuhkan adalah digest berkunci untuk menandatangani permintaan API. Ketiganya berjalan sepenuhnya di dalam browser Anda.
FAQ
Bisakah MD5 dikonversi ke SHA-256?
Tidak. Digest MD5 tidak memuat input aslinya, sedangkan SHA-256 membutuhkan input itu untuk menghasilkan apa pun. Halaman mana pun yang mengaku bisa mengonversi sebenarnya sedang meng-hash ulang teks yang Anda berikan, atau mencari nilainya di basis data pasangan prakomputasi.
Mengapa begitu banyak situs menawarkan “MD5 to SHA-256 converter”?
Karena halaman itu meraih peringkat untuk kueri yang diketik banyak orang. Begitu Anda tiba di sana, halaman tersebut entah meminta teks asli Anda, yang membuatnya jadi hash ulang alih-alih konversi, atau tidak mengembalikan apa pun yang berguna. Istilah ini bertahan karena miskonsepsi di baliknya memang lazim.
Mungkinkah SHA-256 dikembalikan menjadi MD5?
Tidak, dan arahnya tidak berpengaruh. Keduanya fungsi satu arah, jadi tidak ada digest yang bisa diubah menjadi digest lainnya tanpa input asli. Alat yang menawarkan perjalanan sebaliknya menjalankan trik pencarian atau hash ulang yang sama.
MD5 sudah bobol, bukankah itu berarti ia bisa dibalik?
Tidak. Ketahanan MD5 terhadap tabrakan runtuh pada 2004, artinya dua input bisa dipaksa berbagi digest yang sama. Membalik digest adalah serangan preimage, dan yang terbaik yang diketahui masih memakan 2^123.4 operasi. Bobol untuk tanda tangan digital, tetap tidak bisa dibalik.
Bagaimana cara memigrasikan basis data hash password MD5 ke sesuatu yang lebih aman?
Di MySQL, UPDATE users SET password = SHA2(password, 256) yang terlihat seperti solusi satu baris itu keliru, karena yang di-hash adalah digest MD5 yang tersimpan, bukan password-nya; simpan bcrypt(md5(password)) dan verifikasi lewat pembungkus yang sama, lalu tingkatkan tiap record pada login berikutnya yang berhasil. Membungkus MD5 dengan SHA-256 tidak menolong, karena keduanya hash cepat dan GPU menangani keduanya dengan laju yang sama brutalnya.
Mengapa hashing berlapis memberi saya hasil yang berbeda dari perkiraan?
Meng-hash string heks MD5 dan meng-hash 16 byte mentahnya menghasilkan keluaran SHA-256 yang berbeda. Keduanya sah; keduanya sekadar input yang berbeda. Pilih satu konvensi dan terapkan secara identik di skrip migrasi dan di jalur login.
Bisakah rainbow table memulihkan input di balik hash MD5?
Hanya jika input-nya tidak diberi salt dan sudah ada di dalam tabel, yang dalam praktiknya berarti string pendek atau umum. Input acak yang panjang tidak bisa dipulihkan dengan cara ini, dan menambahkan salt per pengguna sepenuhnya mematahkan tabel prakomputasi.
Apakah ada konverter MD5 ke SHA-1?
Tidak ada. Setiap yang mengaku konverter MD5 ke SHA-1 sebenarnya alat hash ulang atau tabel pencarian, karena sifat satu arah yang sama menghadang MD5 ke SHA-1 persis seperti MD5 ke SHA-256. Kalau input aslinya masih Anda simpan, hitung ulang lewat generator SHA-1; tanpa itu, tidak ada yang bisa.