Por construcción, bcrypt es su propia función, y no usa una función hash como SHA-1 o SHA-256. Puedes confundirlo con PBKDF2 .
Su requisito de "entropía" es, en el mejor de los casos , muy mal orientado:
-
Mientras sus atacantes no puedan convertir toda la masa de toda la Galaxia en energía para ejecutar un cálculo gigantesco, 256 bits de entropía son la Madre de todo Overkill. Para cualquier situación práctica que no implique luchar con entidades extraterrestres hostiles, 128 bits son más que suficientes.
-
No obtendrás 256 bits de entropía o incluso 128 bits. Usted dijo "bcrypt": por lo tanto, está procesando una contraseña . Una contraseña que puede ser elegida y recordada por un ser humano no puede alcanzar tanta entropía. Para los usuarios típicos, puede considerarse afortunado si alcanza, por ejemplo, 32 bits de entropía; la mayoría de la gente no puede hacer ni siquiera eso. No importa lo que haga y cuántas funciones hash le lancen, nunca obtendrá más entropía en la salida de lo que tenía para comenzar, siendo la entropía "lo que el atacante no sabe", es decir, la contraseña.
(El punto importante aquí es que la entropía no equivale a la longitud).
Lo que realmente quiere, aquí, es una función de procesamiento de contraseña que extiende una contraseña a tantos "bits clave" como sea necesario para cualquier propósito criptográfico que prevea. Por ejemplo, desea 256 bits porque hace un cifrado basado en contraseña y necesita 128 bits para el cifrado simétrico en sí mismo, y 128 bits más para un MAC. Esto se hace en dos pasos:
-
Hash la contraseña con una función de hashing de contraseña que incluye las características específicas de la protección de contraseña, que son formas de hacer frente a la debilidad inherente de las contraseñas. A saber, sales y lentitud configurable. Bcrypt está bien para eso. Consulte esta respuesta para obtener más información.
-
Amplíe el hash de la contraseña con una Función de derivación de claves . Si solo necesita 256 bits, entonces el hash del hash de contraseña con SHA-256 es perfectamente correcto: SHA-256 funciona bien como KDF siempre que no necesite más de 256 bits de salida. Para salidas arbitrariamente largas, es posible que necesite algo un poco más complejo; "función pseudoaleatoria" de SSL / TLS es un ejemplo bien estudiado.
Tenga en cuenta que las implementaciones típicas de bcrypt generan una cadena que codifica la salida de 192 bits pero también la sal y otros parámetros; para la extensión de clave, desea procesar solo la salida de 192 bits.
PBKDF2 es una "función de derivación de clave basada en contraseña" (de ahí el nombre) que combina ambas operaciones.