Me preocupa el uso de bcrypt para la generación de contraseñas del lado del cliente. Estoy desarrollando una función de generación de contraseña para ser utilizada en el lado del cliente, similar a PwdHash y PasswordMaker.
Mucho se ha dicho acerca de la ventaja de usar bcrypt sobre funciones hash más rápidas porque ralentiza los ataques de fuerza bruta. Sé que bcrypt usa Blowfish internamente, que es un algoritmo de cifrado simétrico en lugar de un algoritmo hash. Por lo tanto, debe haber una clave codificada en algún lugar para usar bcrypt, y dado que se está utilizando Blowfish, es lógico que si se descubre la clave, la derivación de la contraseña se puede invertir y la contraseña original.
Dado que el código del lado del cliente se puede descompilar, la clave se puede descubrir fácilmente, haciendo que bcrypt no sea seguro para usar del lado del cliente. ¿Mi razonamiento es correcto o me he perdido algo?
Además, en una pregunta relacionada, el mismo argumento no sería válido también en el lado del servidor. Una función hash no se puede revertir, pero una función de cifrado puede ser si se conoce la clave. ¿No sería más seguro utilizar un servidor hash real, incluso si es más rápido y, por lo tanto, más susceptible al ataque de fuerza bruta que a usar bcrypt, que es reversible?
EDITAR: usuario10008 señala a continuación (se ha eliminado la publicación) que solo se utilizan partes de Blowfish en bcrypt y me dio un enlace. Cuando seguí un enlace, encontré un prototipo de función que incluye clave como último argumento. Así que todavía veo la clave que se usa para poner en marcha el algoritmo bcrypt. Si se requiere la clave y bcrypt utiliza cifrado simétrico en lugar de hash, ¿no es reversible la operación?
EDITAR: Buenas respuestas de martinstoeckli y user10008. Le di la respuesta a marginstoeckli debido a la última oración de la respuesta:
BCrypt se puede ver como encriptación con la eliminación de la clave.
Esto realmente se aclaró. para mi Básicamente, pasamos por 2 fases
P - > K; P, K - > C
y luego deseche la clave K, dejando el cyphertext C. Debido a que desechamos la clave K, no podemos descifrar al texto simple P. Desechar K hace que bcrypt sea una función unidireccional.
EDITAR: Del usuario 10008, los pasos que he dado anteriormente son más complejos, sin embargo, la esencia es que la tecla K se usa en la fase final y se descarta. Gracias usuario10008.