2009-10-13 17 views
201

Sto osservando gli algoritmi di hashing, ma non sono riuscito a trovare una risposta.SHA512 vs. Blowfish e Bcrypt

  • Bcrypt utilizza Blowfish
  • Blowfish è meglio di MD5
  • D: ma è meglio di Blowfish SHA512?

Thanks ..

Aggiornamento:

Ci tengo a precisare che ho capito la differenza tra hashing e la crittografia. Ciò che mi ha spinto a porre la domanda in questo modo è questo articolo, in cui l'autore si riferisce a bcrypt come "hashing adattivo" https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2007/july/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/

Dal bcrypt si basa su Blowfish, sono stato portato a pensare che Blowfish è un algoritmo di hashing . Se è la crittografia come hanno sottolineato le risposte, mi sembra che non dovrebbe avere un posto in questo articolo. Quel che è peggio è che sta concludendo che bcrypt è il migliore. Ciò che mi confonde anche ora è che la classe phpass (usata per l'hashing della password credo) usi bcrypt (ad esempio blowfish, cioè crittografia). Sulla base di queste nuove informazioni che mi state dicendo (blowfish è crittografia), questa classe suona male. Mi sto perdendo qualcosa?

+2

Non è sbagliato; vedere gli aggiornamenti alla mia risposta per una spiegazione di come funziona bcrypt e perché ha lo stesso scopo di un algoritmo "unidirezionale" basato su hash. – erickson

+2

'bcrypt' ha semplicemente un" fattore di lavoro "più elevato per impostazione predefinita. Si presume che SHA non ... a meno che non si usi passhash9, che può essere utilizzato insieme a un fattore di lavoro. perché questa domanda è chiusa? è tutt'altro che una risposta ancora molto importante. –

+1

Il collegamento in questione è inattivo ............... – Pacerier

risposta

297

Sarebbe sufficiente dire se bcrypt o SHA-512 (nel contesto di un algoritmo appropriato come PBKDF2) è sufficientemente buono. E la risposta è sì, entrambi gli algoritmi sono abbastanza sicuri che una violazione si verificherà attraverso un difetto di implementazione, non una crittoanalisi.

Se si insiste a sapere quale è "migliore", SHA-512 ha avuto recensioni approfondite da parte del NIST e di altri. Va bene, ma sono stati riconosciuti difetti che, sebbene non siano ora sfruttabili, 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 dei cifrari, e i crittografi stanno ancora imparando a conoscerli.

Anche se bcrypt nel suo insieme non ha avuto lo stesso controllo di Blowfish stesso, credo che basarsi su un codice cifrato con una struttura ben definita gli conferisca una sicurezza intrinseca a cui manca l'autenticazione basata su hash. Inoltre, è più facile utilizzare GPU comuni come strumento per attaccare gli hash SHA-2 – basati; a causa dei suoi requisiti di memoria, l'ottimizzazione di bcrypt richiede hardware più specializzato come FPGA con alcuni RAM di bordo.


Nota: bcrypt è un algoritmo che utilizza internamente Blowfish. Non è un algoritmo di crittografia in sé. È usato per oscurare in modo irreversibile 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 impossibile da invertire. In altre parole, dato solo l'output di una funzione di hash, dovrebbe richiedere "per sempre" per trovare un messaggio che produrrà lo stesso output di hash. In effetti, dovrebbe essere computazionalmente impossibile trovare due messaggi che producano lo stesso valore di hash. A differenza di un cifrario, le funzioni di hash non sono parametrizzate con una chiave; lo stesso input produrrà sempre lo stesso output.

Se qualcuno fornisce una password che blocca il valore memorizzato nella tabella della password, vengono autenticati. In particolare, a causa dell'irreversibilità della funzione hash, si presume che l'utente non sia un utente malintenzionato che ha ottenuto l'hash e lo ha invertito per trovare una password funzionante.

Ora considera bcrypt. Usa Blowfish per crittografare una stringa magica, utilizzando una chiave "derivata" dalla password. Successivamente, quando un utente immette una password, la chiave viene nuovamente derivata e se il testo cifrato prodotto dalla crittografia 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 attacco "testo in chiaro", poiché l'attacco conosce la stringa magica che è stata crittografata, ma non la chiave utilizzata. Blowfish è stato studiato estensivamente e non sono ancora noti attacchi che permettano a un utente malintenzionato di trovare la chiave con un solo testo in chiaro noto.

Quindi, proprio come gli algoritmi irreversibili basati su digest di crittografia, bcrypt produce un output irreversibile, da una password, sale e costo. La sua forza risiede nella resistenza di Blowfish a noti attacchi in testo normale, che è analogo a un "primo attacco pre-immagine" su un algoritmo di digestione. Dal momento che può essere utilizzato al posto di un algoritmo hash per proteggere le password, bcrypt viene confusamente chiamato algoritmo "hash".

Supponendo che i tavoli arcobaleno siano stati ostacolati da un uso corretto del sale, qualsiasi funzione veramente irreversibile riduce l'attaccante a tentativi ed errori. E il tasso che l'attaccante può fare prove è determinato dalla velocità di quell'algoritmo "hash" irreversibile. Se viene utilizzata una singola iterazione di una funzione hash, un utente malintenzionato può eseguire milioni di prove al secondo utilizzando apparecchiature che costano nell'ordine di $ 1000, testando tutte le password di massimo 8 caratteri in pochi mesi.

Se, tuttavia, l'output di digest viene "restituito" migliaia di volte, occorreranno centinaia di anni per testare lo stesso set di password su quell'hardware. Bcrypt ottiene lo stesso effetto di "rinforzo chiave" iterando all'interno della sua routine di derivazione delle chiavi, e un metodo basato su hash appropriato 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 analogo livello di controllo della famiglia di funzioni hash SHA-2, e 2) che i metodi crittografici per cifrari sono meglio sviluppati rispetto a quelli per funzioni di hash.

+0

Grazie per la risposta e il commento. Stavo davvero chiedendo ragioni di crittanalisi/tabelle arcobaleno, ecc. Ma avevo anche l'impressione che Blowfish non stesse eseguendo l'hashing della crittografia come usato nella classe phpass (una classe utilizzata per l'hashing delle password credo). Ho aggiornato il mio post originale di conseguenza. – Chris

+0

Aggiornamento eccellente. Grazie. – Chris

+4

+1 ottimo post. Ma ho due domande. Blowfish è stato sostituito da twofish più di un decennio fa, non dovrebbe un sistema utilizzare i primitivi moderni? Anche migliaia di iterazioni sembrano sprecate in sistemi come le applicazioni web in cui molte persone effettuano l'accesso in un dato momento. Ad esempio, PBKDF2 viene implementato solo in scenari in cui 1 persona accede alla volta, ad esempio una funzione stringa2key per un filesystem crittografato. Io uso l'adagio "Se è troppo pesante per l'attaccante da sollevare, allora è troppo pesante per il tuo server". Cosa ne pensi? – rook

28

Blowfish non è un algoritmo di hashing. È un algoritmo di crittografia. Ciò significa che puoi crittografare qualcosa usando blowfish, e in seguito puoi decrittografarlo in testo normale.

SHA512 è un algoritmo di hashing. Ciò significa che (in teoria) una volta che hai cancellato l'input non puoi ottenere di nuovo l'input originale.

Sono 2 cose diverse, progettate per essere utilizzate per compiti diversi. Non esiste una risposta "corretta" a "blowfish è meglio di SHA512?" Si potrebbe anche chiedere "le mele sono meglio dei canguri?"

Se volete leggere un po 'di più sul tema ecco alcuni link:

+17

Penso che la domanda riguardi l'utilizzo di bcrypt come protezione irreversibile per le password, proprio come l'hashing è utilizzato a tale scopo. – erickson

+3

@erickson il testo "Q: ma Blowfish è meglio di SHA512?" mi sembra abbastanza chiaro e dimostra che l'OP non comprende le differenze tra i 2 algoritmi – Glen

+1

OP qui. In realtà, sulla base di Glen's asnwer che blowfish è un algoritmo di crittografia (che capisco è diverso dall'hashing), mi rendo conto ora che la mia domanda sì era confusa. Ciò che è confuso ora è che la classe phpass (usata per l'hashing della password credo) usi bcrypt (ad es. Blowfish, cioè crittografia). Se blowfish è crittografia, come mai phpass lo usa per le password hash, mi sembra un difetto, no? Mi sto perdendo qualcosa? – Chris

4

Blowfish non è migliore di MD5 o SHA512, in quanto servono diversi scopi. MD5 e SHA512 sono algoritmi di hashing, Blowfish è un algoritmo di crittografia. Due funzioni crittografiche completamente diverse.

47

Sono d'accordo con la risposta di Erickson, con un avvertimento: per l'autenticazione della password, bcrypt è di gran lunga meglio di una singola iterazione di SHA-512 - semplicemente perché è molto più lento. Se non capisci perché la lentezza è un vantaggio in questo particolare gioco, leggi l'articolo a cui ti sei ricollegato (scorri fino a "La velocità è esattamente ciò che non vuoi in una funzione di hash della password:").

Ovviamente è possibile creare un algoritmo di hashing della password sicuro attorno a SHA-512 ripetendolo migliaia di volte, proprio come funziona l'algoritmo MD5 di PHK. Ulrich Drepper did exactly this, per la crypt di glibc(). Non c'è una ragione particolare per farlo, però, se hai già a disposizione un'implementazione di bcrypt testata.

+3

Spero che la mia risposta chiarisca che una singola iterazione di hash non è sufficiente (purtroppo, nemmeno questo rudimentale livello di conoscenza non può essere assunto). "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 di massimo 8 caratteri in pochi mesi. viene "rispedito" migliaia di volte, ci vorranno centinaia di anni per testare lo stesso set di password su quell'hardware. Bcrypt ottiene lo stesso effetto "rafforzamento chiave" iterando ... " – erickson

+0

@erickson: Sì, anche se penso che potresti lì hanno seppellito il lede Il punto che stavo cercando di fare è che un confronto diretto tra bcrypt e SHA-512 non sia realmente rilevante, perché uno è una funzione di derivazione chiave e l'altro è solo un primitivo crittografico, non adatto a se stesso. – caf

+4

http://codahale.com/how-to-safely-store-a-password/ – ripper234

2

Vorrei raccomandare l'implementazione di Crypt basata su SHA-256/SHA-512 di Ulrich Drepper.

Abbiamo portato questi algoritmi su Java e potete trovarne una versione liberamente concessa su ftp://ftp.arlut.utexas.edu/java_hashes/.

Si noti che i più moderni (L) Unices supportano l'algoritmo di Drepper nei propri file/etc/shadow.

+0

PWDTK http://sourceforge.net/projects/pwdtknet/ utilizza HMAC-SHA512, tuttavia lo fa su molte iterazioni per creare "lentezza", ad esempio Key Stretching, di cui altri hanno parlato. BCrypt è meglio di un singolo SHA-512 come è stato menzionato, tuttavia se si usa SHA-512 in qualcosa come PBKDF2 allora si è ben protetti (a patto che si utilizzi un grande sale crittografico casuale e iterazioni sufficienti per forzare il tempo a fare una tavola arcobaleno) l'API che ho appena postato è costruita da me e farà quello che vuoi in. NET se questo è ciò che stai sviluppando (per i futuri lettori ne beneficiano) – thashiznets

2

Ho appena imbattuto in questo:

http://codahale.com/how-to-safely-store-a-password/

Può l'autore di questo articolo essere sbagliato?

+2

Non è che lui stia sbagliando, è solo che sta ignorando un ricchezza di letteratura su come applicare gli algoritmi hash, vale a dire. dovrebbero essere usati in modo iterativo nelle funzioni di derivazione chiave, proprio come fa bcrypt. – erickson