El hash en el servidor y el hash en el cliente mitigan diferentes ataques, por lo que uno debe considerar contra qué ataques necesita protegerse.
hashing del lado del servidor
El hash en el servidor mitiga el compromiso de las contraseñas almacenadas (por ejemplo, pérdida de base de datos). Si las contraseñas no se incluyen, un atacante exitoso tendrá acceso inmediato a las credenciales, lo que les permitirá acceder al servidor. Al almacenar contraseñas con hash, el atacante se ve obligado a realizar un esfuerzo adicional para recuperar las credenciales reales.
hashing del lado del cliente
El hash en el cliente mitiga los ataques en el canal entre el cliente y el servidor, así como en los componentes del servidor que procesan las credenciales sin procesar (componente de inicio de sesión, configuración de contraseña y componente de cambio). Al insertar la contraseña en el cliente, el atacante se ve obligado a realizar un esfuerzo adicional para recuperar la contraseña real. Sin embargo, tenga en cuenta que este hash es un texto sin formato equivalente: si un atacante captura el hash, puede usarlo para autenticarse en el servidor.
El valor aquí es proteger la contraseña que ingresó el usuario, ya que la mayoría de los usuarios usan la misma contraseña para otros servicios. Si bien la captura del texto sin formato equivalente pondría en peligro la cuenta del usuario en su servicio, no comprometería las cuentas del usuario en otros servicios. Obviamente, si todos los servicios utilizan este esquema, el mismo hash sería equivalente a un texto simple para otros sitios, por lo que se debe agregar aquí una sal única para el servicio.
Entonces, ¿qué debería hacer uno?
La primera clase de ataques definitivamente debe protegerse, ya que las fugas en la base de datos ocurren, y por lo tanto el hashing del lado del servidor es una necesidad. La segunda clase de ataques se mitiga en gran medida por el uso de TLS, por lo que el esfuerzo adicional para usar hashing del lado del cliente generalmente no vale la pena.
Hashes
Como han dicho otros, se desaconseja el uso de MD5 y SHA1. La familia de hashes SHA2 es segura en sí misma, pero no solo adecuada para el hashing de contraseñas porque están diseñadas para ser rápidas. Las contraseñas deben incluirse en un esquema diseñado específicamente para el hashing de contraseñas, como bcrypt , scrypt o PBKDF2 . Si uno de estos esquemas no es realmente una opción, la contraseña debe incluirse como salpicadura iterativa con un hash SHA2.
Otros enfoques
Hay esquemas como SRP que no almacenan la contraseña o el texto sin formato equivalente en el servidor, ni transmiten la contraseña o texto sin formato equivalente entre el cliente y el servidor.