SHA512 vs. Blowfish and Bcrypt [chiuso]


222

Sto guardando algoritmi di hashing, ma non sono riuscito a trovare una risposta.

  • Bcrypt usa Blowfish
  • Blowfish è meglio di MD5
  • D: Ma Blowfish è meglio di SHA512?

Grazie..

Aggiornare:

Voglio chiarire che capisco la differenza tra hashing e 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"

Poiché bcrypt è basato su Blowfish, sono stato portato a pensare che Blowfish sia un algoritmo di hashing. Se è la crittografia come hanno indicato le risposte, allora 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 (utilizzata per l'hash della password credo) utilizza bcrypt (ovvero blowfish, ovvero crittografia). Sulla base di queste nuove informazioni che voi ragazzi mi state dicendo (blowfish è la crittografia), questa classe sembra sbagliata. Mi sto perdendo qualcosa?


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

3
bcryptha semplicemente un "fattore di lavoro" più elevato di default. Si presume che SHA non lo faccia ... a meno che non si usi passhash9, che può essere utilizzato insieme a un fattore di lavoro. perché questa domanda è chiusa? è lungi dall'essere risposto ma molto importante.

1
Il link in questione non funziona ...............
Pacerier,

Risposte:


320

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.


4
+1 ottimo post. Ma ho due domande. Blowfish è stato sostituito da twofish più di un decennio fa, un sistema non dovrebbe utilizzare primitivi moderni? Anche migliaia di iterazioni sembrano dispendiose in sistemi come le applicazioni web in cui molte persone accedono in un dato momento. Ad esempio PBKDF2 è implementato solo in scenari in cui 1 persona accede alla volta, come una funzione string2key per un filesystem crittografato. Uso l'adagio "Se è troppo pesante per essere sollevato dall'attaccante, allora è troppo pesante per il tuo server". Cosa ne pensi?
ho

17
Non credo che ci sia qualcosa di sbagliato nell'usare una primitiva più moderna. Le vulnerabilità vengono spesso scoperte con il passare del tempo e Twofish è stato sviluppato utilizzando le conoscenze acquisite da Blowfish. Tuttavia, non sono a conoscenza di vulnerabilità specifiche che potrebbero invalidare l'uso di Blowfish, quindi potrebbe essere avanzato anche un argomento "se non si è rotto". Il tuo adagio sugli aggressori non mi suona bene. Anche se scegli un algoritmo che richiederebbe anni per un utente malintenzionato per testare un miliardo di password, consumerà una frazione trascurabile di tempo in un'applicazione legittima.
Erickson,

15
Se osservi le specifiche di qualsiasi funzione hash, non vedrai nulla di "salt". L'unico parametro è il messaggio da digerire. Esamina le specifiche di qualsiasi codice e vedrai che la funzione è parametrizzata con un tasto. Il "sale" che può (o non può essere ) usato insieme a un hash fa semplicemente parte del messaggio. L'algoritmo hash non lo richiede, non lo tratta in modo particolare e non può differenziarlo dal resto del messaggio. Quindi, mentre è vero che i messaggi sono spesso alterati dalla salatura, un determinato messaggio produce solo un hash.
Erickson,

1
@Andre D Come pentester ho segnalato applicazioni che bloccano gli account e ho segnalato applicazioni che non impediscono la forza bruta. Idealmente un indirizzo IP offensivo deve risolvere un captcha, inoltre se un nome utente è scelto come target (anche se tale nome utente non esiste), quell'account dovrebbe risolvere un captcha prima di autenticarsi. È anche accettabile applicare un limite di X al minuto. Correlati: security.stackexchange.com/questions/25444/…
torre

2
@rook: mentre la ratelimiting delle applicazioni è una buona pratica, in questo caso si può presumere che il database sia stato scaricato e collocato su un'apparecchiatura che non ha il limite di velocità descritto.
Ellert van Koperen,

50

Sono d'accordo con la risposta di Erickson, con un avvertimento: ai fini dell'autenticazione con password, bcrypt è molto 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 di nuovo l'articolo a cui hai collegato (scorri verso il basso fino a "La velocità è esattamente ciò che non vuoi in una funzione di hash della password ").

Ovviamente puoi 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 ha fatto esattamente questo , per glibc's crypt (). Non c'è un motivo particolare per farlo, tuttavia, se hai già un'implementazione bcrypt testata disponibile.


3
Spero che la mia risposta chiarisca che una singola iterazione di hash non è sufficiente (purtroppo, anche questo livello di conoscenza rudimentale 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 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 chiave"
ripetendo

@erickson: Sì, anche se penso che potresti aver seppellito lì. Il punto che stavo cercando di sottolineare è che un confronto diretto tra bcrypt e SHA-512 non è realmente rilevante, perché uno è una funzione di derivazione chiave e l'altro è solo una primitiva crittografica, non adatta da sola.
Caf


1
L'uso di migliaia di round di SHA-512 non è inaudito e data la sua inclusione in varie cryptimplementazioni (incluso in PHP che uso), quando ho letto la domanda originale ho persino pensato che fosse quello che intendeva l'OP quando ha chiesto di SHA-512 - che in realtà si riferiva a migliaia di round di SHA-512 vs bcrypt che utilizza centinaia o migliaia di iterazioni stesse.
thomasrutter,

33

Blowfish non è un algoritmo di hashing. È un algoritmo di crittografia. Ciò significa che puoi crittografare qualcosa usando il pesce palla, e in seguito puoi decodificarlo in testo semplice.

SHA512 è un algoritmo di hashing. Ciò significa che (in teoria) una volta ottenuto l'hash dell'input non è possibile ripristinare nuovamente l'input originale.

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

Se vuoi leggere qualcosa in più sull'argomento ecco alcuni link:


18
Penso che la domanda riguardi l'uso di bcrypt come protezione irreversibile per le password, proprio come l'hashing viene 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 capisce le differenze tra i 2 algoritmi
Glen,

1
OP qui. In realtà, basandomi sulla risposta di Glen che Blowfish è un algoritmo di crittografia (che capisco è diverso dall'hash), mi rendo conto ora che la mia domanda sì era confusa. Ciò che confonde ora è che la classe phpass (utilizzata per l'hash della password credo) utilizza bcrypt (ovvero blowfish, ovvero crittografia). Se blowfish è una crittografia, come mai phpass la usa per hash password, mi sembra un difetto, no? Mi sto perdendo qualcosa?
Chris,

2
tuttavia la domanda si pone quale delle mele e dei canguri siano più adatti a un compito specifico. Blowfish è una funzione di hashing migliore rispetto a sha a causa del tempo impiegato dall'hash. La maggior parte delle implementazioni di sha che ho visto sono molto veloci. Desideri un algoritmo lento per l'hash della password.
John Nicholas,

Questa risposta è corretta che Blowfish è un algoritmo di crittografia, ma in questo contesto (ad esempio, quando utilizzato in bcrypt) viene utilizzato come algoritmo di hashing derivando una chiave dalla stringa di origine e usandola per crittografare un numero magico. Questo lo rende irreversibile, essenzialmente una funzione di hashing. Non è possibile calcolare la chiave da un codice, anche se si conoscono i dati in chiaro e crittografati.
thomasrutter,

4

Blowfish non è meglio di MD5 o SHA512, poiché servono a scopi diversi. MD5 e SHA512 sono algoritmi di hashing, Blowfish è un algoritmo di crittografia. Due funzioni crittografiche completamente diverse.


2

Consiglierei l'implementazione della cripta basata su SHA-256 / SHA-512 di Ulrich Drepper.

Abbiamo portato questi algoritmi su Java e puoi trovarne una versione con licenza gratuita su ftp://ftp.arlut.utexas.edu/java_hashes/ .

Nota che la maggior parte dei moderni (L) Unices supporta l'algoritmo di Drepper nei loro file / etc / shadow.


PWDTK sourceforge.net/projects/pwdtknet utilizza HMAC-SHA512, tuttavia lo fa in molte iterazioni per creare "lentezza", ovvero Key Stretching di cui altri hanno già parlato. BCrypt è meglio di un singolo SHA-512 come è stato menzionato, tuttavia se si utilizza SHA-512 in qualcosa come PBKDF2, allora si è ben sicuri (purché si utilizzi un grande sale crittografico casuale e abbastanza iterazioni per forzare il tempo a creare una tabella arcobaleno) l'API che ho appena pubblicato è stata creata da me e farà ciò che vuoi in .NET se questo è ciò per cui stai sviluppando (per i futuri lettori)
thashiznets

2

Mi sono appena imbattuto in questo:

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

L'autore di questo articolo può sbagliarsi?


2
Non è che si sbagli, è solo che sta ignorando una grande quantità di letteratura su come applicare gli algoritmi di hash, vale a dire. dovrebbero essere usati iterativamente nelle funzioni di derivazione chiave, proprio come fa bcrypt.
Erickson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.