Scrypt dovrebbe essere "migliore" di bcrypt, ma è anche molto più recente, e questo è male (perché "più recente" implica implicitamente "ha ricevuto meno scrutinio").
Tutti questi schemi di hashing delle password cercano di rendere l'elaborazione di una singola password più costosa per l'attaccante , senza renderla troppo costosa per il tuo server . Poiché il server è, in pratica, un PC e l'utente malintenzionato può scegliere l'hardware più efficiente per la sua attività, gli schemi di hashing delle password tentano 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 la GPU. Bcrypt e scrypt richiedono entrambi RAM veloce , che è una risorsa scarsa in una GPU (una GPU può avere un sacco di RAM, ma non sarà in grado di accedervi contemporaneamente da tutti i core).
Accade così che il moderno FPGA incorpori 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 incremento utilizzando 1000 $ di FPGA anziché 1000 $ di PC generico. Questo è il tipo di spinta che vogliamo evitare. Quindi scrypt, che richiede molta più RAM; non troppo per un PC (stiamo parlando solo di un paio di megabyte qui), ma abbastanza per rendere la vita dura per un FPGA (vedi questa risposta per un trattamento dettagliato della domanda).
Quindi teoricamente , scrypt dovrebbe essere migliore di bcrypt. Tuttavia , questo è tutto soggetto al fatto che lo scrypt sia all'altezza delle sue promesse crittografiche. Questo tipo di garanzia di robustezza può essere raggiunta solo nel tempo: lo schema sarà considerato sicuro se sopravvive a anni di implacabili assalti dei crittografi. Quanto tempo è necessario, è ovviamente un po 'soggettivo, e dipende anche molto da esposizione (più uno schema è distribuito, più "interessante" diventa un bersaglio, in quanto spezzandolo aumenterebbe la fama accademica del perpetratore, attirando così più controllo). La mia regola generale è di aspettare circa 5 anni dopo la pubblicazione, quindi 2014 nel caso di scrypt.
C'è anche la domanda di disponibilità : se vuoi usare una funzione, allora hai bisogno di un'implementazione che possa essere inserita nel framework di programmazione che usi.