Recentemente mi sono reso conto del fatto che bcrypt tronca le password a 72 caratteri. In pratica, la mia intuizione è che questo non pone problemi di sicurezza importanti. Tuttavia, capisco che ciò significa che qualsiasi libreria di software che utilizza bcrypt potenzialmente soffre di un "bug" in cui due password ultra lunghe che iniziano con gli stessi 72 caratteri saranno equivalenti.
Gli autori del framework web Django hanno scritto qualcosa chiamato BCryptSHA256PasswordHasher
per risolvere questo problema; ciò che fa è prima le password degli utenti hash con SHA256 prima di passarle a bcrypt.
Alcuni sviluppatori della mia squadra stavano discutendo i vantaggi di questo approccio e volevo solo raccogliere pensieri dalla comunità generale. Da un lato, non è questo in un certo senso ridurre la sicurezza riducendo lo spazio totale dei valori possibili che vengono inseriti in bcrypt? SHA256 emetterà sempre 32 byte, molto meno dei 72 (significativi) byte che avremmo altrimenti. D'altra parte, senza le password di hashing prima abbiamo essenzialmente uno spazio distribuito in modo non uniforme dove per ogni prefisso di 72 caratteri, tutte le password che iniziano con quel prefisso si scontrano.
Il mio istinto è che il problema di distribuzione oltre 72 byte non è importante e che BCryptSHA256PasswordHasher
non è davvero utile. Detto questo, riconosco anche che, in generale, i framework che sono così popolari e ampiamente utilizzati come Django tendono a prendere sul serio queste cose e hanno buone ragioni dietro le loro decisioni. Quindi non ho molta fiducia nel mio intestino su questo, se questo ha senso.
Mi sbaglio? Le password di hashing con SHA256 prima che bcrypt non riduca la sicurezza, anche teoricamente? Il problema di distribuzione è più grave di quanto immaginassi? C'è qualcos'altro a cui non penso completamente?