Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

339
Vistas
¿Es seguro almacenar datos confidenciales en JWT Payload?

Actualmente estoy aprendiendo la implementación de JWT con PHP y quiero usar tokens JWT en lugar de sesiones para mi aplicación RESTful.

Durante la creación de la firma, estoy haciendo algo como esto

 token = base64Header + '.' + base64Payload + '.' + signature

Aquí solo estamos usando base64 el Payload. Si pego en sitios como https://jwt.io/#debugger , la carga útil se descifra (incluso si la firma es incorrecta).

Mis preguntas,

  1. ¿JWT es solo para verificar la firma con el servidor al enviar datos?
  2. ¿Es inseguro mantener datos confidenciales en Payload?
  3. Si no es seguro, ¿alguna forma de asegurar la carga útil?

A continuación se muestra el código de muestra que escribí

 <?php $headers = base64_encode(json_encode([ "typ" => "JWT", "alg" => "HS256" ])); $claims = base64_encode(json_encode([ "sub" => "1234567890", "name" => "John Doe", "admin" => true, "jti" => "870a3de5-ea7b-4062-abef-11180e530f5a", "iat" => 1492603378, "exp" => 1492606978 ])); $payload = $headers.".".$claims; $signature = base64_encode(hash_hmac("sha256", $payload, 'secret', true)); $encodedJWT = $payload.".".$signature; // eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg3MGEzZGU1LWVhN2ItNDA2Mi1hYmVmLTExMTgwZTUzMGY1YSIsImlhdCI6MTQ5MjYwMzM3OCwiZXhwIjoxNDkyNjA2OTc4fQ.nvw-bAUgr7H_xr3q8_Yz8rCNtMohtn2YlCmcLoLBWlc
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Si pego en sitios como https://jwt.io/#debugger , la carga útil se descifra (incluso si la firma es incorrecta).

Los terceros no pueden verificar la firma porque no tienen la clave secreta. La carga útil no se descifra, se decodifica.

Idealmente, no debe almacenar datos confidenciales en la carga útil, ya que la carga útil solo está codificada en base64 y no está cifrada. Esto significa que cualquiera que obtenga el token puede ver el contenido de la carga útil simplemente decodificándolo en base64.

Si tiene un token en el almacenamiento local de un navegador web y su sitio tiene una vulnerabilidad XSS, es trivial robar el token. Ya es bastante malo que el atacante tenga un JWT válido (que, con suerte, caducará pronto de todos modos), pero si contiene datos confidenciales, entonces está en un verdadero problema. Imagine tener que notificar a todos los usuarios de su sitio que ahora deben cambiar varios fragmentos de datos confidenciales sobre ellos mismos debido a un posible compromiso masivo.

Mantenga el JWT liviano. Almacene la identificación de los usuarios, sus roles/concesiones dentro del sistema. Si siente que tiene que agregar datos confidenciales a la carga útil, intente reconsiderar su solución.

about 4 years ago · Santiago Trujillo Denunciar

0

  1. ¿JWT es solo para verificar la firma con el servidor al enviar datos?

No, no solo hay JWT firmado (JWS - RFC 7515) , sino también JWT encriptado (JWE - RFC 7516) .

  1. ¿Es inseguro mantener datos confidenciales en Payload?

Cuando un JWT está encriptado, puede compartir datos confidenciales de forma segura (a menos que el algoritmo o la clave estén comprometidos).

Pero en su ejemplo, no veo datos confidenciales, por lo que me pregunto si es realmente importante usar JWE en su caso. Le recomiendo que lea esta publicación de blog sobre JWT y las sesiones y por qué no debería usarlos para ese propósito (también eche un vistazo a esa parte 2 ).

Si realmente desea usar JWE, escribí una biblioteca PHP que ya puede cargar y crear cualquier tipo de José (JWS/JWE) y que admite casi todos los algoritmos del RFC 7518 de fábrica. Es posible que existan otras bibliotecas, pero no hay una lista de referencias ( https://jwt.io/ enumera solo las implementaciones de JWS).

about 4 years ago · Santiago Trujillo Denunciar

0

Como entendí, está tratando de tener un servidor stateless completo, por lo que desea almacenar incluso datos confidenciales dentro del token.

Pero su servidor no puede ser completamente apátrida. Porque para la funcionalidad de cierre de sesión, debe tener una lista negra o una lista blanca para invalidar el token. Así que en cada solicitud debes tocar la base de datos . Si no tiene una lista negra o una lista blanca , los tokens siguen siendo válidos incluso cuando el usuario cierra la sesión.

Por lo tanto, es mejor obtener los datos confidenciales de la base de datos, ya que debe tocar su base de datos por cada solicitud.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda