Lewati ke konten
Toova
Semua Alat

MD5 vs SHA-256 vs SHA-512 — Fungsi Hash Dijelaskan

Toova

Fungsi hash ada di mana-mana dalam pengembangan perangkat lunak: pemeriksaan integritas file, penyimpanan kata sandi, tanda tangan digital, autentikasi API, kunci caching, deduplikasi. Namun sebagian besar developer bekerja dengannya sebagai kotak hitam — Anda memasukkan string, Anda mendapat kembali digest hex dengan panjang tetap. Detail tentang fungsi hash mana yang harus digunakan, dan mana yang harus dihindari, ternyata sangat penting.

MD5 rusak. SHA-1 usang. SHA-256 dan SHA-512 saat ini aman. SHA-3 ada jika Anda ingin tahan-masa-depan. Tetapi "rusak" tidak berarti hal yang sama dalam setiap konteks — MD5 baik-baik saja untuk beberapa kasus penggunaan dan sangat salah untuk yang lain. Panduan ini menjelaskan properti yang penting, bagaimana setiap fungsi bertahan terhadapnya, dan memberi Anda kerangka keputusan yang jelas untuk memilih hash yang tepat pada 2026.

Apa yang Sebenarnya Dilakukan Fungsi Hash

Fungsi hash kriptografis memetakan input dengan panjang sembarang ke output dengan panjang tetap (digest atau hash). Tiga properti mendefinisikan fungsi hash yang aman secara kriptografis:

  • Resistensi preimage — diberi hash h, harus tidak layak secara komputasi untuk menemukan input m mana pun sehingga hash(m) = h. Ini adalah properti "satu arah".
  • Resistensi preimage kedua — diberi input m1, harus tidak layak untuk menemukan input berbeda m2 sehingga hash(m1) = hash(m2).
  • Resistensi tabrakan — harus tidak layak untuk menemukan dua input berbeda m1 dan m2 sehingga hash(m1) = hash(m2).

Fungsi yang gagal pada salah satu properti ini dianggap rusak untuk penggunaan kriptografis. Perhatikan bahwa "tidak layak" memiliki arti spesifik di sini: bukan berarti tidak mungkin secara matematis, tetapi membutuhkan lebih banyak komputasi daripada yang praktis dengan perangkat keras saat ini atau yang diperkirakan di masa depan.

Selain itu, fungsi hash kriptografis menunjukkan efek longsoran: mengubah satu bit dalam input menghasilkan output yang berbeda di sekitar setengah bit-nya. Ini memastikan bahwa input serupa menghasilkan digest yang sepenuhnya berbeda.

Input:  "hello"
MD5:    5d41402abc4b2a76b9719d911017c592  (128-bit / 32 karakter hex)

Input:  "Hello"
MD5:    8b1a9953c4611296a827abf8c47804d7  (perubahan satu karakter = output sepenuhnya berbeda)

MD5 — Cepat, Di Mana-mana, dan Rusak

Sejarah dan desain

MD5 (Message Digest 5) dirancang oleh Ron Rivest pada 1991 dan menghasilkan digest 128-bit (16-byte). Untuk sebagian besar tahun 1990-an, ia adalah pilihan standar untuk verifikasi integritas file, penandatanganan sertifikat, dan hashing kata sandi. Ia sangat cepat — CPU modern dapat menghitung puluhan juta hash MD5 per detik, dan GPU dapat menghitung miliaran.

Mengapa MD5 rusak

Pada 2004, Xiaoyun Wang dan rekan-rekannya mendemonstrasikan serangan tabrakan praktis terhadap MD5 — dua file berbeda yang menghasilkan hash MD5 yang sama. Serangan ini berjalan dalam hitungan menit di perangkat keras konsumen. Pada 2008, peneliti membuat sertifikat CA jahat menggunakan tabrakan MD5, mendemonstrasikan bahwa infrastruktur PKI dunia nyata rentan. Pada 2012, malware Flame menggunakan tabrakan MD5 untuk memalsukan sertifikat penandatanganan kode Microsoft.

NIST secara resmi mendepresiasi MD5 untuk sebagian besar penggunaan kriptografis. Otoritas sertifikat berhenti menerbitkan sertifikat yang ditandatangani MD5 pada 2009. Vendor peramban menghapus dukungan untuk tanda tangan sertifikat MD5 sekitar 2011.

Saat MD5 masih dapat diterima

