Hash Kata Sandi
Menyimpan kata sandi pengguna adalah salah satu hal terburuk yang dapat Anda lakukan dalam teks biasa, dan salah satu kesalahan keamanan paling umum. Perbaikan ini telah ada selama beberapa dekade – hashing kata sandi dengan algoritma yang lambat dan sulit diingat – namun perbedaan antara implementasi yang baik dan buruk sangat besar, dan sebagian besar pelanggaran data menunjukkan pilihan yang buruk.
Badan artikel selengkapnya disediakan dalam bahasa Inggris di bawah ini.
Password hashing adalah praktik menyimpan transformasi satu arah kata sandi pengguna, bukan kata sandi itu sendiri. Saat pengguna masuk, transformasi yang sama diterapkan pada masukan mereka dan dibandingkan dengan nilai yang disimpan. Jika database yang disimpan dilanggar, penyerang memiliki hash, bukan kata sandi — dan memulihkan database asli seharusnya tidak dapat dilakukan secara komputasi.
Itulah teorinya. Praktiknya berkisar dari "berfungsi seperti yang diiklankan" hingga "mungkin juga teks biasa", bergantung pada algoritme dan parameter mana yang dipilih.
Apa yang dibutuhkan hash kata sandi yang baik
- Satu arah. Mengetahui hash seharusnya tidak mengungkapkan apa pun yang berguna tentang kata sandi tersebut.
- Salted. Setiap pengguna memiliki garam acak unik yang dicampur ke dalam hash. Mencegah tabel pelangi yang telah dihitung sebelumnya dan memastikan kata sandi yang identik menghasilkan hash yang berbeda.
- Lambat. Perhitungan hash tunggal akan memakan waktu sepersekian detik pada perangkat keras penyerang. Brute force pada miliaran per detik adalah yang mengalahkan hash yang cepat.
- Memory-hard. Setiap hash harus memerlukan RAM yang signifikan, mengalahkan GPU dan paralelisasi ASIC yang berkembang pada memori per instans yang kecil.
- Parameter tahan masa depan. Faktor biaya harus dapat disesuaikan seiring dengan peningkatan perangkat keras lebih cepat.
Pilihan yang salah
Algoritma yang tidak boleh Anda gunakan untuk penyimpanan kata sandi:
- MD5. Rusak secara kriptografis sejak tahun 2004. Brute-forceable pada puluhan miliar hash per detik pada konsumen hardware.
- SHA-1, SHA-256. Hash kriptografi cepat yang dirancang untuk pemeriksaan integritas, bukan penyimpanan kata sandi. Dapat dipaksakan dengan kecepatan miliaran per detik pada GPU.
- Kata sandi terenkripsi. Jika Anda dapat mendekripsinya kembali ke teks biasa, penyerang yang mencuri kunci juga dapat mendekripsinya. Hashing adalah jawabannya; enkripsi tidak.
- Plaintext. Masih terjadi pada tahun 2026. Setiap pelanggaran kata sandi teks biasa adalah rekayasa yang dapat dicegah.
Pilihan yang tepat
Tiga modern yang direkomendasikan algoritma:
- bcrypt (1999). Faktor biaya yang dapat disesuaikan (putaran perhitungan). Terbatas pada kata sandi 72 byte. Tidak membebani memori, sehingga GPU dapat menyerangnya secara efisien — namun faktor biaya yang masuk akal tetap membuat serangan menjadi mahal. Penyebaran luas, mudah digunakan dengan benar.
- scrypt (2009). Sulit mengingat. Biaya memori, paralelisme, dan biaya CPU yang dapat dikonfigurasi. Lebih kompleks dari bcrypt; terkadang salah konfigurasi.
- Argon2 (pemenang Kompetisi Hashing Kata Sandi 2015). Tiga varian: Argon2d (tergantung data, tahan terhadap serangan GPU tetapi rentan terhadap saluran samping), Argon2i (tidak bergantung pada data, tahan saluran samping), Argon2id (hibrida — standar yang disarankan). Modern, terverifikasi dengan baik, pilihan yang tepat untuk sistem baru.
OWASP saat ini merekomendasikan Argon2id dengan memori minimal 19 MB, jumlah iterasi 2, dan paralelisme 1. Untuk sistem di mana Argon2 tidak tersedia, bcrypt dengan biaya ≥ 10 atau scrypt dengan parameter yang sesuai adalah fallback yang dapat diterima.
Apa yang "lambat" berarti dalam praktiknya
Faktor biaya 10 di bcrypt berarti kira-kira 100 ms per hash pada perangkat keras modern. Untuk pengguna sah yang masuk, hal ini tidak terlihat. Untuk penyerang yang mencoba memaksa 100 juta kata sandi dari database yang bocor, itu berarti 100 juta × 100 ms = 116 hari waktu GPU per melewati daftar kata yang masuk akal. Dikombinasikan dengan garam unik per pengguna, tabel pelangi besar tidak berguna.
Untuk hash cepat seperti SHA-256 tanpa garam, operasi yang sama memerlukan waktu beberapa menit pada perangkat keras yang sama.
Penanganan garam
- Salt adalah per pengguna, dihasilkan oleh CSPRNG di pengguna penciptaan
- 16 byte sudah cukup (128 bit keacakan)
- Salt disimpan bersama hash, bukan rahasia — tugasnya adalah menjadi unik, bukan disembunyikan
- Perpustakaan hashing paling modern (bcrypt, keluaran Argon2 dalam format string PHC) menggabungkan algoritme, parameter, garam, dan hash menjadi satu string
Pepper: opsional extra
A pepper adalah nilai rahasia seluruh situs yang ditambahkan ke input hash, disimpan secara terpisah dari database (dalam HSM, brankas kunci, atau konfigurasi aplikasi). Jika database dibuang tetapi peppernya tidak, hash tidak dapat dipulihkan bahkan dengan garam pengguna — karena penyerang tidak memiliki peppernya. Pepper adalah tambahan sabuk dan kawat gigi yang berguna untuk sistem bernilai tinggi.
Meningkatkan hash dengan aman
Saat Anda mengubah parameter atau memigrasikan algoritma, Anda tidak dapat melakukan hash ulang tanpa kata sandi asli. Pendekatan standar:
- Setiap catatan pengguna menyimpan algoritma hash, parameter, garam, dan hash saat ini.
- Saat login, verifikasi terhadap hash yang disimpan dengan parameter aslinya.
- Jika verifikasi berhasil dan parameter kedaluwarsa, hash ulang dengan parameter saat ini dan perbarui catatan.
Dalam beberapa bulan setelah aktif pengguna, database bertransisi ke parameter baru tanpa memaksa pengaturan ulang kata sandi.
Apa artinya bagi pengguna
Untuk pengguna akhir, efek praktisnya: bahkan ketika database dibobol, kata sandi unik yang kuat (dikelola oleh manajer kata sandi ) ditambah hashing yang baik di server berarti kata sandi tetap rahasia secara efektif. Kata sandi yang lemah bisa dibobol bahkan dari database yang di-hash dengan baik; pengguna adalah variabel yang tidak dapat dikontrol oleh pengembang.
Pertanyaan yang sering diajukan
- Mengapa bcrypt dibatasi hingga 72 karakter?
- Detail implementasi historis dari sandi Blowfish yang mendasarinya. Input yang lebih panjang akan terpotong. Kebanyakan pengguna tidak menyadarinya; frasa sandi acak 16 karakter jauh di bawah batas. Untuk sistem yang menginginkan panjang kata sandi tidak terbatas, Argon2 tidak memiliki batasan seperti itu.
- Haruskah saya memberi garam dan merica pada kata sandi saya?
- Garam diperlukan (dan perpustakaan terkemuka mana pun melakukannya secara otomatis). Pepper bersifat opsional tetapi berharga untuk sistem keamanan tinggi. Keuntungannya: mengelola lada sebagai rahasia jangka panjang di luar database menambah kompleksitas operasional. Sebagian besar aplikasi menyimpan garam + hash; yang terbesar menyimpan garam + hash + hash yang berasal dari merica.
- Apakah Argon2 selalu lebih baik daripada bcrypt?
- Untuk sistem baru, ya. Argon2 memiliki memori yang keras (tahan terhadap GPU/ASIC), tidak memiliki batas 72 karakter, dan memenangkan Kompetisi Hashing Kata Sandi karena alasan yang baik. bcrypt masih dapat diterima ketika Argon2 tidak tersedia atau kendala organisasi lebih memilih standar yang lebih lama. Untuk sistem lama yang menggunakan bcrypt dengan biaya ≥ 10, urgensi untuk bermigrasi rendah.
- Berapa lama waktu yang dibutuhkan untuk meng-hash kata sandi?
- OWASP menyarankan sekitar 100-500 ms pada perangkat keras server. Lebih cepat berarti lebih lemah terhadap penyerang; lebih lambat mulai mempengaruhi pengalaman login yang sah. Jumlah yang tepat bergantung pada lalu lintas Anda — layanan bervolume tinggi memilih biaya lebih rendah; layanan keamanan tinggi dengan tingkat login rendah dapat memilih lebih tinggi.
- Bisakah saya menyimpan kata sandi yang dienkripsi dan bukan di-hash?
- Jangan. Enkripsi bersifat reversibel, artinya kunci enkripsi harus ada di suatu tempat yang dapat diakses oleh aplikasi. Jika database dibobol, sering kali kuncinya juga dibobol, dan Anda telah menyimpan teks biasa secara efektif. Intinya adalah sifat hashing yang tidak dapat diubah — bahkan aplikasi Anda sendiri tidak dapat memulihkan kata sandi, yang merupakan properti keamanan.