Secreto compartido cuando se utiliza JWT con un HMAC para la autenticación

7

Actualmente estoy implementando la autenticación de usuarios en una API similar a REST que utiliza un cliente de Android. Después de algunas investigaciones, creo que JWT (JSON Web Token) es una buena manera de hacerlo.

El procedimiento básico que he planeado es: El usuario inicia sesión con el nombre de usuario / contraseña (a través de HTTPS). El servidor valida la contraseña y luego genera un JWT que incluye algún tipo de ID de usuario, firmándola con RS256 (asimétrico usando RSA, por lo que el cliente solo tiene la clave pública correspondiente), y la envía al cliente. Para hacer una llamada a la API, el cliente enviará el JWT al servidor. Todo lo que el servidor hace entonces es validar el JWT usando su clave privada, y también verificar que el algoritmo de la firma sea el esperado por el servidor. Si la validación tiene éxito, el servidor puede confiar en la ID de usuario en el token. Un cliente no puede pretender ser un usuario diferente, ya que necesitaría la clave privada del servidor para generar una firma correcta si se cambia la carga útil del JWT.

Ahora supongamos que quisiera usar HS256 (simétrico usando un HMAC) en su lugar, tal vez porque la firma resultante es más corta. En lo que respecta a mi sentido común, en este caso, solo el servidor puede conocer la clave (única).

Pero aquí viene la confusión: leyendo sobre el uso de HS256 con JWT, algunos sitios que he visto parecen sugerir que la clave es un "secreto compartido", lo que significa que tanto el servidor como el cliente lo saben. Pero si ese es el caso, el cliente podría simplemente alterar la carga útil de JWT y crear una firma válida utilizando la clave compartida. Cualquier usuario que haya iniciado sesión podría pretender ser otro usuario simplemente modificando la ID de usuario en el JWT, por lo que no es mejor que no validar una firma en absoluto. ¿Hay algo que me falta o simplemente no tiene sentido permitir que el cliente acceda a la clave cuando utiliza el HS256? ¿He leído mal los sitios que sugieren que la clave HS256 está compartida?

La única forma en que podría pensar que permitiría a ambas partes saber que la clave es usar una clave separada para cada usuario. Pero incluso entonces, cualquier dato de carga útil de JWT, excepto el ID de usuario (por ejemplo, un indicador "isAdmin") aún podría cambiarse a voluntad.

    
pregunta Alemarius Nexus 25.01.2017 - 22:00
fuente

1 respuesta

4

"Secreto compartido" en este caso normalmente significa entre varios servidores, no entre el cliente y el servidor. Por lo general, los JWT se pueden hacer usando cifrado simétrico, en cuyo caso todos los servidores que necesitan verificar el token necesitan tener el secreto compartido o un cifrado asimétrico, en cuyo caso solo el servidor que realiza la autenticación debe tener la clave privada, el otros servidores solo pueden usar la clave pública para verificar que el token esté debidamente firmado.

En ningún caso, un cliente debe tener la capacidad de modificar su token: recibe el token al presentar las credenciales y luego lo usa para obtener servicios, ya sea del mismo servidor o de otros servidores que comparten una relación de confianza con el servidor de autorización (ya sea a través del conocimiento de la clave pública / privada o mediante una clave compartida)

    
respondido por el crovers 25.01.2017 - 22:09
fuente

Lea otras preguntas en las etiquetas