Hashear contraseñas con una función hash segura y decente antes de introducirlas en bcrypt es una forma razonable y segura de mantener todo lo bueno de bcrypt y, además, admitir contraseñas de tamaño arbitrario.
Todavía quieres tener cuidado con algunos detalles prácticos. En particular, muchas implementaciones de bcrypt esperan una contraseña , es decir, una secuencia de caracteres, que termina con el primer byte de valor 0x00. La salida de SHA-512 es binaria y, por lo tanto, puede contener algunos bytes de valor 0x00. Por ejemplo, 1/25 de todas las contraseñas generará un valor de hash que comienza con un byte de valor 0x00, que una instancia de bcrypt basada en cadenas entenderá como equivalente a una contraseña vacía. Esto no es bueno ...
La solución es usar una codificación determinista de bytes a caracteres, por ejemplo. Base64 . Dado que esto implica una extensión de tamaño, SHA-512 ya no será adecuado (Base64 convierte 64 bytes en 88 caracteres, más que el límite de 72 de bcrypt). Por lo tanto, use SHA-256: la salida de 256 bits (32 bytes) será codificada por Base64 en 44 caracteres, y eso estará bien con bcrypt.
(El tamaño de salida de 512 bits de SHA-512 es un exceso excesivo de todos modos. SHA-256 es lo suficientemente bueno.)