JSON Web Token (JWT)

Recomendaciones

Algoritmos seguros

Utilizar algoritmos de firma robustos y seguros, como HS256 o RS256. Evitar el uso de none (ningún algoritmo) ya que no proporciona firma.

  • HS256 (HMAC con SHA-256): es un algoritmo simétrico que utiliza una clave secreta compartida entre las partes involucradas. Esta clave se utiliza tanto para generar la firma del JWT como para validarla.

  • RS256 (RSA con SHA-256): es un algoritmo asimétrico que utiliza un par de claves pública y privada. La entidad emisora del JWT posee una clave privada para generar la firma, mientras que el receptor del JWT utiliza la clave pública correspondiente para validar dicha firma.

Tanto el algoritmo HS256 como el algoritmo RS256 son capaces de verificar la integridad y garantizar la autenticidad del JWT. Sin embargo, en la actualidad se recomienda el uso de RS256 por su capacidad adicional de asegurar el no repudio.

  • Integridad: la firma de un JWT tiene como objetivo principal garantizar la autenticidad del token, es decir, asegurar que el contenido del JWT no ha sido modificado desde su generación por el emisor. Tanto HS256 como RS256 proporcionan esta garantía de autenticidad al verificar la integridad del token.

  • No repudio: la ventaja adicional que ofrece RS256 es la capacidad de asegurar el no repudio. Esto implica que solo el poseedor de la clave privada correspondiente puede generar la firma del JWT. Con RS256, se obtiene la certeza de que únicamente el titular de la clave privada puede firmar los tokens, evitando así que cualquier otra persona pueda falsificarlos.

Validación de firma

Asegúrate de que la aplicación realice una verificación completa y adecuada de la firma del token antes de confiar en su contenido.

No aceptar firmas arbitrarias

Las librerías que implementan el estándar JSON Web Token (JWT) generalmente ofrecen un par de métodos para realizar operaciones relacionadas con la verificación de los tokens. En particular, se suele proporcionar un método destinado a la validación de la firma del token y otro que únicamente se encarga de decodificarlo. Por ejemplo, la librería "jsonwebtoken" de Node.js, que dispone de las funciones verify() y decode().

En algunas ocasiones, es posible que los desarrolladores confundan el propósito de estos dos métodos y, erróneamente utilicen únicamente el método decode() para manejar los tokens entrantes. Este enfoque, en efecto, implica que la aplicación no realiza una verificación completa de la firma del token, comprometiendo así la seguridad de la aplicación.

No aceptar tokens sin firma

Los JSON Web Token (JWT) pueden ser firmados utilizando diversos algoritmos, pero también pueden ser dejados sin firmar. En el caso de no firmarse, el parámetro alg se establece como none (ningún algoritmo). Bajo esta configuración, cualquier token se considerará válido, aunque la firma se encuentre vacía. Debido a los evidentes riesgos que esto conlleva, se deben rechazar aquellos tokens que carezcan de firma.

Expiración y renovación

Establecer una fecha de expiración razonable para los tokens JWT y considerar la implementación de un mecanismo de renovación para obtener nuevos tokens después de su vencimiento. Esto ayuda a limitar el tiempo de vida de los tokens y mitigar el riesgo en caso de que sean comprometidos.

Minimizar la información sensible

Evitar incluir información sensible en el "payload" del token JWT, ya que los tokens son decodificables por cualquiera. Si se requiere transmitir información confidencial, se debe considera el uso de cifrado adicional.

Almacenamiento seguro de claves

Guardar de manera segura las claves utilizadas para firmar y verificar los tokens. Utilizar medidas como almacenamiento encriptado y restricciones de acceso adecuadas para proteger las claves.

Referencias

Última actualización

¿Te fue útil?