De esta pregunta , el OP propuso tomar la contraseña ingresada por un usuario, ejecutarla a través de BCrypt y luego ejecutar that a través de SHA256 para generar una clave derivada de contraseña de 256 bits. ( EDITAR: para aclarar, estas dos opciones se consideran que producen un solo valor de clave; el único propósito del hash de BCrypt "intermedio" es el hash con SHA-256 y no se usa para ningún otro propósito) . La alternativa obvia es simplemente conectar HMAC-SHA256 como el PRNG para el shell del algoritmo PBKDF2, con un número equivalente de rondas de derivación.
La pregunta es, ¿cuáles son las fortalezas y debilidades relativas aquí? Obviamente, ambos enfoques, correctamente implementados y configurados, presentarían una prueba significativa del trabajo a un atacante. La combinación BCrypt + SHA256 parece un poco más compleja, pero si tiene implementaciones ya hechas de estos dos y tendría que rodar su propia implementación PBKDF2 (el PBKDF2 integrado en .NET está codificado para usar SHA1, no SHA256), la primera La opción terminaría más sencilla. Veo una ventaja para PBKDF2 cuando se implementa con un HMAC de 256 bits; El hash de BCrypt real es solo de 192 bits, de modo que, y no de 256 bits, es la cantidad máxima de entropía inherente en el combo BCrypt + SHA256 en lugar de un máximo verdadero de 256 bits con PBKDF2-SHA256. BCrypt + SHA256 aún sería mejor que la implementación de BKDF2 de 160 bits de Rfc2898DeriveBytes en .NET, e incluso de 128 bits, producida al truncar o plegar XOR cualquiera de los hashes anteriores, es lo suficientemente segura con un buen modo AES AEAD. / p>
Opiniones?