bcrypt no está diseñado para este tipo de hashing del lado del cliente
Una propiedad clave de bcrypt es que, cuando se ejecutan dos veces independientes con el mismo texto sin formato, la mayoría de las implementaciones producirán hashes diferentes. Esto se debe al uso de una sal, que está diseñada para hacer que sea difícil ver si dos usuarios diferentes tienen la misma contraseña.
En contraste, los formularios de inicio de sesión necesitan recibir los mismos datos cada vez. Después de todo, ¿de qué otra manera verificarías que la contraseña que el usuario escribió hoy es la misma que escribió ayer?
Entonces, tiene un algoritmo diseñado para producir datos diferentes cada vez, y lo está introduciendo en una aplicación que necesita verificar que los datos son los mismos mismos hora. Probablemente sea una indicación de que el algoritmo no se está utilizando como se esperaba.
Lo que idealmente deberías estar haciendo es usar bcrypt para las contraseñas de hash en el servidor . Para eso se diseñó bcrypt: proteger las contraseñas de los usuarios en momentos en que el texto sin formato no está en la memoria, que es, con mucho, el estado más común (por ejemplo, los volcados de base de datos solo revelarán la contraseña con hash, no el texto sin formato, si se implementan correctamente). / p>
Personalmente también veo algo de valor en el hash del lado del cliente, porque ayuda a proteger contra los atacantes que pueden detectar el tráfico (o que tienen acceso al servidor). Sin embargo, no conozco una manera de hacer que el hash del lado del cliente sea tan seguro como el bcrypt del lado del servidor, razón por la cual aún debería usar el bcrypt del lado del servidor.
Si debe usar el lado del cliente de bcrypt, use un sal estático
Si VAS a usar bcrypt para el hashing del lado del cliente de un formulario de inicio de sesión, y quieres que sea un reemplazo directo para MD5, debes usar un sal estático. Especialmente si lo estás pasando a través de SHA1, ya que eso estropearía el bcrypt salt así como la propia información de hash.
Esto rompe varias suposiciones de diseño de bcrypt (por ejemplo, usar siempre una sal aleatoria), por supuesto.
Personalmente recomendaría usar el nombre de usuario como un salt (por lo que es difícil saber si dos usuarios diferentes tienen la misma contraseña); sin embargo, no conozco ninguna investigación que se haya hecho sobre la salazón en este contexto.
AES (o cualquier cifrado simétrico) aquí también es inútil
Tenga en cuenta que AES es un algoritmo simétrico, lo que significa que necesita la misma clave para descifrar y para cifrar los datos.
¿Qué significa esto para ti? Bueno, probablemente tenga su clave de cifrado en la fuente de JavaScript, que se entrega a cualquier cliente que visite su página de inicio de sesión. AES es un cifrado simétrico, por lo que su clave de cifrado (que es idéntica a la clave de descifrado) debe mantenerse privada. En otras palabras, su clave privada es conocida en todo el mundo : no proporciona seguridad en este punto.
Lo que debería usar en su lugar es criptografía de clave pública, como PGP o HTTPS (técnicamente, HTTPS utiliza un enfoque híbrido). En serio, simplemente use HTTPS , a menos que su organización se niegue a permitirle tener un certificado SSL, por alguna razón. Tenga en cuenta que PGP no protegerá realmente contra ataques MITM activos, pero al menos protegerá contra escuchas ilegales.