bcrypt non è pensato per questo tipo di hashing lato client
Una proprietà chiave di bcrypt è che, quando si eseguono due volte indipendenti con lo stesso testo in chiaro, la maggior parte delle implementazioni genererà hash differenti. Ciò è dovuto all'uso di un sale, progettato per rendere difficile vedere se due utenti diversi hanno la stessa password.
Al contrario, i moduli di accesso devono ricevere sempre gli stessi dati. Dopotutto, in quale altro modo verificherebbe che la password che l'utente ha digitato oggi è la stessa che ha digitato ieri?
Quindi, hai un algoritmo progettato per produrre diversi dati ogni volta, e lo stai inserendo in un'applicazione che deve verificare che i dati siano stessi ciascuno tempo. Probabilmente è un'indicazione che l'algoritmo non viene utilizzato come previsto.
Ciò che dovresti idealmente fare è utilizzare bcrypt in hash password sul server . Questo è ciò che è stato progettato per bcrypt: proteggere le password degli utenti nei momenti in cui il testo non è in memoria, che è di gran lunga lo stato più comune (ad esempio, i dump di DB rivelano solo la password con hash, non il testo in chiaro, se implementata correttamente). / p>
Personalmente vedo un certo valore nell'hashing lato client, perché aiuta a proteggere dagli attacchi che possono annusare il traffico (o che hanno accesso al server). Tuttavia, non conosco un modo per rendere l'hashing lato client sicuro come bcrypt sul lato server, motivo per cui dovresti continuare a utilizzare bcrypt sul lato server.
Se è necessario utilizzare bcrypt sul lato client, utilizzare un salt statico
Se stai andando a usare bcrypt per l'hashing sul lato client di un modulo di login, e vuoi che sia una sostituzione drop-in per MD5, devi usare un salt statico. Soprattutto se lo stai passando attraverso SHA1, perché ciò mancherebbe il bcrypt salt così come i dati dell'hashed stesso.
Questo rompe diverse ipotesi progettuali di bcrypt (come sempre usando un salt casuale), naturalmente.
Personalmente raccomando di usare lo username come salt (in modo che sia difficile dire se due utenti diversi abbiano la stessa password); tuttavia, non conosco alcuna ricerca che sia stata fatta sulla salatura in questo contesto.
Anche
AES (o qualsiasi cifra simmetrica) è inutile qui
Ricorda che AES è un algoritmo simmetrico, il che significa che hai bisogno della stessa chiave per decriptare e per crittografare i dati.
Che cosa significa questo per te? Bene, probabilmente hai ottenuto la chiave di crittografia nell'origine JavaScript, che viene offerta a qualsiasi client che visita la tua pagina di accesso. AES è un codice simmetrico, quindi la chiave di crittografia (identica alla chiave di decrittografia) dovrebbe essere privata. In altre parole, la tua chiave privata è nota al mondo - a questo punto non fornisce alcuna sicurezza efficace.
Quello che dovresti utilizzare è invece crittografia a chiave pubblica, come PGP o HTTPS (tecnicamente, HTTPS utilizza un approccio ibrido). Seriamente, utilizza solo HTTPS , a meno che l'organizzazione non ti rifiuti di avere un certificato SSL, per qualche motivo. Tieni presente che PGP non proteggerà realmente dagli attacchi MITM attivi, ma proteggerà almeno contro le intercettazioni.