Mütevazı donanımda bir parolanın maliyeti
Buradaki istatistik sayfaları parolayla korunabilir. Bu parolayı hash'lemek, bu hizmette yavaş olması gereken tek işlemdir — çalınmış bir hash'e saldırmayı pahalı kılan da budur. Soru şu: bu donanımda ne kadar yavaş?
Bu siteyi çalıştıran makinede, PHP 8 ile ölçüldü:
PASSWORD_DEFAULT | 560 ms | (yani maliyet 12) |
| maliyet 12 | 595 ms | |
| maliyet 11 | 277 ms | |
| maliyet 10 | 138 ms |
bcrypt'in maliyet parametresi bir üs değeridir: her adım işi iki katına çıkarır. Ölçümler tam da bu ikiye katlanmayı gösteriyor; bu, araya başka hiçbir şeyin girmediğinin iyi bir işareti.
Varsayılan değer burada neden yanlış seçim
PHP, bcrypt'in varsayılan maliyetini 10'dan 12'ye çıkardı. Masaüstü sınıfı bir sunucuda bu mantıklı bir yükseltmedir — birkaç on milisaniye tutar. Mütevazı donanımda ise bu, yarım saniyeyi aşan saf işlemci zamanı, hem de aynı anda başka herkes için sayaç resimleri de çizen bir makinede.
Her girişte yarım saniye başlı başına kötüdür. Bir davet olarak ise daha da kötüdür: giriş uç noktasını herkes çağırabilir ve her çağrı, bütün siteye hizmet veren işlemciden 560 ms harcar. Bu da parola doğrulamayı, hizmet reddi saldırıları için bulunabilecek en ucuz yüzeye çevirir.
Bu yüzden maliyet varsayılana bırakılmak yerine 10'a sabitlendi. Bu, PHP'nin artık seçtiğinden bilerek daha zayıftır ve bunu gömmek yerine açıkça söylemek gerekir: maliyeti 10 olan bir hash'e saldırmak, maliyeti 12 olan bir hash'e saldırmaktan dört kat daha ucuzdur. Bunu telafi eden, parolanın gerçekte neyi koruduğudur — bir hesabı, parayı ya da kimliği değil, ziyaret sayılarını gösteren bir sayfanın görünürlüğünü. Arkasında ele geçirilecek hiçbir şey yok.
Gözden kaçması kolay olan kısım
PASSWORD_DEFAULT tasarım gereği değişen bir değerdir. Onu kullanan ve yıllar önce yazılmış kod, her PHP yükseltmesinde sessizce yavaşlar — aynı kaynak, aynı girdi, birkaç kat çalışma süresi. Amaçlanan davranış budur ve çoğu yazılım için doğrudur.
Yalnızca makine bunu kaldıramadığında yanlıştır ve kaldıramadığında hiçbir şey uyarı vermez. Yükseltme başarılı olur, testler geçer, sayfa hâlâ çalışır. Yalnızca yarım saniye daha uzun sürer ve gidip ölçmedikçe kimse o sayıya bakmaz.