Seguridad API REST: HMAC / hashing de claves vs JWT

16

Acabo de leer este artículo que tiene algunos años pero describe una forma inteligente de asegurar sus API REST. Esencialmente:

  • Cada cliente tiene un par de claves públicas / privadas únicas
  • Solo el cliente y el servidor conocen la clave privada; nunca se envía por cable
  • Con cada solicitud, el cliente toma varias entradas (la solicitud completa en sí, la marca de tiempo actual y la clave privada) y las ejecuta a través de una función HMAC para producir un hash de la solicitud
  • El cliente luego envía la solicitud normal (que contiene la clave pública) y el hash al servidor
  • El servidor busca la clave privada del cliente (basada en la clave pública proporcionada) y realiza una comprobación de marca de tiempo (que ciertamente no entiendo) que verifica que la solicitud no sea víctima de un ataque de repetición
  • Si todo está bien, entonces el servidor usa la clave privada y la misma función HMAC para generar su propio hash de la solicitud
  • El servidor luego compara ambos hashes (el enviado por el cliente y el que generó); si coinciden, la solicitud se autentica y se le permite continuar

Luego me topé con JWT , que suena muy similar. Sin embargo, el primer artículo no menciona JWT en absoluto, por lo que me pregunto si JWT es diferente a la solución de autenticación anterior y, de ser así, cómo.

smeeb
fuente
1
Lol ... Solo quería hacer la misma pregunta exacta y encontré la tuya. Una de las primeras cosas que encontré sobre la autenticación sin estado fue de AWS: docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/… , e implementé algo como esto massimilianosciacco.com/… . Luego encontré JWS / JWT y es de alguna manera similar. Pero hasta donde yo entiendo, JWT es un estándar y las otras soluciones descritas anteriormente son algunas implementaciones personalizadas (no estandarizadas). Alguien me corrija si estoy equivocado.
nyxz
2
Es bueno saber que no soy el único preocupado por este tipo de detalles. JWT ciertamente se siente similar, y la ventaja es que está estandarizado. Me pregunto cómo funciona (en cuanto a seguridad) con esta solución HMAC personalizada.
smeeb

Respuestas:

7

Comencemos con una respuesta muy básica.

JWT (como se usa en el contexto de OAuth y OpenID) no requiere secretos compartidos entre el cliente y la API. Hay 3 componentes y pares de 2 comparten un secreto cada uno: cliente <-> servidor de identificación, servidor de identificación <-> API.

Esto mueve la mayor complejidad de la API al servidor de identificación, la API solo tiene que verificar que el token haya sido emitido por el servidor de identificación y no haya sido atemperado. Para verificar que la API verifique que la firma JWT sea válida con el secreto compartido único conocido entre el servidor de identificación y la API. ¡Eso es!

La forma en que el servidor de identificación valida la identidad del usuario puede variar ampliamente (en muchos casos es el antiguo par de nombre de usuario + contraseña a través de una conexión TLS), pero no tiene ningún efecto en su API.

TLS maneja la privacidad y seguridad del mensaje y el token en sí mismo al usar JWT, JWT ignora tales problemas.

Patricio
fuente