Per quanto riguarda PBKDF2 vs bcrypt: bcrypt è più difficile da attaccare tramite hardware dedicato, quindi dovrebbe essere significativamente più strong. È possibile che bcrypt abbia problemi, ma si basa su una funzione ben nota e non sembra avere problemi nei 13 anni in cui è stato intorno.
PBKDF2 è uno standard con più controllo, ma è anche molto più facile da attaccare tramite hardware dedicato, in modo da poter dimostrare che la sua sicurezza è conosciuta per essere infranta in modo tale che bcrypt isn ' t (ancora).
Allo stesso modo, bcrypt è molto più facile da attaccare tramite hardware dedicato piuttosto che scrypt. La differenza è che lo scrypt è stato presentato 3 anni fa, rispetto a 13 per bcrypt.
Inoltre, scrypt è apparentemente considerato uno standard IETF , quindi spero che sia Presto un esame molto più approfondito.
Per quanto riguarda la necessità di concatenare due funzioni, queste domande rispondilo meglio di quanto potrei (il secondo riguarda bcrypt + PBKDF2 ma non importa quali siano le funzioni in questione):
So you do not get something stronger that way; instead, you get a security level which is an average of what you would have got with Bcrypt alone, or with PBKDF2 alone.
Combining two hash functions or similar functions together is good to avoid a catastrophic failure, if one turns out to be broken; but, assuming that both Bcrypt and PBKDF2 are strong, and the question is mostly about performance (both bcrypt and PBKDF2 are about making exhaustive search slower, so this is all about performance). For optimal slowness, combining bcrypt and PBKDF2 is not a good idea.
Vale la pena notare che "il fallimento catastrofico" sembra piuttosto improbabile. Voglio dire - MD5 è noto per essere rotto, ma PBKDF2 usando MD5 è ancora "abbastanza buono". Certo è troppo veloce, ma puoi attivare le iterazioni. Certo, non è buono per la resistenza alle collisioni, ma è improbabile che si tratti di un problema con password di lunghezza ragionevole (meno di un centinaio di caratteri).