MD5 tidak universal tidak berguna. Untuk checksum non-keamanan — mendeteksi korupsi data tidak disengaja dalam transfer file, pengalamatan berbasis konten di sistem caching di mana penyerang tidak dapat memengaruhi input, atau menghasilkan pengidentifikasi unik di sistem internal tertutup — MD5 tetap memadai. Tes kuncinya: jika penyerang dapat mendapat manfaat dari menciptakan tabrakan, jangan gunakan MD5. Jika hanya korupsi tidak disengaja yang penting, MD5 baik-baik saja.

  • Aman: deduplikasi internal, kunci cache, deteksi perubahan file non-keamanan
  • Tidak aman: sertifikat, tanda tangan digital, hashing kata sandi, verifikasi keaslian file, token keamanan

SHA-1 — Usang, Belum Mati

SHA-1 menghasilkan digest 160-bit dan merupakan penerus MD5. Ia tetap menjadi standar untuk penandatanganan sertifikat dan penandatanganan kode hingga sebagian besar tahun 2000-an. Pada 2017, serangan SHAttered mendemonstrasikan tabrakan SHA-1 praktis pertama, menghasilkan dua file PDF berbeda dengan hash SHA-1 identik menggunakan sekitar 110 GPU-tahun komputasi — mahal tetapi dalam anggaran negara dan semakin dapat diakses.

SHA-1 didepresiasi oleh NIST dan semua otoritas sertifikat utama. Ia tidak boleh digunakan untuk sertifikat, penandatanganan kode, atau aplikasi sensitif-keamanan baru apa pun. Beberapa sistem legacy masih menggunakan SHA-1 secara internal, tetapi migrasi ke SHA-256 sangat direkomendasikan. Git masih menggunakan SHA-1 untuk pengalamatan objek (meskipun transisi SHA-256 sedang berlangsung), tetapi ini sedang dihapus secara bertahap.

SHA-256 — Standar Saat Ini

SHA-256 adalah bagian dari keluarga SHA-2, dirancang oleh NSA dan distandardisasi oleh NIST di FIPS 180-4. Ia menghasilkan digest 256-bit (32-byte). SHA-256 telah dianalisis secara intensif sejak publikasinya pada 2001 dan tidak ada serangan praktis yang ditemukan. Ia adalah standar de facto untuk:

  • Sertifikat TLS (pada dasarnya semua sertifikat yang diterbitkan hari ini menggunakan SHA-256)
  • Penandatanganan kode (Windows Authenticode, Apple notarization, JAR)
  • HMAC-SHA256 untuk autentikasi API (AWS Signature v4, verifikasi webhook GitHub)
  • Tanda tangan token JWT (HS256 dan RS256 keduanya menggunakan SHA-256 secara internal)
  • ID transaksi blockchain (Bitcoin menggunakan SHA256 ganda)
  • Verifikasi integritas file di pengelola paket (npm, pip, apt)
Input:  "hello"
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
         (256-bit / 64 karakter hex)

SHA-512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d
         99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
         (512-bit / 128 karakter hex)

Kinerja SHA-256

SHA-256 menggunakan operasi kata 32-bit secara internal. Di perangkat keras 32-bit atau CPU lama tanpa akselerasi perangkat keras, ia secara mencolok lebih lambat daripada MD5. Di CPU 64-bit modern dengan ekstensi SHA (Intel Goldmont+, AMD Zen+, Apple Silicon, ARM Cortex-A57+), SHA-256 dipercepat perangkat keras dan sangat cepat — sering mendekati kecepatan MD5. Sebagian besar lingkungan server memiliki akselerasi perangkat keras, jadi dalam praktiknya SHA-256 cukup cepat untuk hampir semua aplikasi.

SHA-512 — Lebih Lebar, Kadang Lebih Cepat

SHA-512 menghasilkan digest 512-bit (64-byte) menggunakan operasi kata 64-bit secara internal. Di perangkat keras 64-bit tanpa ekstensi SHA, SHA-512 sebenarnya bisa lebih cepat daripada SHA-256 karena operasi 64-bit-nya memanfaatkan lebar register modern dengan lebih baik. Di perangkat keras dengan ekstensi SHA, SHA-256 biasanya lebih cepat karena ekstensinya secara khusus dioptimalkan untuk SHA-256.

