Berapa mahal sebuah kata sandi di perangkat keras sederhana
Halaman statistik di sini dapat dilindungi dengan kata sandi. Membuat hash dari kata sandi itu adalah satu-satunya operasi dalam layanan ini yang seharusnya lambat — itulah yang membuat hash yang dicuri mahal untuk diserang. Pertanyaannya: seberapa lambat, di perangkat keras ini.
Diukur pada mesin yang menjalankan situs ini, PHP 8:
PASSWORD_DEFAULT | 560 ms | (setara cost 12) |
| cost 12 | 595 ms | |
| cost 11 | 277 ms | |
| cost 10 | 138 ms |
Parameter cost pada bcrypt adalah eksponen: setiap langkah menggandakan pekerjaan. Hasil pengukuran menunjukkan persis penggandaan itu, pertanda baik bahwa tidak ada hal lain yang ikut mengganggu.
Mengapa nilai bawaan adalah pilihan yang salah di sini
PHP menaikkan cost bawaan bcrypt dari 10 menjadi 12. Di server kelas desktop, itu peningkatan yang masuk akal — hanya beberapa puluh milidetik. Di perangkat keras sederhana, itu berarti lebih dari setengah detik waktu CPU murni, pada mesin yang pada saat yang sama juga menggambar gambar penghitung untuk semua orang lain.
Setengah detik per login sudah buruk dengan sendirinya. Lebih buruk lagi sebagai undangan: siapa pun dapat memanggil endpoint login, dan setiap panggilan menghabiskan 560 ms waktu CPU yang melayani seluruh situs. Itu menjadikan verifikasi kata sandi sebagai celah denial-of-service termurah yang tersedia.
Karena itu cost dipatok pada 10, bukan diserahkan pada nilai bawaan. Itu sengaja lebih lemah daripada yang kini dipilih PHP, dan hal ini perlu dikatakan terus terang, bukan disembunyikan: hash dengan cost 10 empat kali lebih murah untuk diserang daripada hash dengan cost 12. Yang mengimbanginya adalah apa yang sebenarnya dilindungi kata sandi itu — keterlihatan sebuah halaman berisi jumlah kunjungan, bukan akun, bukan uang, bukan identitas. Tidak ada apa pun di baliknya yang bisa diambil alih.
Bagian yang mudah terlewat
PASSWORD_DEFAULT memang sengaja dirancang sebagai nilai yang berubah. Kode yang ditulis bertahun-tahun lalu dan memakainya akan diam-diam menjadi lebih lambat pada setiap pembaruan PHP — kode sumber yang sama, masukan yang sama, waktu eksekusi beberapa kali lipat. Itulah perilaku yang dimaksudkan, dan itu tepat untuk sebagian besar perangkat lunak.
Itu hanya salah jika mesin tidak sanggup menanggungnya, dan tidak ada yang memberi peringatan ketika mesin tidak sanggup. Pembaruan berhasil, pengujian lolos, halaman tetap berfungsi. Hanya saja waktunya setengah detik lebih lama, dan tidak ada yang melihat angka itu kecuali ada yang sengaja mengukurnya.