it-swarm-eu.dev

Bcrypt è meglio di scrypt

Possibile duplicato:
Alcuni esperti di sicurezza raccomandano bcrypt per l'archiviazione delle password?

Non sono un esperto di sicurezza e non pretendo di esserlo, ecco perché lo sto chiedendo qui. Scrivo molte PHP e fino ad ora ho usato bcrypt per eseguire l'hashing delle mie password.

Il sito web scrypt afferma di essere 4000 volte più lento di bcrypt, questa affermazione può davvero essere corretta? In tal caso sarebbe "meglio" per uno sviluppatore attento alla sicurezza passare a utilizzare scrypt anziché bcrypt?

52
twigg

Scrypt dovrebbe essere "migliore" di bcrypt, ma è anche molto più recente, e questo è negativo (perché "più recente" implica intrinsecamente "ha ricevuto meno controllo").

Tutti questi schemi di hashing delle password cercano di rendere più costosa l'elaborazione di una singola password per l'attaccante, senza renderla troppo costosa per il tuo server. Poiché il tuo server è, in sostanza, un PC e l'aggressore può scegliere l'hardware più efficiente per il suo compito, gli schemi di hashing della password cercano di essere tali che la piattaforma migliore per loro sia un PC. PBKDF2 può essere completamente ottimizzato con GPU, mentre bcrypt e scrypt sono molto meno compatibili con le GPU. Bcrypt e scrypt richiedono entrambi RAM veloce , che è una risorsa scarsa in una GPU (una GPU può avere molta RAM, ma non sarà in grado di accedervi da tutti i core contemporaneamente).

Accade così che i moderni FPGA incorporano molti piccoli blocchi RAM che sono molto utili per ottimizzare un attacco di dizionario parallelo con bcrypt: questo significa che un utente malintenzionato otterrà un enorme potenziamento utilizzando FPGA del valore di 1000 $ anziché 1000 $ di PC generico. Questo è il tipo di boost che vogliamo evitare. Quindi scrypt, che richiede molta più RAM; non troppo molto per un PC (stiamo parlando solo di un paio di megabyte qui), ma abbastanza per rendere la vita difficile per un FPGA (vedi questa risposta per un trattamento dettagliato della domanda).

