Originalmente pregunté esto en stackoverflow , pero debido a la falta de tracción y una recomendación de un usuario allí, también lo he pedido aquí.
Imagine un escenario en el que una aplicación cliente está enviando una contraseña a un servidor backend para que el servidor pueda validar que el usuario ingresó la contraseña correcta cuando se compara con una variación almacenada de la contraseña.
El mecanismo de transporte es HTTPS con el servidor que proporciona HSTS & HPKP para el agente de usuario y los cifrados criptográficos fuertes son preferidos por el servidor que puntúa A + en la prueba de laboratorio de SSL. No obstante, es posible que deseamos evitar el envío de la contraseña original provista por el usuario al servidor desde el agente del usuario. En su lugar, quizás enviemos un hash después de varias rondas de SHA-256 en el cliente.
En el lado del servidor, para el almacenamiento de contraseñas estamos usando bcrypt con un gran número de rondas.
Desde un punto de vista criptográfico, ¿hay alguna desventaja de realizar bcrypt en el valor hash ya sha-256 en lugar de hacerlo directamente en la contraseña de texto sin formato? ¿La naturaleza de longitud fija del texto de entrada al usar hashes de alguna manera socava las fortalezas del algoritmo?
No pregunto sobre el rendimiento, como la memoria, la CPU, los requisitos de almacenamiento o el tiempo de reloj de pared requerido para calcular, almacenar, enviar o comparar valores. Estoy totalmente interesado en saber si aplicar un hash antes de aplicar bcrypt podría debilitar la fortaleza de bcrypt en el caso de una divulgación de la lista completa de valores almacenados.
He leído publicaciones this (que me parece interesante y útil) pero no estoy preguntando específicamente si es una buena idea hacer hash en el lado del cliente. Estoy más interesado en hacer así podría de alguna manera debilitar el sistema de almacenamiento de contraseñas con bcrypt, dado que un atacante armado con este conocimiento sabría que todos los valores almacenados son un derivado de una longitud fija fija de entradas que consiste en un rango mucho menor de caracteres posibles (SHA-256)