Al autenticar a un usuario en un sitio web, ¿la generación de hash y la comparación deben hacerse en la base de datos o en el sitio web?¿Cuál es la mejor práctica para dónde se debe realizar la comparación de contraseña?
Mi argumento es que el sitio web debe pasar la contraseña proporcionada por el usuario (posiblemente encriptada por el servidor web) a la base de datos. La base de datos luego vuelve a encriptarlo con la sal y compara los hash. La base de datos responde al servidor web si las credenciales del usuario son válidas o no. De esta forma, el mínimo deja la base de datos, esencialmente un sí o un no, ninguna de la información almacenada de las credenciales. Lo malo es que la base de datos tiene que hacer más trabajo.
El otro argumento es que el trabajo debe realizarse en el servidor web. Aquí, el servidor web crearía el hash y solicitaría el hash almacenado de la base de datos y lo compararía. En esta situación, la sal debe pasar de la base de datos al servidor web para que se cree el hash. pero el trabajo se comparte a medida que aumenta el número de servidores web.
Personalmente veo el segundo método como un posible riesgo de seguridad. En caso de comprometer el servidor web, se pueden solicitar sales y hash desde la base de datos y descifrarlo fácilmente.
¿Cuál es la mejor práctica para realizar la operación anterior? ¿Estoy pasando por alto/me estoy perdiendo algo?
Gracias
Supongo que simplifiqué el ejemplo pero aún podría incrustar el método de cifrado en la base de datos, por ejemplo, usar objetos clr en el servidor sql – Blootac
@Blootac Buen punto. He agregado una respuesta a la pregunta real con la suposición de que su base de datos tiene un algoritmo hash apropiado. – Ladadadada
Gracias, buena descripción de pros y contras. – Blootac