Pertanto, teoricamente , scrypt dovrebbe essere migliore di bcrypt. Tuttavia , tutto dipende dal fatto che Scrypt sia all'altezza delle sue promesse crittografiche. Questo tipo di garanzia di robustezza può essere raggiunto solo nel tempo: lo schema sarà ritenuto sicuro se sopravvive a anni di assalti incessanti da parte dei crittografi. Quanto tempo è necessario, ovviamente è un po 'soggettivo e dipende anche molto da esposizione (più uno schema è ampiamente distribuito, più diventa "interessante" un obiettivo, in quanto romperlo aumenterebbe la fama accademica dell'autore del reato, attirando così un maggiore controllo). La mia regola empirica è aspettare circa 5 anni dopo la pubblicazione, quindi il 2014 nel caso di scrypt.

C'è anche la domanda di disponibilità : se vuoi usare una funzione, allora hai bisogno di un'implementazione che può essere inserita nel framework di programmazione che usi.

54
Thomas Pornin

Vorrei prendere l'affermazione "Scrypt è 4000 volte più lenta di BCrypt" con un granello di sale. Innanzitutto, entrambi questi algoritmi sono variamente complessi; anche se la cifra "4000x" è valida, puoi rendere BCrypt altrettanto lento aggiungendo altri 11 round alla derivazione chiave. In secondo luogo, ad un certo punto sia SCrypt che BCrypt sono limitati da quanto tempo impiega per calcolare legittimamente un hash sul computer dell'utente medio (o sul tuo server se lo stai facendo sul lato server per un'app Web). SCrypt essendo 4000x più lento potrebbe aumentare la frequenza di rimbalzo del tuo sito Web di più della maggiore sicurezza.

Motivi per scegliere BCrypt:

  • Come SCrypt, BCrypt è configurabilmente lento, quindi si terrà al passo con la Legge di Moore abbastanza bene quando si scontra con un tradizionale crackbot CPU/GPU.
  • BCrypt ha 14 anni, basato su un codice che ha più di 20 anni, e nessuno dei due ha dimostrato di avere una debolezza teorica fattibile (esiste una vulnerabilità nota in chiaro in Blowfish che non influisce minimamente su BCrypt, ma c'è un bug in un'implementazione UNIX di BCrypt potrebbe causare errori dell'applicazione se venisse fornito determinati codici carattere).

    SCrypt ha solo 3-4 anni, quindi non ha il pedigree crittoanalitico richiesto per ottenere la fiducia della maggior parte dei crittografi. Ciò non significa che sia vulnerabile; significa che gli esperti di sicurezza di mopst non sono abbastanza sicuri di non essere vulnerabili ancora.

  • Ci sono implementazioni di BCrypt disponibili praticamente per ogni lingua/runtime. Ancora una volta, SCrypt, essendo così nuovo, non è così ampiamente accettato e quindi il numero di implementazioni ben controllate è più limitato.

C'è davvero solo un motivo per scegliere SCrypt su BCrypt ed è il motivo per cui SCrypt è stato progettato: il principale punto debole di BCrypt nei confronti di un sistema di cracking distribuito è l'utilizzo di memoria basso e costante. Ciò rende BCrypt vulnerabile alla forzatura brutale a costi contenuti utilizzando array di gate o FPGA programmabili sul campo relativamente economici. Questi array hanno una quantità relativamente piccola di SRAM integrata nei loro blocchi logici, che è ancora sufficiente per contenere i dati di stato di BCrypt. Come ha detto Thomas, questi array sono più economici da acquistare e configurare rispetto a una rete distribuita di tradizionali crackbot basati su CPU o GPU, quindi in modo equivalente, il tuo attaccante ottiene di più per i suoi soldi.

SCrypt, al contrario, utilizza non solo tempo esponenziale, ma memoria esponenziale; con l'aumentare del numero di round di derivazione, SCrypt richiede l'archiviazione di una serie di "snapshot" di dati di stato intermedi, che vengono utilizzati in ulteriori operazioni di derivazione. Questo non è un problema per il computer di un utente legittimo che genera un hash (probabilmente stai usando pochi MB al massimo), ma la memoria limitata di un blocco FPGA diventa rapidamente insufficiente. Ora, qualunque cosa tu possa archiviare, potresti invece calcolare "su richiesta", ma poiché ciascuno di questi stati intermedi è il risultato di una propria serie di operazioni esponenzialmente complesse (ognuna delle quali ha una complessità minore dell'hash finale, ma deve essere calcolato più volte per l'uso su richiesta), l'attaccante è ora sul corno di un dilemma; o hanno bisogno in modo esponenziale di più FPGA per tenere il passo con l'aumento del tempo di calcolo del modello on-demand, oppure devono aggiornare gli FPGA a qualcosa con memoria sufficiente per fare il lavoro (fondamentalmente stai prendendo in considerazione la semplice CPU/FSB high-clock/Architetture RAM a questo punto, che è ciò che sta dietro i cluster distribuiti petaflop multimilionari). In entrambi i casi, gli FPGA non sono più fattibili come per BCrypt (o PBKDF2).

26
KeithS

Con scrypt oltre ad aumentare il calcolo è possibile aumentare la quantità di memoria necessaria per calcolare l'hash. Ciò non disturba molto le implementazioni del software, ma è molto più difficile da implementare con l'hardware, il che è probabile che un utente malintenzionato dedicato sviluppi e usi. bcrypt (e PBKDF2) usano quantità costanti e piccole di memoria.

- Orip

Per https://stackoverflow.com/questions/1226513/whats-the-advantage-of-scrypt-over-bcrypt

10
Lucas Kauffman