rfc2617 example español auth autenticación digest-authentication

digest-authentication - español - php digest authentication example



¿Qué es la autenticación resumida? (3)

¿En qué se diferencia la Autenticación implícita de la Autenticación básica, aparte de enviar las credenciales como texto sin formato?


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 un atacante conocía HA1, podría ingresar al sistema. Entonces no se envía por el cable. Antes de hacer esto, se realiza un hash adicional basado en nonce, etc., y esto debe coincidir con un cálculo similar realizado en el servidor. Por lo tanto, siempre que el servidor mantenga HA1 privado, el sistema es seguro.


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 único del servidor.

El servidor le da al cliente un número de uso único (un nonce) que combina con el nombre de usuario, el territorio, 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 generar una clave hash.

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

En el lado del servidor, el mismo método se usa para generar una clave hash, solo que en lugar de usar la contraseña ingresada 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, se otorga el acceso, de lo contrario puede enviar un 401 no autorizado (sin inicio de sesión o un inicio de sesión fallido) o un 403 prohibido (acceso denegado).

La autenticación implícita está estandarizada en RFC2617 . Hay una buena descripción de esto en Wikipedia :

Puedes pensarlo así:

  1. El cliente hace una solicitud
  2. El cliente recibe una notificación del servidor y una solicitud de autenticación 401
  3. El cliente devuelve la siguiente matriz de respuestas (nombre de usuario, dominio, generate_md5_key (nonce, nombre de usuario, reino, URI, password_given_by_user_to_browser)) (sí, eso está muy simplificado)
  4. El servidor toma el nombre de usuario y el dominio (además, conoce el URI que el cliente está solicitando) y busca la contraseña para ese nombre de usuario. 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 enviada por el cliente, si coinciden, el cliente envió la contraseña correcta. Si no coinciden, la contraseña enviada fue incorrecta.