¿Qué es la autenticación digest?


¿En qué se diferencia la Autenticación Digest de la Autenticación Básica que no sea el envío de credenciales como texto sin formato?

Author: SoftwareGeek, 2010-03-05

3 answers

La principal diferencia es que no requiere enviar el nombre de usuario y la contraseña a través del cable en texto plano. También es inmune a los ataques de repetición, ya que utiliza un número de una sola vez del servidor.

El servidor le da al cliente un número de uso único (un nonce) que combina con el nombre de usuario, el dominio, la contraseña y la solicitud de URI. El cliente ejecuta todos esos campos a través de un método de hash MD5 para producir una clave hash.

Envía esta clave hash al servidor junto con el nombre de usuario y el reino para intentar autenticarse.

Lado del servidor el mismo método se utiliza para generar un hashkey, solo que en lugar de usar la contraseña introducida en el navegador, el servidor busca la contraseña esperada para el usuario desde su BASE de datos de usuarios. Busca la contraseña almacenada para este nombre de usuario, se ejecuta a través del mismo algoritmo y lo compara con lo que el cliente envió. Si coinciden, entonces se concede el acceso, de lo contrario, puede enviar de vuelta un 401 No autorizado (sin inicio de sesión o inicio de sesión fallido) o un 403 Prohibido (acceso denegado).

La autenticación digest está estandarizada en RFC2617. Hay un buen resumen de esto en Wikipedia :

Puedes pensarlo así:

  1. El cliente hace una solicitud
  2. El cliente recupera un nonce del servidor y una solicitud de autenticación 401
  3. El cliente devuelve el siguiente array de respuesta (username, realm, generate_md5_key(nonce, username, realm, URI, password_given_by_user_to_browser)) (yea, eso es muy simplificado)
  4. El servidor toma username y realm (además conoce el URI que el cliente está solicitando) y busca la contraseña para ese username. Luego va y hace su propia versión de generate_md5_key (nonce, username, realm, URI, password_I_have_for_this_user_in_my_db)
  5. Compara la salida de generate_md5() que obtuvo con la que envió el cliente, si coinciden con la contraseña correcta que envió el cliente. Si no coinciden con la contraseña enviada fue Equivocada.
 125
Author: Ian C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-13 00:40:05

Se envía un hash de las credenciales a través del cable.

HA1 = MD5(username:realm:password)

Wikipedia tiene un excelente artículo sobre este tema

 10
Author: Philip Fourie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 02:47:23

La única forma de obtener el hash HA1 de las credenciales es conocer la contraseña. El servidor conoce HA1 pero no la contraseña que lo generó. Si HA1 era conocido por un atacante podría entrar en el sistema. Así que no se envía por el cable. Otro hash basado en nonce, etc. se hace antes de hacer esto, y esto debe estar de acuerdo con un cálculo similar hecho en el servidor. Por lo tanto, mientras el servidor mantenga HA1 privado, el sistema es seguro.

 1
Author: Chris Oakley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 14:27:18