Si puede decodificar JWT ¿cómo son seguros?


Me encanta JWT, es muy divertido trabajar con él. Mi pregunta es, si consigo un JWT y puedo decodificar la carga útil, ¿cómo es eso seguro? ¿No podría simplemente tomar el token del encabezado, decodificar y cambiar la información del usuario en la carga útil y enviarlo de vuelta con el mismo secreto codificado correcto?

Sé que deben ser, solo que realmente me gusta entender las tecnologías. ¿Qué me estoy perdiendo? ¡Gracias!

Author: PixMach, 2014-12-04

5 answers

Los JWT pueden ser firmados, cifrados o ambos. Si un token está firmado, pero no cifrado, todos pueden leer el contenido del token, pero cuando no conoce la clave privada, no puede cambiarla. De lo contrario, el receptor notará que la firma ya no coincidirá.

Respuesta a su comentario: No estoy seguro de si entiendo su comentario de la manera correcta. Solo para estar seguro: ¿conoce y entiende las firmas digitales? Voy a explicar brevemente una variante (HMAC, que es simétrica, pero hay muchas otras).

Supongamos que Alice quiere enviar un JWT a Bob. Ambos saben un secreto compartido. Mallory no conoce ese secreto, pero quiere interferir y cambiar el JWT. Para evitar esto, Alice calcula Hash(payload + secret) y añade esto como firma.

Al recibir el mensaje, Bob también puede calcular Hash(payload + secret) para verificar si la firma coincide. Sin embargo, si Mallory cambia algo en el contenido, no puede calcular la firma coincidente (que sería Hash(newContent + secret)). Ella no conoce el secreto y no tiene forma de averiguarlo. Esto significa que si ella cambia algo, la firma ya no coincidirá, y Bob simplemente no aceptará el JWT más.

Supongamos que envío a otra persona el mensaje {"id":1} y lo firmo con Hash(content + secret). (+ es solo concatenación aquí). Uso la función Hash SHA256, y la firma que obtengo es: 330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8c. Ahora es tu turno: juega el papel de Mallory y trata de firmar el mensaje {"id":2}. No puedes porque no sé qué secreto usé. Si supongo que el destinatario conoce el secreto, puede calcular la firma de cualquier mensaje y comprobar si es correcto.

 215
Author: Misch,
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
2018-01-17 10:21:08

Puedes ir a jwt.io, pega tu token y lee el contenido. Esto es discordante para mucha gente inicialmente.

La respuesta corta es que JWT no se preocupa por el cifrado. Se preocupa por la validación. Es decir, ¿siempre puede obtener la respuesta para"Manipular el contenido de este token"? Esto significa que la manipulación por parte del usuario del token JWT es inútil porque el servidor lo conocerá y lo ignorará. El servidor agrega una firma basada en la carga útil cuando emitir un token al cliente. Más tarde verifica la carga útil y la firma correspondiente.

La pregunta lógica es ¿cuál es la motivación para no preocuparse por los contenidos cifrados?

  1. La razón más simple es porque asume que este es un problema resuelto en su mayor parte. Si se trata de un cliente como el navegador web, por ejemplo, puede almacenar los tokens JWT en una cookie que es secure + httpsOnly (no se puede leer con Javascript + no se puede leer con HTTP) y habla con el servidor a través de un canal cifrado (HTTPS). Una vez que sepa que tiene un canal seguro entre el servidor y el cliente, puede intercambiar JWT de forma segura o cualquier otra cosa que desee.

  2. Esto mantiene las cosas simples. Una implementación simple facilita la adopción, pero también permite que cada capa haga lo que mejor sabe hacer (dejar que HTTPS maneje el cifrado).

  3. JWT no está diseñado para almacenar datos confidenciales. Una vez que el servidor recibe el token JWT y lo valida, es libre de buscar el ID de usuario en su propio base de datos para obtener información adicional para ese usuario (como permisos, dirección postal, etc.). Esto mantiene a JWT pequeño en tamaño y evita fugas de información involuntarias porque todo el mundo sabe que no debe mantener datos confidenciales en JWT.

No es muy diferente de cómo funcionan las cookies. Las cookies a menudo contienen cargas útiles no cifradas. Si está utilizando HTTPS, entonces todo está bien. Si no lo está, entonces es recomendable cifrar las cookies sensibles. No hacerlo significará que un el ataque man-in-the-middle es posible a un servidor proxy o ISP lee las cookies y luego las reproduce más tarde pretendiendo ser usted. Por razones similares, JWT siempre debe intercambiarse a través de una capa segura como HTTPS.

 68
Author: aleemb,
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-02-22 09:24:29

El contenido de un token web json (JWT) no es inherentemente seguro, pero hay una función incorporada para verificar la autenticidad del token. Un JWT es tres hashes separados por puntos. La tercera es la firma. En un sistema de clave pública/privada, el emisor firma la firma del token con una clave privada que solo puede ser verificada por su clave pública correspondiente.

Es importante comprender la distinción entre emisor y verificador. El destinatario del token es responsable de verificándolo.

Hay dos pasos críticos para usar JWT de forma segura en una aplicación web: 1) enviarlos a través de un canal cifrado y 2) verificar la firma inmediatamente después de recibirla. La naturaleza asimétrica de la criptografía de clave pública hace posible la verificación de firmas JWT. Una clave pública verifica que un JWT haya sido firmado por su clave privada coincidente. Ninguna otra combinación de claves puede hacer esta verificación, evitando así los intentos de suplantación. Siga estos dos pasos y podemos garantizar with mathematical certainty the authenticity of a JWT.

Más información: ¿Cómo verifica una clave pública una firma?

 7
Author: ThisClark,
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-05-23 12:26:36

Solo el PrivateKey de JWT, que está en su servidor, descifrará el JWT cifrado. Aquellos que conocen el PrivateKey podrán descifrar el JWT cifrado.

Oculte el PrivateKey en una ubicación segura en su servidor y nunca le diga a nadie el PrivateKey.

 3
Author: sdfdsf sdf,
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-11-14 01:40:39

Los datos dentro de JWT están firmados y cifrados, no significa que sean seguros. JWT no garantiza los datos confidenciales.

Los datos se cifran utilizando una clave privada que es conocida por ambas partes, es decir, el remitente y el receptor, un intruso puede frenar la clave y puede cambiar el contenido.

Según tengo entendido, JWT no proporciona seguridad.

Gracias

 -7
Author: Naveen Kumar Madipally,
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
2018-01-17 09:33:18