Utilizzare BCRYPT per l'hashing della password sul lato client

5

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.

    
posta Ken Clubb 24.08.2014 - 20:28
fonte

5 risposte

6

È proprio il contrario, BCrypt non cripta la password con una chiave segreta, piuttosto usa la password come chiave per crittografare un testo conosciuto. Nel setup in cui viene generata la chiave, utilizza sia salt che la password (variabile EksBlowfishSetup.key ), per generare una chiave (variabile bcrypt.state ) utilizzata per la crittografia.

bcrypt(cost, salt, input)
    state \gets EksBlowfishSetup(cost, salt, input)
    ctext \gets "OrpheanBeholderScryDoubt" //three 64-bit blocks
    repeat (64)
        ctext \gets EncryptECB(state, ctext) //encrypt using standard Blowfish in ECB mode
    return Concatenate(cost, salt, ctext)

EksBlowfishSetup(cost, salt, key)
    state \gets InitState()
    state \gets ExpandKey(state, salt, key)
    repeat (2cost)
        state \gets ExpandKey(state, 0, key)
        state \gets ExpandKey(state, 0, salt)
    return state

BCrypt può essere visto come crittografato con il lancio della chiave.

    
risposta data 25.08.2014 - 09:52
fonte
4

Bcrypt non è reversibile. Puoi usarlo sia lato client che lato server.

La chiave non è statica, ma dipende dalla password, generata dalla chiamata di funzione EksBlowfishSetup(cost, salt, input) . Il testo in chiaro è conosciuto e pubblico, il suo "OrpheanBeholderScryDoubt" . Se si desidera recuperare la chiave, è necessario montare un attacco noto-testo in chiaro su blowfish 64 volte , che è molto difficile, e quindi avresti solo la chiave e non la password.

Wikipedia fornisce una panoramica pseudocodice dell'algoritmo bcrypt :

 bcrypt(cost, salt, input)
     state ← EksBlowfishSetup(cost, salt, input)
     ctext ← "OrpheanBeholderScryDoubt" //three 64-bit blocks
     repeat (64)
         ctext ← EncryptECB(state, ctext) //encrypt using standard Blowfish in ECB mode
     return Concatenate(cost, salt, ctext)
    
risposta data 24.08.2014 - 21:39
fonte
2

Modificato per aggiungere: si scopre che quello che ho scritto è corretto, ma non è una risposta alla domanda che è stata posta. Mi scuso.

Qualunque cosa tu invii dal client al server è la password, sia che sia stata sottoposta a hash, a fette oa cubetti. Un hash della password sul client non è più sicuro della stessa stringa, senza alterazione. Se viene intercettato, può essere utilizzato per un attacco di replay in entrambi i casi.

L'importante è assicurarsi che la password sia trasmessa crittografata , ad es. con SSL / TLS.

Dai un'occhiata a questo per una spiegazione più completa: link

    
risposta data 24.08.2014 - 21:39
fonte
0

Non è chiaro quale lingua stai usando, ma nel PHP più recente rendono tutto più semplice avendo a disposizione una funzione di hash incorporata che può tenere conto della crittografia più recente e migliore. C'è una funzione di verifica per testare l'hash. C'è anche una funzione rehash che può tenere conto delle modifiche future, in modo tale che i vecchi hash possano essere aggiornati e comunque verificati. Data la corretta implementazione, questo dovrebbe occuparsi della maggior parte dei problemi che potresti incontrare. Tuttavia, come sottolinea Jeff-Inventor ChromeOS, la maggior parte degli usi di un hash non richiede molto più di un semplice algoritmo. Dipende dai tuoi bisogni e quanto sei disposto a sacrificare la sicurezza sul tempo di elaborazione / potenza.

    
risposta data 16.10.2015 - 21:27
fonte
0

È prassi comune utilizzare qualsiasi algoritmo di hash, come SHA-2 sul client. Per una sicurezza leggermente maggiore, è possibile utilizzare un hash lento come PBKDF2, bcrypt o scrypt. Un hash lento è un hash progettato per richiedere una grande quantità di potenza di calcolo, rendendo gli attacchi di forza bruta con elenchi di password comuni più diffusi.

Il vero vantaggio in termini di sicurezza degli hash lenti non è tuttavia grande, perché gli utenti selezionano le password da un elenco piuttosto piccolo di password comuni. Nella mia analisi, circa un milione di password (20 bit) recuperano il 50% degli account ( link ). Solo poche migliaia di password recuperano una parte significativa dei conti (6,1%).

È impossibile eliminare una quantità così piccola di entropia quanto basta per diventare un ostacolo significativo per un utente malintenzionato.

    
risposta data 25.08.2014 - 09:10
fonte

Leggi altre domande sui tag