SHA-512 menyediakan margin keamanan yang lebih besar — resistensi tabrakan 256-bit versus 128-bit untuk SHA-256. Untuk sebagian besar model ancaman saat ini, resistensi tabrakan 128-bit SHA-256 lebih dari cukup (memecahkannya akan membutuhkan sekitar 2^128 operasi). SHA-512 sesuai saat:

  • Anda menargetkan server 64-bit dan menginginkan throughput maksimum tanpa ekstensi perangkat keras
  • Anda memerlukan digest yang lebih panjang sebagai materi kunci untuk operasi kriptografis lainnya
  • Anda menginginkan margin keamanan tambahan untuk data yang harus tetap dilindungi selama puluhan tahun
  • Anda mengimplementasikan protokol yang secara khusus meminta SHA-512 (misalnya, beberapa cipher suite TLS)

SHA-384 dan SHA-512/256

SHA-384 adalah versi terpotong dari SHA-512 yang menghasilkan 384 bit — berguna saat Anda menginginkan operasi internal 64-bit SHA-512 tetapi membutuhkan output yang lebih pendek. SHA-512/256 adalah varian terpotong lain yang menghasilkan output 256-bit menggunakan komputasi internal SHA-512. SHA-512/256 tahan terhadap serangan ekstensi panjang yang memengaruhi SHA-256, membuatnya berguna dalam konteks di mana ekstensi panjang menjadi perhatian (meskipun HMAC sudah memitigasi ini dalam sebagian besar skenario praktis).

SHA-3 — Arsitektur Berbeda, Tahan Masa Depan

SHA-3 (distandardisasi di NIST FIPS 202, 2015) menggunakan konstruksi sponge Keccak — desain yang fundamental berbeda dari struktur Merkle-Damgard SHA-2. Ini penting karena kelemahan masa depan apa pun yang ditemukan dalam desain Merkle-Damgard akan memengaruhi MD5, SHA-1, dan SHA-2 secara bersamaan, sementara SHA-3 akan tetap tidak terpengaruh.

SHA-3 saat ini aman dan merupakan pilihan tepat untuk sistem baru yang membutuhkan jaminan jangka panjang atau yang ingin melindungi diri terhadap kelemahan SHA-2 di masa depan. Ia lebih lambat daripada SHA-256 dalam implementasi perangkat lunak murni. Di mana SHA-3 bersinar adalah dalam implementasi perangkat keras — desainnya sangat efisien di silikon. SHA-3-256 dan SHA-3-512 menghasilkan ukuran digest yang sama dengan rekan-rekan SHA-2 mereka.

Tabel Perbandingan

Algoritma Output Resist. Tabrakan Status Kecepatan (SW) Untuk kata sandi?
MD5 128-bit Rusak Usang Sangat cepat Tidak pernah
SHA-1 160-bit Rusak Usang Cepat Tidak pernah
SHA-256 256-bit 128-bit Standar saat ini Cepat (HW accel) Tidak (terlalu cepat)
SHA-512 512-bit 256-bit Aman Cepat di 64-bit Tidak (terlalu cepat)
SHA-3-256 256-bit 128-bit Tahan masa depan Moderat (SW) Tidak (terlalu cepat)
bcrypt String 60-karakter N/A Hanya kata sandi Lambat secara sengaja Ya

Hashing Kata Sandi: Masalah yang Sepenuhnya Berbeda

Ini layak mendapat bagiannya sendiri karena ini adalah salah satu kesalahan paling umum yang dilakukan developer. SHA-256 adalah alat yang tepat untuk pemeriksaan integritas file, penandatanganan API, dan verifikasi sertifikat. Ia adalah alat yang salah untuk meng-hash kata sandi, dan menggunakannya untuk tujuan itu menyebabkan insiden keamanan nyata.

Masalahnya adalah kecepatan. SHA-256 dirancang untuk cepat — GPU modern dapat menghitung miliaran hash SHA-256 per detik. Penyerang yang memperoleh basis data kata sandi yang di-hash Anda dapat mencoba miliaran tebakan kata sandi per detik. Bahkan kata sandi yang panjang dan acak dapat di-crack dengan cepat jika hash-nya cepat.

// JANGAN PERNAH lakukan ini untuk kata sandi
const hash = crypto.createHash('sha256').update(password).digest('hex');
// Gunakan bcrypt, scrypt, atau Argon2 untuk kata sandi
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);  // faktor cost 12

