Mientras iniciamos sesión en un sitio, es decir, Facebook / Google, ¿dónde se realiza la conversión hash? ¿El sistema cliente o el servidor?

Debe explicar qué “hash” está preguntando. Pero si habla de hashes de contraseñas, en la mayoría de los casos ocurre en el lado del servidor. El proceso de autenticación funciona más o menos así:

  1. Ingresas tu nombre de usuario y contraseña.
  2. Estos datos se envían en un cuerpo POST, idealmente a través de una conexión cifrada SSL.
  3. La cadena de “contraseña” se convierte en un hash utilizando una función hash. Esto puede ser un hash común o un hash salado o incluso una función de hash casero.
  4. La cadena convertida se compara con el hash almacenado en la tabla de usuario.
  5. Si es una coincidencia, el proceso se completa con éxito.

Hay algunas razones detrás de esto:

  • Si se usa una sal, hacer el hash del lado del cliente revelaría la sal, anulando por completo su ventaja.
  • Hay bloqueadores de anuncios y bloqueadores de secuencias de comandos que interferirían con el proceso de autenticación si se realizara en el lado del cliente.
  • Un atacante puede “Pasar el hash”, lo que nuevamente anulará todo el punto de usar un hash en primer lugar.

PD. Pasar el hash se refiere a ingresar el hash directamente en el mecanismo de autenticación en lugar de la contraseña real. Esto podría ser posible si el hash se realiza del lado del cliente. El objetivo de los hash es que un atacante no pueda usar el hash para autenticarse si lo tiene en sus manos de alguna manera.

En la mayoría de los casos, todo el hash se realiza en el servidor, porque el cliente es un navegador web que, en el mejor de los casos, puede hacer Javascript, y Javascript no es muy bueno en tareas criptográficas. El cliente envía la contraseña en sí (a través de HTTPS, por supuesto), y el servidor calcula el hash y lo compara con el valor de hash almacenado. El atacante no puede simplemente “pasar el hash”; debe enviar un valor que, cuando el servidor lo procesa, produce el valor hash almacenado.

De lo contrario, al menos parte del hash debe estar ocurriendo en el lado del servidor. De hecho, cualquier cosa que el cliente envíe al servidor otorga acceso, por lo que si ese mismo valor se almacena tal como está en el servidor, entonces tiene los mismos problemas que el almacenamiento de contraseña de texto sin formato, es decir, un solo vistazo de solo lectura en su servidor base de datos da todos los accesos.
La teoría bien explicada del hashing como primera línea de defensa se puede leer aquí.
¿Cómo hash de contraseñas de forma segura?