Hubungi dukungan

Kami membalas melalui e-mail, biasanya dalam dua hari.

Google reCAPTCHA memeriksa kiriman ini untuk mencegah penyalahgunaan; data dikirim ke Google. Skrip hanya dimuat saat formulir ini dibuka.

← Semua artikel

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_DEFAULT560 ms(setara cost 12)
cost 12595 ms
cost 11277 ms
cost 10138 ms
cost 10138 mscost 11277 mscost 12595 msPASSWORD_DEFAULT

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.

Iklan