Il design illustrato comprometterebbe completamente la sicurezza di bcrypt.
Il tuo progetto potrebbe essere semplificato semplicemente eliminando la parte bcrypt del flusso e affidandosi solo all'hash SHA. Questa semplificazione non cambierebbe la sicurezza del design in modo significativo, sarebbe comunque insicuro semplicemente applicando un hash SHA.
L'uso di un hash SHA con un sale sarebbe tuttavia sufficiente per proteggere buone password. Solo le password deboli beneficiano dell'utilizzo di hashing delle password più strong.
Non hai descritto completamente il problema che stai cercando di risolvere, quindi non possiamo fornire alcun consiglio valido su come procedere. Tuttavia, mi vengono in mente due interpretazioni della tua domanda e ciascuna di esse può essere risolta.
Stai tentando di velocizzare la creazione di massa degli utenti?
Se stai cercando di accelerare la creazione di massa di nuovi utenti e di essere rallentato dall'algoritmo di hashing della password, allora posso proporre due modi per migliorare questo caso d'uso specifico.
- Utilizza password complesse e un hash password mediocre. Se le password generate per gli utenti inizialmente sono forti, non è necessaria la completa sicurezza di bcrypt. Una password iniziale con 128 bit di entropia è passata attraverso un hash della password che fa una singola iterazione salata di SHA-2 è abbastanza sicura. Una volta che l'utente cambia la password iniziale in qualcos'altro, è possibile passare a un algoritmo di hashing della password diverso. Questo può anche essere ottenuto utilizzando formati standard per gli hash delle password, come quello usato una volta dalla funzione
crypt
, in cui il formato inizia con una specifica dell'hash usato.
- Utilizza un hash della password che supporta l'hashing iniziale rapido, ma è più lento a verificare le password. Ciò può essere ottenuto applicando un hash SHA-2 alla concatenazione di sale, password e una breve sequenza di bit casuale. Il bitstring casuale non è memorizzato comunque, quindi deve essere forzato bruto per verificare una password. Questa forzatura bruta sostituisce la normale iterazione utilizzata negli hash delle password.
Stai cercando di ridurre il carico della CPU sul tuo server?
Esistono algoritmi di hashing della password che possono scaricare in modo sicuro la parte intensiva della CPU del calcolo sul client senza compromettere la sicurezza. Questo può anche migliorare la sicurezza non consentendo mai al server di vedere la password effettiva. Lo svantaggio di questo approccio è che richiede il supporto lato client. Un cliente non può più inviare solo nome utente e password per accedere.
Quale hash usare?
Non usare nulla di più debole di SHA-2 in nessun nuovo sistema. Eventuali sistemi legacy che utilizzano SHA-1 per l'uso relativo alla sicurezza dovrebbero essere eliminati o aggiornati. Qualsiasi sistema legacy che utilizza MD5 per scopi legati alla sicurezza avrebbe dovuto essere eliminato gradualmente un decennio fa.
La famiglia SHA-2 ha sei diverse varianti. Non andare con una produzione più breve perché pensi che sarà più veloce. In realtà ci sono solo due varianti della funzione di compressione. Uno ha uno stato interno a 256 bit ed è ottimizzato per CPU a 32 bit. L'altro ha uno stato interno a 512 bit ed è ottimizzato per CPU a 64 bit. Se la tua CPU è a 64 bit, allora SHA-512 è il più veloce e probabilmente il più sicuro.
Per l'hashing della password non si dovrebbe mai hash senza sale. Penso che sia l'unico consiglio completamente obiettivo che può essere dato su come usare le password hash. Vi sono molti altri consigli da dare, ma il resto dipenderà dallo scenario delle minacce.