💡 Key Takeaways
- What Hash Functions Actually Do (And Why You Should Care)
- MD5: The Broken Hash Function That Won't Die
- SHA-256: The Workhorse of Modern Cryptography
- bcrypt: When Slow Is Actually Good
Saya masih ingat hari ketika saya harus menjelaskan kepada CEO kami mengapa seluruh basis data pengguna kami telah dikompromikan. Itu tahun 2016, saya telah menjadi insinyur keamanan selama delapan tahun, dan saya pikir saya tahu apa yang saya lakukan. Kami menggunakan MD5 untuk mengenkripsi kata sandi—keputusan yang diambil bertahun-tahun sebelum saya bergabung—dan seorang penyerang telah membongkar 87% dari 340.000 kata sandi pengguna kami dalam waktu kurang dari 48 jam. Pelanggaran itu menghabiskan biaya kami $2,3 juta untuk pemulihan, tak terhitung jam waktu rekayasa, dan hampir menghancurkan reputasi kami. Insiden itu mengubah cara saya berpikir tentang fungsi hash, dan inilah alasan saya menulis ini hari ini.
💡 Poin Penting
- Apa yang Sebenarnya Dilakukan oleh Fungsi Hash (Dan Mengapa Anda Harus Peduli)
- MD5: Fungsi Hash yang Rusak dan Takkan Mati
- SHA-256: Kuda Kerja Kriptografi Modern
- bcrypt: Ketika Lambat Sebenarnya Baik
Fungsi hash adalah penjaga tak terlihat dari keamanan perangkat lunak modern, namun sebagian besar pengembang yang saya bimbing tidak benar-benar memahaminya. Mereka tahu bahwa mereka harus menggunakannya, tetapi tidak mengerti mengapa satu berbeda dari yang lain, atau kapan kecepatan menjadi liabilitas alih-alih aset. Artikel ini akan mengubah itu. Saya akan memandu Anda melalui tiga fungsi hash terpenting yang akan Anda temui—MD5, SHA-256, dan bcrypt—menjelaskan bukan hanya cara mereka bekerja, tetapi kapan harus menggunakan masing-masing dan, yang lebih penting, kapan harus menghindarinya sepenuhnya.
Apa yang Sebenarnya Dilakukan oleh Fungsi Hash (Dan Mengapa Anda Harus Peduli)
Fungsi hash mengambil input dari ukuran berapa pun dan menghasilkan output berukuran tetap yang disebut hash atau digest. Anggap saja sebagai penggiling daging matematis: Anda dapat memasukkan satu sapi utuh atau satu patty hamburger, tetapi apa yang keluar selalu memiliki ukuran yang sama. Keajaibannya adalah bahwa proses ini bersifat deterministik—input yang sama selalu menghasilkan output yang sama—tetapi hampir tidak mungkin untuk dibalik.
Berikut adalah yang membuat fungsi hash kriptografi yang baik: Pertama, itu harus deterministik. Hash "password123" satu juta kali, dan Anda akan mendapatkan hasil yang sama setiap kali. Kedua, harus cepat dihitung dalam satu arah tetapi tidak dapat dibalik secara komputasional. Ketiga, bahkan perubahan kecil pada input harus menghasilkan output yang sangat berbeda—ini disebut efek longsor. Ubah satu bit dalam input Anda, dan sekitar 50% bit dalam output harus berubah.
Keempat, itu harus tahan tabrakan. Tabrakan terjadi ketika dua input yang berbeda menghasilkan output hash yang sama. Meskipun tabrakan secara matematis tidak terhindarkan (ada input yang mungkin tak terbatas tetapi output yang mungkin terbatas), fungsi hash yang baik membuat menemukan tabrakan begitu sulit sehingga hampir tidak mungkin. Akhirnya, output harus terlihat acak dan terdistribusi secara merata, meskipun sepenuhnya deterministik.
Saya telah melihat pengembang bingung fungsi hash dengan enkripsi, jadi biarkan saya jelaskan dengan jelas: enkripsi dapat dibalik dengan kunci yang tepat, hashing tidak bisa. Ketika Anda mengenkripsi data, Anda bermaksud untuk mendekripsinya nanti. Ketika Anda melakukan hashing data, Anda sedang membuat sidik jari satu arah. Perbedaan ini krusial karena menentukan alat mana yang harus Anda gunakan untuk pekerjaan yang mana.
Dalam pekerjaan harian saya mengamankan aplikasi keuangan, saya menggunakan fungsi hash untuk tiga tujuan utama: memverifikasi integritas data (memastikan berkas tidak telah diubah), membuat tanda tangan digital, dan menyimpan kata sandi. Setiap kasus penggunaan memiliki persyaratan yang berbeda, itulah mengapa memahami perbedaan antara fungsi hash sangat penting.
MD5: Fungsi Hash yang Rusak dan Takkan Mati
MD5 (Algoritma Digest Pesan 5) dirancang oleh Ronald Rivest pada tahun 1991 dan menghasilkan nilai hash 128-bit (16-byte), biasanya direpresentasikan sebagai string heksadesimal 32 karakter. Selama lebih dari satu dekade, itu adalah fungsi hash andalan untuk segala sesuatu mulai dari penyimpanan kata sandi hingga verifikasi integritas berkas. Saat ini, ia telah rusak secara kriptografi, namun saya masih melihatnya dalam kode produksi setidaknya sekali sebulan.
"Fungsi hash tercepat sering kali merupakan pilihan terburuk untuk keamanan—kecepatan dalam kriptografi adalah kerentanan, bukan fitur."
Serangan tabrakan serius pertama terhadap MD5 dipublikasikan pada tahun 2004 oleh Xiaoyun Wang dan rekan-rekannya. Mereka menunjukkan bahwa menemukan tabrakan jauh lebih mudah daripada 2^64 operasi teoritis yang seharusnya diperlukan. Pada tahun 2008, para peneliti telah membuat dua berkas executable yang sepenuhnya berbeda yang menghasilkan hash MD5 yang sama. Pada tahun 2012, malware Flame mengeksploitasi tabrakan MD5 untuk memalsukan sertifikat digital Microsoft. Tanda-tanda kerusakan tidak hanya ada di dinding—itu dicat dengan huruf neon.
Inilah yang terjadi pada MD5 dalam praktik. String "Hello, World!" menghasilkan hash MD5: 65a8e27d8879283831b664bd8b7f0ad4. Ubah hanya satu karakter menjadi "Hello, World?" dan Anda mendapatkan: 7f138a09169b250e9dcb378140907378. Perhatikan betapa berbeda output yang dihasilkan—itulah efek longsor bekerja dengan benar. Masalahnya bukan bahwa MD5 gagal dalam persyaratan dasar ini; masalahnya adalah algoritme memiliki kelemahan matematis yang memungkinkan penyerang menemukan tabrakan jauh lebih cepat daripada yang seharusnya.
Jadi mengapa pengembang masih menggunakan MD5? Kecepatan dan familiaritas. MD5 sangat cepat—di mesin pengembangan saya, saya dapat menghitung sekitar 400 juta hash MD5 per detik. Ini juga tersedia dalam hampir setiap bahasa pemrograman dan kerangka kerja. Saya telah mendengar setiap alasan: "Kami hanya menggunakannya untuk checksum, bukan untuk keamanan," atau "Sistem kami tidak cukup penting untuk diserang," atau favorit saya, "Kami selalu melakukannya dengan cara ini."
Biarkan saya langsung: ada tepat dua penggunaan MD5 yang dapat diterima pada tahun 2026. Pertama, Anda dapat menggunakannya untuk tujuan non-kriptografi seperti membuat kunci cache atau mempartisi data, di mana ketahanan terhadap tabrakan tidak penting. Kedua, Anda mungkin memerlukannya untuk kompatibilitas dengan sistem lama yang sedang Anda kerjakan untuk menggantinya. Itu saja. Jika Anda menggunakan MD5 untuk hal-hal yang berkaitan dengan keamanan—kata sandi, tanda tangan digital, verifikasi sertifikat—Anda telah melakukan kesalahan yang pada akhirnya akan merugikan Anda.
Argumen kinerja tidak lagi relevan. Alternatif modern seperti SHA-256 cukup cepat untuk hampir semua kasus penggunaan, dan manfaat keamanan jauh lebih besar daripada perbedaan kinerja yang tidak signifikan. Dalam sistem keuangan yang saya kerjakan, kami memproses jutaan transaksi setiap hari, dan beralih dari MD5 ke SHA-256 menambahkan kurang dari 2 milidetik latensi per transaksi—sama sekali tidak terdeteksi oleh pengguna tetapi jauh lebih aman.
SHA-256: Kuda Kerja Kriptografi Modern
SHA-256 (Algoritma Hash Aman 256-bit) adalah bagian dari keluarga SHA-2, dirancang oleh NSA dan diterbitkan pada tahun 2001. Ini menghasilkan nilai hash 256-bit (32-byte), biasanya direpresentasikan sebagai string heksadesimal 64 karakter. Berbeda dengan MD5, SHA-256 tidak memiliki serangan tabrakan praktis yang diketahui, menjadikannya standar saat ini untuk sebagian besar aplikasi kriptografi.
| Fungsi Hash | Kecepatan | Kasus Penggunaan Utama | Status Keamanan |
|---|---|---|---|
| MD5 | Sangat Cepat (~300 MB/s) | Checksum, integritas berkas | Telah rusak secara kriptografi - Jangan sekali-kali untuk kata sandi |
| SHA-256 | Sangat Cepat (~150 MB/s) | Tanda tangan digital, sertifikat, blockchain | Aman untuk integritas, terlalu cepat untuk kata sandi |
| bcrypt | Dengan Sengaja Lambat (dapat disesuaikan) | Hashing kata sandi | Direkomendasikan untuk penyimpanan kata sandi |
| SHA-1 | Sangat Cepat |