Alat Bcrypt Test memungkinkan Anda meng-hash dan memverifikasi kata sandi bcrypt di peramban. Untuk memahami faktor cost bcrypt dan waktu komputasinya, ia adalah referensi yang berguna saat mengonfigurasi faktor kerja aplikasi Anda.

HMAC: Menambahkan Autentikasi ke Hash

Hash biasa tidak membuktikan apa pun tentang siapa yang menghitungnya — siapa pun yang memiliki data dapat menghitung hash SHA-256 yang sama. HMAC (Hash-based Message Authentication Code) menambahkan kunci rahasia ke komputasi, menghasilkan tag yang hanya dapat direproduksi oleh seseorang yang mengetahui kunci. HMAC-SHA256 adalah standar untuk:

  • Verifikasi tanda tangan webhook (GitHub, Stripe, Shopify semua menggunakan HMAC-SHA256)
  • AWS Signature Version 4 (penandatanganan request)
  • Token JWT HS256 (HMAC-SHA256 dari header + payload)
  • Integritas cookie (menandatangani cookie sesi untuk mencegah manipulasi)
const crypto = require('crypto');

// Tandatangani pesan dengan HMAC-SHA256
const mac = crypto
  .createHmac('sha256', secretKey)
  .update(message)
  .digest('hex');

// Verifikasi: bandingkan dalam waktu konstan (mencegah serangan timing)
const isValid = crypto.timingSafeEqual(
  Buffer.from(mac, 'hex'),
  Buffer.from(received, 'hex')
);

Perhatikan penggunaan timingSafeEqual untuk perbandingan. Membandingkan nilai MAC dengan pemeriksaan kesetaraan string biasa membocorkan informasi waktu yang dapat dieksploitasi dalam serangan waktu. Selalu gunakan fungsi perbandingan waktu-konstan saat memverifikasi MAC. Gunakan HMAC Generator untuk menghitung nilai HMAC-SHA256 untuk pengujian dan debugging tanpa menulis kode.

Rekomendasi Dunia Nyata

Integritas file umum (checksum)

Gunakan SHA-256. Ini adalah standar untuk verifikasi paket (lockfile npm, hash requirements pip, layer image Docker). Alat SHA-256 Hash menghitung digest SHA-256 di peramban Anda untuk input teks atau nilai string. Untuk checksum non-keamanan cepat di mana kecepatan kritis dan Anda mempercayai sumber, MD5 tetap dapat diterima tetapi SHA-256 lebih disukai dalam konteks bersama atau otomatis mana pun.

Sertifikat TLS dan penandatanganan kode

SHA-256 adalah standar yang diperlukan. Semua otoritas sertifikat menerbitkan sertifikat SHA-256. Jangan pernah gunakan MD5 atau SHA-1 untuk sertifikat baru — mereka akan ditolak oleh peramban modern dan sistem operasi.

Autentikasi API

Gunakan HMAC-SHA256. Ini adalah standar yang sudah mapan, didukung dengan baik di semua bahasa, dan algoritma yang diharapkan oleh sebagian besar dokumentasi keamanan API. Hitung digest dengan alat MD5 Hash atau alat SHA-256 Hash untuk perbandingan cepat, dan hasilkan tanda tangan HMAC dengan HMAC Generator.

Hashing kata sandi

Gunakan bcrypt (faktor cost 12+), scrypt, atau Argon2id. Jangan pernah gunakan MD5, SHA-1, SHA-256, atau SHA-512 langsung untuk kata sandi, bahkan dengan salting. Alat Bcrypt Test dapat membantu Anda memverifikasi hash bcrypt selama pengembangan.

Data berumur panjang yang memerlukan keamanan puluhan tahun

Lebih utamakan SHA-512 atau SHA-3-256. Ukuran digest yang lebih besar menyediakan margin tambahan terhadap kemajuan dalam kriptanalisis. NIST merekomendasikan SHA-512 dan SHA-3 untuk aplikasi yang memerlukan keamanan jangka panjang. Lihat panduan resmi di NIST FIPS 180-4 untuk spesifikasi otoritatif algoritma SHA-2.

Sistem baru tanpa batasan legacy

SHA-256 untuk penggunaan umum. Argon2id untuk kata sandi. HMAC-SHA256 untuk kode autentikasi. Jika Anda menginginkan tahan-masa-depan dan dapat menerima kinerja yang sedikit lebih rendah, SHA-3-256 adalah alternatif solid untuk SHA-256 untuk hashing tujuan-umum.