Sono preoccupato per l'uso di bcrypt per la generazione di password lato client. Sto sviluppando una funzione di generazione password da utilizzare lato client, simile a PwdHash e PasswordMaker.
Molto è stato detto sul vantaggio dell'uso di bcrypt su funzioni hash più veloci perché rallenta gli attacchi a forza bruta. So che bcrypt usa internamente Blowfish, che è un algoritmo di crittografia simmetrica piuttosto che un algoritmo di hash. Quindi ci deve essere una chiave codificata da qualche parte per usare bcrypt, e poiché Blowfish viene usato, è ovvio che se la chiave viene scoperta, la derivazione della password può essere invertita e la password originale scoperta.
Poiché il codice lato client può essere decompilato, la chiave potrebbe essere facilmente scoperta, rendendo bcrypt non sicuro da usare lato client. Il mio ragionamento è corretto o mi sono perso qualcosa?
Inoltre, in una domanda correlata, lo stesso argomento non sarebbe valido anche sul lato server. Una funzione di hash non può essere invertita, ma una funzione di crittografia può essere se la chiave è nota. Non sarebbe più sicuro usare un lato reale del server hash, anche se è più veloce e quindi più suscettibile agli attacchi di forza bruta, piuttosto che usare bcrypt che è reversibile?
EDIT: user10008 note seguenti (post è stato rimosso) che solo parti di Blowfish sono usate in bcrypt e mi hanno dato un link. Quando ho seguito un link ho trovato un prototipo di funzione che include la chiave come ultimo argomento. Quindi vedo ancora la chiave utilizzata per avviare l'algoritmo di bcrypt. Se la chiave è richiesta e bcrypt utilizza la crittografia simmetrica anziché l'hashing, l'operazione non è reversibile?
EDIT: buone risposte sia da martinstoeckli che dall'utente10008. Ho dato la risposta a marginstoeckli a causa dell'ultima frase nella risposta:
BCrypt può essere visto come crittografato con il lancio della chiave.
per me. Fondamentalmente, passiamo attraverso 2 fasi
P - > K ; P, K - > C
e poi getta via la chiave K, lasciando il criptotesto C. Poiché buttiamo via la chiave K, non possiamo decifrare di nuovo in testo normale P. Gettare K fa in modo efficace che bcrypt sia una funzione unidirezionale.
EDIT: Da user10008, i passaggi che ho dato sopra sono più complessi, tuttavia l'essenza è che la chiave K è usata nella fase finale e scartata. Grazie utente10008.