Da questa domanda , l'OP ha postato la password inserita dall'utente, eseguendola tramite BCrypt, quindi eseguendo tale tramite SHA256 per produrre una chiave derivata da password a 256 bit. ( EDIT: Per chiarire, queste due opzioni sono considerate come produrre un singolo valore chiave, l'hash "intermedio" di BCrypt hash deve essere hash con SHA-256 e non viene usato per altri scopi) . L'alternativa ovvia è semplicemente inserire HMAC-SHA256 come PRNG per la shell dell'algoritmo PBKDF2, con un numero equivalente di round di derivazione.
La domanda è: quali sono i punti di forza e di debolezza relativi qui? Ovviamente, entrambi gli approcci, correttamente implementati e configurati, presenterebbero una prova significativa del lavoro a un utente malintenzionato. La combinazione BCrypt + SHA256 sembra un po 'più complessa, ma se hai implementazioni già pronte di questi due e dovresti implementare la tua implementazione PBKDF2 (il PBKDF2 integrato in .NET è hardcoded per usare SHA1, non SHA256), il primo l'opzione finirebbe per essere più semplice. Vedo un vantaggio per PBKDF2 quando implementato con un HMAC a 256 bit; L'attuale hash BCrypt ha solo 192 bit, quindi, e non 256 bit, è la quantità massima di entropia inerente al combo BCrypt + SHA256 invece di un vero massimo di 256 bit con PBKDF2-SHA256. BCrypt + SHA256 sarebbe comunque migliore dell'implementazione Rfc2898DeriveBytes di PBFDF2 in .NET a 160 bit, e anche 128 bit, prodotto troncando o ripiegando XOR uno degli hash di cui sopra, è abbastanza sicuro con una buona modalità AES AEAD. / p>
Opinioni?