¿Este sistema de autenticación del servicio REST es seguro?

2

Tengo que implementar una autenticación basada en token para un servicio web RESTful. Esta es la primera vez que estoy implementando funciones de seguridad en un software, y esto es lo que tengo en mente por ahora:

  1. El cliente primero se autentica a través de un formulario de inicio de sesión (en la aplicación cliente) con su correo electrónico y contraseña.
  2. Si la autenticación tiene éxito, el usuario obtendrá en una respuesta una clave privada (generada aleatoriamente) y un token (cadena: ¿generada aleatoriamente?). El servidor almacenará en la base de datos (¿o tal vez un caché?) Una tupla con los siguientes campos (correo electrónico, clave privada, hashedToken, caducidad del token), donde hashedToken es el valor del HMAC calculado sobre el token, con la clave privada .
  3. El cliente almacena la clave privada recibida y el token (en la memoria).
  4. Para cada solicitud futura, el cliente incluirá en un encabezado personalizado (es decir, authToken) el valor del HMAC calculado sobre el token, codificado con la clave privada y el correo electrónico del usuario (en otro encabezado) y reemplazará el token almacenado en memoria con el token recién generado.
  5. Cuando el servidor recibe la solicitud, comprueba si la tupla calcula la dirección de correo electrónico, comprueba si el token almacenado y el token recibido son iguales y si el token no ha caducado. Si está bien, el servidor actualiza la fecha de caducidad de la tupla y el campo hashedToken se establece en el valor de HMAC calculado sobre el token anterior, con la clave privada. el servidor procesa la solicitud (no se incluyen encabezados de autenticación adicionales ni información incluida en la respuesta)

Los pasos 1 y 2 utilizarán HTTPS. Otras solicitudes serán enviadas por HTTP, ya que se genera un nuevo token después de cada solicitud exitosa (oler el token sería inútil para un atacante, creo).

Me gustaría saber cuáles son los problemas con este protocolo de autenticación y cómo podría mejorarse.

Además, ¿este enfoque sería más rápido que simplemente incluir el correo electrónico y la contraseña en un encabezado en cada solicitud y usar HTTPS?

    
pregunta Sbiera Bogdan 26.08.2013 - 10:41
fuente

2 respuestas

2

La respuesta básica es: simplemente use HTTPS y autenticación básica . Esto es mucho más simple. La sobrecarga de HTTPS es leve:

  • Un par de viajes de ida y vuelta adicionales cuando se establece una nueva conexión. Pero las conexiones se mantienen activas entre el cliente y el servidor, y se cierran solo cuando no se usan durante demasiado tiempo, por lo que esto no debería importar mucho. De hecho, una solución de HTTPS puro podría ser más rápida que su combinación de HTTPS / HTTP porque podría funcionar en una sola conexión para todo el procedimiento.

  • Algunos gastos generales de red, aproximadamente 0.2% para datos en masa (encabezado y relleno de registro SSL y MAC); una vez más, esto difícilmente aparecerá en las medidas, y mucho menos en la materia.

  • Algunos gastos generales de CPU, pero mucho menos de lo que generalmente se supone. Un núcleo de CPU básico puede cifrar y descifrar datos a más de 100 MB / s, incluso sin utilizar AES-NI .

Si do desea utilizar HTTP (después de una fase HTTPS inicial), debe tener en cuenta los problemas de confidencialidad e integridad. Sus juegos HMAC pueden ayudar con la integridad, pero evitarán ataques de repetición solo mientras el servidor recuerda el último "valor de token" (o hash del mismo). Esto es estado y contradice el punto de REST .

    
respondido por el Tom Leek 26.08.2013 - 16:48
fuente
0

Este enfoque es vulnerable a los atacantes de Man In The Middle.

Un atacante permitirá que se complete la fase inicial de HTTPS, luego cada solicitud interceptada por el atacante podría robar un token válido si la solicitud no se reenvía al servidor legítimo.

Debería usar el contenido de la solicitud REST cuando calcula el HMAC para evitar dar token no restringido al atacante.

    
respondido por el majinboo 26.08.2013 - 19:12
fuente

Lea otras preguntas en las etiquetas