Tecnicamente, PBKDF2 può produrre un output lungo arbitrario (è una Funzione di derivazione chiave ), ma presenta problemi: PBKDF2 utilizza HMAC su una funzione hash, che ha lunghezza di output k bit (ad es. k = 160 per il solito SHA-1). Se chiedi più output di quella dimensione, allora il costo computazionale aumenta rapidamente: se vuoi 320 bit, costerà il doppio di 160 bit.
Sfortunatamente, sebbene il PBKDF2 sia "rafforzato" per scoraggiare gli attacchi del dizionario, il costo dell'attaccante non aumenterà più velocemente. Si consideri ad esempio che si usi PBKDF2 / SHA-1 per produrre 256 bit di materiale chiave: 128 bit per la crittografia simmetrica, quindi 128 bit per un MAC. Come difensore (l'utente normale) devi ottenere tutti i 256 bit. L'attaccante, d'altra parte, non ha bisogno di tanto; può semplicemente produrre i primi 128 bit, a metà del costo , e vedere se la decifrazione produce dati non spazzatura.
Questo è un problema noto con PBKDF2. Si noti che lo stesso problema si presenterebbe se si utilizzava un'altra funzione di hashing della password due volte, con due diversi sali: si paga per l'hashing due volte, ma l'attaccante può ignorare una delle chiavi e quindi sarà due volte più veloce di te.
Se preferisci usare bcrypt, allora ti imbatti in un altro problema, che è che bcrypt non è un KDF; la sua dimensione di uscita è di 192 bit. Non piu. Il tempo di elaborazione non dipende dalla sua dimensione di output, poiché la sua dimensione di output è fissa.
Il metodo generico è eseguire una funzione di hashing della password, quindi espandi l'output con Funzione di derivazione chiave . Questo è ciò che @CodesInChaos suggerisce, con HKDF-Expand . Ci sono diversi KDF là fuori; di solito, per i miei progetti / proposte, faccio affidamento su HMAC_DRBG, da NIST SP800-90 e X9.62 (ad esempio in questo ). Idealmente, vuoi un KDF che sia ben controllato, cioè che sia stato investigato dai crittografi, e non hanno trovato nulla di negativo da dire (o, ancora meglio, hanno prodotto "prove di sicurezza").
Se sei di fretta e non hai bisogno di molto di materiale chiave, un metodo relativamente più semplice è quello di hash l'output della funzione di hash della password con SHA-512. Ciò ti darà 512 bit di materiale chiave.