Panduan Memilih Algoritma Hash untuk Keamanan Data
Memilih algoritma hash yang salah adalah salah satu kesalahan keamanan yang paling sering terjadi, sekaligus paling mudah dicegah. Banyak developer yang masih memakai MD5 untuk menyimpan password karena "sudah terbiasa", lalu heran saat database bocor dan password berhasil dipecahkan. Artikel ini adalah panduan keputusan: untuk setiap tugas keamanan umum, algoritma mana yang tepat, mengapa, dan mana yang harus Anda hindari.
Aturan yang perlu dipahami sejak awal: tidak ada satu algoritma hash yang cocok untuk semua keperluan. Keamanan data punya kebutuhan berbeda untuk menyimpan password, memverifikasi integritas file, dan memastikan isi data tidak dimanipulasi. Memakai algoritma yang benar untuk kebutuhan yang salah sama berbahayanya dengan tidak memakai hash sama sekali.
Dasar: Jenis-jenis Algoritma Hash
Sebelum memilih, Anda perlu membedakan dua keluarga besar: hash cepat dan hash lambat.
Hash cepat seperti MD5, SHA-1, SHA-2, dan SHA-3 dirancang untuk kecepatan maksimum. Mereka sempurna untuk memverifikasi integritas, membuat checksum, dan membangun struktur data. Masalahnya, kecepatan itulah yang membuat mereka tidak cocok untuk menyimpan password, karena penyerang juga bisa menghitung miliaran hash per detik.
Hash lambat seperti bcrypt, argon2, dan PBKDF2 dirancang untuk memperlambat brute force dengan melakukan ribuan iterasi atau mengonsumsi banyak memori. Mereka lambat secara sengaja, dan justru itulah yang membuat mereka tepat untuk password.
Kapan Memakai MD5 dan SHA-1
MD5 dan SHA-1 adalah algoritma yang sudah usang, tetapi Anda tidak bisa menghindarinya sepenuhnya karena masih ada di banyak sistem lama.
MD5
MD5 menghasilkan 128 bit dan dianggap terpecah total. Kolisi (dua input berbeda dengan hash yang sama) dapat dibuat dengan mudah, dan serangan ini sudah dibuktikan sejak tahun 2004. Jangan pernah memakai MD5 untuk keamanan: bukan untuk password, bukan untuk integritas yang penting, dan bukan untuk menandatangani data.
Kapan Anda masih akan bertemu MD5? Pada sistem lama, database migrasi, dan beberapa format API yang masih menggunakan checksum MD5. Saat bertemu, perlakukannya sebagai tanda bahaya. Untuk konversi atau verifikasi file dengan checksum MD5 yang diberikan pihak lain, Anda masih bisa menghitungnya untuk kompatibilitas, tetapi jadwalkan migrasi ke algoritma modern.
SHA-1
SHA-1 menghasilkan 160 bit. Pada tahun 2017, tim Google dan CWI Amsterdam membuktikan SHA-1 juga bisa ditabrak kolisi (serangan SHAttered). Untuk semua tujuan keamanan baru, SHA-1 dianggap rusak.
Satu-satunya pengecualian yang masih umum adalah SHA-1 pada git untuk integritas repo lama dan verifikasi kompatibilitas dengan sistem lama. Jika Anda membangun sesuatu yang baru, jangan pilih SHA-1.
Kapan Memakai SHA-2 dan SHA-3
Untuk verifikasi integritas, checksum, dan penandaan digital, keluarga SHA-2 dan SHA-3 adalah pilihan modern yang tepat.
SHA-2 (SHA-256, SHA-512)
SHA-256 menghasilkan 256 bit dan SHA-512 menghasilkan 512 bit. Keduanya belum memiliki serangan kolisi yang praktis dan menjadi standar industri di mana-mana. SHA-256 adalah hash yang paling banyak direkomendasikan di dunia saat ini, dipakai untuk TLS sertifikat, verifikasi paket, dan checksum file.
Bagaimana memilih antara SHA-256 dan SHA-512? Pada perangkat 64-bit, SHA-512 bisa lebih cepat daripada SHA-256 karena beroperasi pada word 64-bit, tetapi menghasilkan output lebih panjang. Untuk sebagian besar kasus, SHA-256 sudah lebih dari cukup, dan outputnya lebih pendek sehingga hemat penyimpanan. SHA-512 cocok jika Anda butuh jaminan keamanan ekstra atau bekerja di platform yang mengoptimalkannya.
SHA-3 (SHA3-256, SHA3-512)
SHA-3 adalah standar dari keluarga Keccak yang dirancang pada tahun 2015 sebagai alternatif struktural SHA-2. Keamanannya tidak lebih unggul dari SHA-2, tetapi secara desain berbeda, sehingga jika SHA-2 ditemukan lemah, SHA-3 tetap aman. Itu disebut diversifikasi: dua algoritma dari keluarga berbeda tidak akan jebol bersamaan.
Mana yang harus Anda pilih antara SHA-2 dan SHA-3? Untuk proyek baru, keduanya benar. Ikuti saja standar yang dipakai ekosistem Anda. Banyak standar modern, seperti TLS 1.3, sudah mendukung SHA-3, tetapi ekosistem yang lebih luas masih didominasi SHA-256. Jika Anda tidak punya alasan khusus, SHA-256 adalah pilihan yang aman dan paling didukung.
Kapan Memakai Hash untuk Password
Ini kategori paling penting, karena ini menyangkut data pengguna yang paling sensitif. Untuk menyimpan password, Anda tidak boleh memakai MD5, SHA-1, SHA-256, atau SHA-512 sama sekali, tidak peduli seberapa besar salt-nya. Hash cepat bisa di-brute force dengan GPU dalam hitungan detik untuk hash 8 karakter.
bcrypt
bcrypt adalah pilihan default yang paling banyak dipakai untuk password. Ia dirancang khusus untuk hashing password, memiliki salt otomatis, dan cost factor yang bisa disesuaikan agar tetap lambat seiring hardware menjadi lebih cepat. Outputnya menyimpan salt dan cost di dalam string hash, sehingga tidak perlu menyimpan parameter terpisah.
Batas 72 byte input adalah kelemahan yang dikenal. Untuk password biasa, itu tidak masalah, tetapi jika aplikasi Anda menerima password sangat panjang, perhatikan batas itu.
argon2
argon2 adalah pemenang Password Hashing Competition tahun 2015 dan dianggap pilihan paling modern. Ia memiliki varian argon2id yang menggabungkan ketahanan terhadap serangan GPU (versi i) dan serangan side-channel (versi d), serta menyediakan parameter memori, waktu, dan paralelisme yang bisa disetel.
Argon2id adalah rekomendasi saat ini untuk proyek baru. Jika library bahasa pemrograman Anda mendukungnya, pilih argon2id, lalu setel memori sekitar 64 MB dan waktu yang menghasilkan sekitar 0,5 detik di hardware target Anda. Jika tidak mendukung, bcrypt tetap pilihan yang baik.
PBKDF2
PBKDF2 adalah fungsi derivasi kunci yang juga sering dipakai untuk password, dan menjadi dasar dari banyak standar seperti WPA2 dan FIPS 140. Ia tidak memiliki memori-hardness, sehingga lebih mudah diserang dengan GPU dibandingkan argon2. Namun, karena banyak digunakan dan didukung secara luas, PBKDF2 tetap lebih baik daripada hash cepat.
Gunakan PBKDF2 jika Anda terikat standar yang mewajibkannya, misalnya interop dengan sistem lama atau sertifikasi tertentu. Jika bebas memilih, argon2id atau bcrypt lebih baik.
Peran Salt dan Peppering
Mengapa hash saja tidak cukup? Karena dua pengguna dengan password yang sama menghasilkan hash yang sama. Penyerang yang memakai tabel rainbow, daftar hash untuk password umum, bisa langsung mencocokkan. Salt mengatasi ini: menambahkan nilai acak unik per pengguna sebelum hashing membuat hash yang identik menghasilkan output berbeda.
Salt tidak perlu dirahasiakan, ia disimpan di database bersama hash. Tugasnya hanya memaksa penyerang menghitung hash untuk setiap salt secara terpisah, menghancurkan tabel rainbow. Setiap pengguna harus punya salt yang berbeda.
Peppering adalah nilai rahasia tambahan yang tidak disimpan di database, melainkan di konfigurasi server atau HSM. Jika database bocor tetapi konfigurasi server tidak, peppered hash tetap tidak bisa diserang secara offline. Untuk aplikasi dengan data sensitif, kombinasi salt + peppering adalah lapisan pertahanan yang bijak.
Hash untuk Integritas dan Tanda Tangan
Ketika Anda memverifikasi bahwa sebuah file tidak berubah, Anda memakai hash cepat, bukan hash lambat. Contoh paling umum adalah SRI (Subresource Integrity).
SRI memastikan bahwa file JavaScript atau CSS yang dimuat dari CDN tidak pernah diganti dengan versi berbahaya. Anda menghitung hash file, menyematkannya di atribut integrity pada tag script atau link, dan browser menolak file yang tidak cocok.
<script
src="https://cdn.example.com/app.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"
></script>
Untuk SRI, gunakan sha-384 atau sha-512, karena Google mendorong hash yang lebih panjang untuk integritas. Anda bisa menghasilkan nilai SRI dengan alat SRI hash generator atau generator hash lain yang mendukung encoding base64.
Untuk checksum file biasa, SHA-256 cukup. Jika Anda membangun sistem yang menandatangani data (seperti JSON Web Signature), Anda tidak memakai hash saja, melainkan HMAC (hash dengan kunci) atau signature digital dengan algoritma seperti RSA atau ECDSA. Di sini hash seperti SHA-256 atau SHA-512 menjadi komponen internal, bukan pilihan yang berdiri sendiri.
Matriks Keputusan Singkat
| Kebutuhan | Jangan Pakai | Pakai Ini | Alasan |
|---|---|---|---|
| Simpan password | MD5, SHA-1, SHA-256 | Argon2id, lalu bcrypt | Butuh hash lambat + salt |
| Checksum file | (MD5 usang) | SHA-256 | Cepat, aman, standar |
| Subresource Integrity | SHA-1 | SHA-384, SHA-512 | Standar SRI meminta hash panjang |
| Tanda tangan digital | MD5, SHA-1 | SHA-256/512 via RSA/ECDSA | Butuh kunci, bukan hash saja |
| Kompatibilitas sistem lama | - | gunakan sesuai format lama | lalu jadwalkan migrasi |
Cara Memverifikasi Hash dengan Benar
Memilih algoritma yang benar hanya separuh pekerjaan. Anda juga harus menghitung hash dengan benar. Kesalahan umum saat memverifikasi file hasil unduhan adalah membandingkan hash dari string, bukan dari file aslinya, atau lupa menormalkan format (hex vs base64).
Gunakan generator multi-algoritma seperti multiple hash generator untuk melihat MD5, SHA-1, SHA-256, dan SHA-512 dari input yang sama sekaligus, sehingga Anda bisa membandingkan dengan nilai yang dipublikasikan. Untuk memverifikasi file, gunakan alat yang menghitung hash langsung dari file di perangkat Anda, dan pastikan hash yang dipublikasikan sesuai format yang Anda bandingkan.
Saat memverifikasi password atau checksum, selalu gunakan perbandingan waktu-konstan (constant-time). Perbandingan string biasa menghentikan eksekusi lebih cepat saat karakter pertama berbeda, dan perbedaan timing itu bisa dieksploitasi untuk menebak nilai. Fungsi seperti hash_equals di PHP atau crypto.timingSafeEqual di Node ada untuk alasan ini.
Rekomendasi Final
Ringkasnya, aturan praktis yang bisa Anda bawa ke proyek berikutnya:
- Password: argon2id jika tersedia, bcrypt jika tidak. Tambahkan salt otomatis dan peppering opsional.
- Integritas file: SHA-256. Cukup, aman, dan didukung di mana-mana.
- SRI CDN: SHA-384 atau SHA-512.
- Data sensitif dalam transport: kombinasikan hash cepat dengan HMAC dan kunci.
- MD5 dan SHA-1: hindari untuk semua keperluan keamanan baru; hadapi hanya untuk kompatibilitas lama.
Yang terpenting: jangan pernah menunda migrasi dari algoritma usang. Setiap hari sistem Anda memakai MD5 atau SHA-1 untuk keamanan adalah hari database Anda berisiko dipecahkan dengan biaya murah. Dengan panduan ini, Anda sudah tahu ke mana harus pindah.