Dovrebbe essere sufficiente dire se bcrypt o SHA-512 (nel contesto di un algoritmo appropriato come PBKDF2) sia abbastanza buono . E la risposta è sì, l'uno o l'altro algoritmo è abbastanza sicuro che si verificherà una violazione attraverso un difetto di implementazione, non una crittografia.
Se insisti nel sapere qual è il "migliore", SHA-512 ha ricevuto recensioni approfondite da parte del NIST e di altri. È buono, ma i difetti sono stati riconosciuti che, sebbene non sfruttabili ora, hanno portato alla competizione SHA-3 per i nuovi algoritmi di hash. Inoltre, tieni presente che lo studio degli algoritmi di hash è "più recente" di quello delle cifre e che i crittografi stanno ancora imparando su di loro.
Anche se nel complesso bcrypt non ha avuto lo stesso controllo di Blowfish stesso, credo che basarsi su un codice con una struttura ben compresa gli dia una certa sicurezza intrinseca che manca all'autenticazione basata sull'hash. Inoltre, è più semplice utilizzare GPU comuni come strumento per attaccare gli hash basati su SHA-2; a causa dei suoi requisiti di memoria, l'ottimizzazione di bcrypt richiede hardware più specializzato come FPGA con un po 'di RAM integrata.
Nota: bcrypt è un algoritmo che utilizza Blowfish internamente. Non è un algoritmo di crittografia stesso. È usato per oscurare irreversibilmente le password, proprio come le funzioni di hash sono usate per fare un "hash a senso unico".
Gli algoritmi di hash crittografici sono progettati per essere impossibili da invertire. In altre parole, dato solo l'output di una funzione hash, dovrebbe essere necessario "per sempre" per trovare un messaggio che produrrà lo stesso output hash. In effetti, dovrebbe essere impossibile dal punto di vista computazionale trovare due messaggi che producano lo stesso valore hash. A differenza di un codice, le funzioni hash non sono parametrizzate con una chiave; lo stesso input produrrà sempre lo stesso output.
Se qualcuno fornisce una password con hash sul valore memorizzato nella tabella delle password, vengono autenticati. In particolare, a causa dell'irreversibilità della funzione hash, si presume che l'utente non sia un attaccante che ha ottenuto l'hash e lo ha invertito per trovare una password funzionante.
Ora considera bcrypt. Usa Blowfish per crittografare una stringa magica, usando una chiave "derivata" dalla password. Successivamente, quando un utente immette una password, la chiave viene nuovamente derivata e se il testo cifrato prodotto crittografando con quella chiave corrisponde al testo cifrato memorizzato, l'utente viene autenticato. Il testo cifrato è memorizzato nella tabella "password", ma la chiave derivata non viene mai memorizzata.
Per rompere la crittografia qui, un utente malintenzionato dovrebbe recuperare la chiave dal testo cifrato. Questo è chiamato un attacco "noto-testo in chiaro", poiché l'attacco conosce la stringa magica che è stata crittografata, ma non la chiave utilizzata. Blowfish è stato ampiamente studiato e non sono ancora noti attacchi che consentirebbero a un utente malintenzionato di trovare la chiave con un solo testo in chiaro noto.
Quindi, proprio come gli algoritmi irreversibili basati su digest crittografici, bcrypt produce un output irreversibile, da password, sale e fattore di costo. La sua forza sta nella resistenza di Blowfish ad noti attacchi in chiaro, che è analogo a un "primo attacco pre-immagine" su un algoritmo digest. Dal momento che può essere utilizzato al posto di un algoritmo hash per proteggere le password, bcrypt viene confuso come un algoritmo "hash" stesso.
Supponendo che i tavoli arcobaleno siano stati vanificati dall'uso corretto del sale, qualsiasi funzione veramente irreversibile riduce l'attaccante a tentativi ed errori. E la velocità con cui l'attaccante può fare prove è determinata dalla velocità di quell'algoritmo irreversibile di "hash". Se viene utilizzata una singola iterazione di una funzione hash, un utente malintenzionato può effettuare milioni di prove al secondo utilizzando apparecchiature che costano nell'ordine di $ 1000, testando tutte le password lunghe fino a 8 caratteri in pochi mesi.
Se, tuttavia, l'output digest viene "restituito" migliaia di volte, ci vorranno centinaia di anni per testare lo stesso set di password su quell'hardware. Bcrypt ottiene lo stesso effetto di "rafforzamento delle chiavi" ripetendo la sua routine di derivazione delle chiavi e un metodo basato sull'hash come PBKDF2 fa la stessa cosa; a questo proposito, i due metodi sono simili.
Quindi, la mia raccomandazione di bcrypt deriva dalle ipotesi 1) che un Blowfish ha avuto un livello di controllo simile a quello della famiglia di funzioni hash SHA-2, e 2) che i metodi crittoanalitici per le cifre sono meglio sviluppati rispetto a quelli per le funzioni hash.