Per costruzione, bcrypt è una sua funzione e non usa una funzione di hash come SHA-1 o SHA-256. Potresti confonderlo con PBKDF2 .
Il tuo requisito su "entropia" è, nella migliore delle ipotesi , gravemente fuorviato:
-
Fintanto che i tuoi attaccanti non possono convertire l'intera massa della galassia completa in energia per eseguire calcoli giganteschi, 256 bit di entropia sono la Madre di tutti gli Overkill. Per qualsiasi situazione pratica che non coinvolga la battaglia con entità extraterrestri ostili, 128 bit sono più che sufficienti.
-
Non otterrai 256 bit di entropia o addirittura 128 bit. Hai detto "bcrypt": quindi stai elaborando una password . Una password che può essere scelta e ricordata da un essere umano non può raggiungere molta entropia. Per gli utenti tipici, puoi considerarti fortunato se raggiungi, diciamo, 32 bit di entropia; la maggior parte delle persone non può fare neanche questo. A prescindere da ciò che fai e da quante funzioni di hash lo fai, non otterrai mai più entropia sull'output di quanto dovessi iniziare, entropia essere "ciò che l'hacker non sa", cioè la password.
(Il punto importante qui è che l'entropia non equivale alla lunghezza.)
Ciò che desideri veramente , qui, è una funzione di elaborazione della password che estende una password in tanti "bit chiave" di cui hai bisogno per qualunque scopo crittografico tu immagini. Ad esempio, si desidera 256 bit perché si esegue la crittografia basata su password e sono necessari 128 bit per la crittografia simmetrica stessa e 128 bit in più per un MAC. Questo viene fatto in due passaggi:
-
Hash la password con una funzione di hashing della password che include le funzionalità specifiche per la protezione tramite password, che sono modi per far fronte alla debolezza intrinseca delle password. Vale a dire, sali e lentezza configurabile. Bcrypt va bene per quello. Vedi questa risposta per i dettagli.
-
Estendi l'hash della password con una funzione deterministica Key Derivation . Se hai solo bisogno di 256 bit, l'hash della password con SHA-256 è perfettamente a posto: SHA-256 funziona bene come un KDF se non hai bisogno di più di 256 bit di output. Per uscite arbitrariamente lunghe, potresti aver bisogno di qualcosa di un po 'più complesso; La "funzione pseudocasuale" di SSL / TLS è un esempio accuratamente studiato.
Attenzione alle tipiche implementazioni di bcrypt che generano una stringa che codifica l'output a 192-bit ma anche il sale e altri parametri; per l'estensione della chiave, si desidera elaborare solo l'output a 192 bit.
PBKDF2 è una "funzione di derivazione della chiave basata su password" (da cui il nome) che combina entrambe le operazioni.