Al investigar sobre las mejores prácticas en las contraseñas de hash usando una sal, encontré un presentation en slideshare. El enfoque descrito es el siguiente
- El cliente solicita la página de inicio de sesión
- El código del lado del servidor genera un SALT aleatorio y envía el SALT de vuelta al cliente junto con el formulario de inicio de sesión
- El JavaScript del lado del cliente genera un hash de la contraseña ingresada por el usuario agregado a la sal (hashpwd + sal) llamada A y la envía a servidor junto con el nombre de usuario
- El código del lado del servidor recupera la contraseña hash para este usuario de la base de datos y la usa para generar un nuevo hash (hashpwd + salt), llamado B.
- El código del lado del servidor compara A y B y, si coinciden, el usuario está autenticado.
- La sal se destruye en el lado del servidor.
- La siguiente solicitud de inicio de sesión genera una nueva SALT que solo sobrevive para esa solicitud.
En este enfoque, las contraseñas se almacenan en la base de datos hash pero sin un salt. Entonces, si las contraseñas son robadas (como LinkedIn), ¿estoy en lo cierto al decir que este enfoque es inútil? Sin un hash, la contraseña se puede descifrar con relativa facilidad. ¿Qué protección ofrece este enfoque? Creo que previene los ataques de repetición al generar una nueva SALT y también hace que los ataques de fuerza bruta desde el front-end también sean imposibles. Me interesaría escuchar información sobre este enfoque y una buena lista de ventajas y desventajas del enfoque. No soy un experto en seguridad por cualquier tramo de la imaginación.