Técnicamente, PBKDF2 puede producir una salida larga arbitraria (es una Key Derivation Function ), pero tiene problemas para eso: PBKDF2 usa HMAC sobre alguna función hash, que tiene una longitud de salida k bits (por ejemplo, k = 160 para el SHA-1 habitual). Si solicita más resultados que ese tamaño, entonces el costo computacional aumenta rápidamente: si desea 320 bits, costará el doble que 160 bits.
Desafortunadamente, aunque PBKDF2 está "fortalecido" para evitar los ataques de diccionario, el costo del atacante no aumentará tan rápido. Considere, por ejemplo, que utiliza PBKDF2 / SHA-1 para producir 256 bits de material clave: 128 bits para cifrado simétrico, y luego 128 bits para un MAC. Como defensor (el usuario normal) debes obtener tus 256 bits completos. El atacante, por otro lado, no necesita tanto; simplemente puede producir los primeros 128 bits, a la mitad del costo , y ver si el descifrado produce datos no basura.
Este es un problema conocido con PBKDF2. Tenga en cuenta que el mismo problema aparecería si utilizara otra función de hashing de contraseña dos veces, con dos sales diferentes: pagará el hashing dos veces, pero el atacante puede ignorar una de las claves y, por lo tanto, será dos veces más rápido que usted.
Si prefiere usar bcrypt, entonces se encuentra con otro problema, que es que bcrypt no es un KDF; Su tamaño de salida es de 192 bits. No más. Su tiempo de procesamiento no depende de su tamaño de salida, porque su tamaño de salida es fijo.
El método genérico es ejecutar una función de hash de contraseña y luego expandir la salida con un Key Derivation Function . Eso es lo que sugiere @CodesInChaos, con HKDF-Expand . Hay varios KDF por ahí; Normalmente, para mis propios diseños / propuestas, confío en HMAC_DRBG, de NIST SP800-90 y X9.62 (por ejemplo, en este ). Idealmente, desea un KDF que esté bien revisado, es decir, que haya sido investigado por criptógrafos, y no encontraron nada malo que decir al respecto (o, mejor aún, produjeron "pruebas de seguridad").
Si tiene prisa y no necesita mucho de material clave, un método relativamente más simple es codificar la salida de la función de hashing de contraseña con SHA-512. Esto le dará 512 bits de material clave.