¿Se puede usar un JWT como token CSRF?

14

Necesito un token CSRF, para una aplicación determinada que envía un formulario con POST . Idealmente, me gustaría no realizar una llamada de base de datos para cada envío, para evitar el almacenamiento y el tráfico de base de datos y amp; estado latente. Para este fin, OWASP "CSRF Prevention Cheat Sheet" dice,

  

Overview

     

El Patrón de Token Encriptado aprovecha un método de encriptación, en lugar de una comparación, de validación de Token. Después de una autenticación exitosa, el servidor genera un token único que comprende la ID del usuario, un valor de marca de tiempo y un nonce, utilizando una clave única disponible solo en el servidor. Este token se devuelve al cliente y se incrusta en un campo oculto. […] Las solicitudes basadas en formularios no AJAX persistirán implícitamente el token en su campo oculto. Al recibir esta solicitud, el servidor lee y descifra el valor del token con la misma clave utilizada para crear el token. […]

     

Validación

     

En el desencriptado exitoso del token, el servidor tiene acceso a los valores analizados, idealmente en forma de reclamaciones.

La primera línea de "Validación" dice, para mí, como la definición misma de un JWT . Tampoco veo por qué la información en el token debe estar encriptada: parece que simplemente necesita ser autenticada de que proviene del servidor (a diferencia de un atacante que intenta falsificar un token CSRF).

¿Hay alguna razón en particular para cifrar tokens CSRF? Si no, ¿es suficiente un JWT?

Además, el patrón de token anterior incluye un nonce. ¿Cuál es el punto del nonce? (El objetivo de este patrón es no almacenar ningún servidor del estado. Si no estoy almacenando el estado, ¿cómo puedo usar el nonce durante la validación de cualquier manera material?)

Mi principal razón para buscar JWT aquí es que hay un soporte de biblioteca decente, probablemente los querré para su autenticación tarde o temprano, y en gran parte me mantiene alejado de la implementación de criptografía.

Mi comprensión de JWTs es que si tuviera JWTs para la autenticación completa de usuarios, podría almacenarlos en localStorage , y simplemente agregarlos a un campo con JS antes de enviar el formulario. Desafortunadamente, la aplicación utiliza autenticación basada en cookies, y no puedo cambiar ese aspecto en este momento.

    
pregunta Thanatos 25.02.2016 - 19:48
fuente

3 respuestas

10

No es necesario cifrar el token o incluir el nonce. Las propiedades clave de un token CSRF son que no es predecible por un atacante y, a diferencia de las cookies, que el navegador no las agrega a todas las solicitudes. Un JWT criptográficamente almacenado en un campo oculto cumple con estas dos propiedades.

Tenga en cuenta que necesita usar JWT que tengan datos únicos de usuario. Tener un JWT vacío o genérico que no sea específico para el usuario no le proporcionará seguridad.

    
respondido por el Neil Smithline 25.02.2016 - 20:41
fuente
18

TL; DR

Un JWT, si se usa sin cookies, niega la necesidad de un token CSRF - ¡PERO! al almacenar JWT en session / localStorage, puede exponer su JWT y la identidad del usuario si su sitio tiene una vulnerabilidad XSS (bastante común). Es mejor agregar una clave csrfToken al JWT y almacenar el JWT en una cookie con los atributos secure y http-only establecidos.

Lee este artículo con una buena descripción para más información enlace

  

Puede hacer que esta protección CSRF sea sin estado incluyendo un reclamo xsrfToken JWT:

     

{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["explorer", "solar-harvester", "seller"], "sub": "[email protected]", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }

Por lo tanto, deberá almacenar el csrfToken en local / sessionStorage así como dentro del JWT (que se almacena en una cookie segura y solo para http). Luego, para la protección de csrf, verifique que el token de csrf en el JWT coincida con el encabezado de token de csrf enviado.

    
respondido por el Scott Jungwirth 11.05.2016 - 19:38
fuente
1

Puede usar un JWT como token CSRF, pero sería innecesariamente complicado: un token CSRF no necesita contener ninguna reclamación, ni estar cifrado o firmado.

Probablemente hay un malentendido acerca de para qué se usan los tokens JWT o CSRF (al principio también estaba confundido). El JWT es un token de acceso, utilizado para la autenticación. El token CSRF, por otro lado, se usa para proteger al usuario de ser engañado para que envíe una solicitud autenticada falsificada. Esto es necesario cuando se utiliza una sesión o una autenticación básica HTTP o el almacenamiento de JWT en una cookie, cualquier autenticación que se realiza automáticamente mediante el navegador.

Si tiene dicho esquema de autenticación, asegúrese de que

  • use verbos HTTP apropiados (GET no debe tener efectos secundarios)
  • generar un nuevo token CSRF en cada solicitud
  • incluya el token CSRF en un encabezado o como un parámetro HTTP en cada solicitud de PATCH, POST, PUT y DELETE

Lea, por ejemplo, cómo Spring maneja CSRF .

    
respondido por el Dario Seidl 02.04.2018 - 00:07
fuente

Lea otras preguntas en las etiquetas