Contatta l'assistenza

Rispondiamo per e-mail, di solito entro due giorni.

Per prevenire abusi, Google reCAPTCHA verifica questo invio; alcuni dati vengono trasmessi a Google. Lo script viene caricato solo quando apri questo modulo.

← Tutti gli articoli

Quanto costa una password su un Raspberry Pi

Le pagine di statistiche qui si possono proteggere con una password. Calcolare l'hash di quella password è l'unica operazione di questo servizio che deve essere lenta — è ciò che rende costoso attaccare un hash rubato. La domanda è quanto, su questo hardware.

Misurato sulla macchina che manda avanti questo sito, PHP 8.4.21 su aarch64:

PASSWORD_DEFAULT560 ms(risulta cost 12)
cost 12595 ms
cost 11277 ms
cost 10138 ms

Il parametro di costo di bcrypt è un esponente: ogni passo raddoppia il lavoro. Le misure mostrano esattamente quel raddoppio, il che è un buon segno che nient'altro stia interferendo.

Perché il valore predefinito qui è la scelta sbagliata

PHP ha alzato il costo predefinito di bcrypt da 10 a 12. Su un server in un centro dati è un aumento sensato — qualche decina di millisecondi. Su una piccola scheda ARM sono oltre mezzo secondo di CPU pura, su una macchina che nello stesso momento sta disegnando immagini di contatore per tutti gli altri.

Mezzo secondo per ogni accesso è già brutto di per sé. È peggio come invito: il punto di accesso può chiamarlo chiunque, e ogni chiamata consuma 560 ms dell'unico processore che serve tutto il sito. Questo fa della verifica della password il modo più economico di saturare che esista qui.

Il costo è perciò fissato a 10 invece di essere lasciato al predefinito. È deliberatamente più debole di ciò che PHP sceglie oggi, e va detto chiaramente invece che sepolto: un hash a costo 10 è quattro volte più economico da attaccare di uno a costo 12. Ciò che lo riscatta è quel che la password protegge davvero — la visibilità di una pagina di conteggi di visite, non un account, non denaro, non un'identità. Dietro non c'è nulla da impadronirsi.

La parte che è facile non vedere

PASSWORD_DEFAULT è per costruzione un valore mobile. Il codice scritto anni fa che lo usa diventerà silenziosamente più lento a ogni aggiornamento di PHP — stesso sorgente, stesso ingresso, un multiplo del tempo di esecuzione. È il comportamento previsto, e per la maggior parte del software è quello giusto.

È sbagliato solo quando la macchina non riesce ad assorbirlo, e nulla avvisa quando non ci riesce. L'aggiornamento va a buon fine, i test passano, la pagina funziona ancora. Solo che ci mette mezzo secondo in più, e quel numero non lo guarda nessuno se non va a misurarlo.

Pubblicità