Estaba leyendo aquí en Hashes and Salts y pensé en otro método para realizar la autenticación de usuario. Necesito tus pensamientos sobre esto ya que podría estar pasando por alto algo.
Escenario:
Para la autenticación de aplicaciones web, la tendencia general es aplicar hash a la contraseña agregando un salt aleatorio, con una función hash fuerte. La sal aleatoria y el hash generado se almacenan en la base de datos. Más tarde, cuando el usuario desea autenticarse, el usuario ingresó la contraseña nuevamente con el sal almacenado y el hash generado se compara con el hash previamente almacenado.
Ahora sobre mi método:
- Almacenamos un texto secreto maestro (siempre que sea necesario) en nuestra base de datos y usamos sal única por usuario.
- En lugar de almacenar el hash de contraseña, ciframos simétricamente (hash (master secret + salt)) usando la contraseña del usuario como clave y almacenamos este valor cifrado en nuestra base de datos.
- Cuando el usuario quiera autenticarse, este valor cifrado previamente almacenado se descifrará utilizando la contraseña del usuario como clave y obtendremos un hash (maestro secreto + sal). Este hash descifrado se comparará con el hash recién calculado (maestro secreto + sal)
- Si el usuario ingresa una contraseña incorrecta, el descifrado fallará y obtendremos un hash incorrecto que no se comparará con el hash (maestro secreto + sal)
De esta manera, no almacenamos la contraseña del usuario en la base de datos de ninguna forma (texto sin formato, hash, cifrado). Quiero saber cómo se compara este método con nuestro método habitual de hash de contraseñas.