¿Sería viable encriptar un JWT firmado para asegurar la carga útil de los reclamos?

7

Estoy trabajando en una aplicación web servidor-cliente y, como esquema de autenticación, estoy emitiendo json web tokens . Considera el siguiente token ...

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Decodificado como tal ...

{
  "alg": "HS256",        // header
  "typ": "JWT"
},
{
  "sub": "1234567890",   // payload
  "name": "John Doe",
  "admin": true
},
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 'secret') // signature 

Mi preocupación es con la porción payload de este token, donde deseo proporcionar reclamos definidos, por ejemplo. %código%. Mi preocupación es que estos valores sean visibles y manipulados por el usuario final una vez emitidos. La modificación de esta parte no invalidará la comprobación de firma. No deseo conservar los datos en el servidor para volver a verificar / comparar los tokens emitidos. Deseo mantener el servidor completamente sin estado .

Pensé que tal vez firmaría el token, lo cifraría mediante AES 256 y lo usaría como mi "token". El flujo se resumiría como tal ...

  1. generar y firmar el token codificado en base64
  2. cifrar el lado del servidor de token a través de AES 256
  3. Emita token cifrado al cliente

  4. solicitud recibida, token encriptado suministrado

  5. descifrar el lado del servidor del token
  6. validar la firma del token original codificada en base64 (ahora puede garantizar que las reclamaciones no se hayan modificado)

Mi opinión es que las reclamaciones (carga útil) no se verán, y cualquier alteración de este valor cifrado obviamente no se descifra como se espera del servidor. Mi pregunta es: ¿es esto viable? No pude encontrar mucho en la web para cifrar tokens completos. ¿Hay una mejor manera ?

    
pregunta scniro 20.05.2016 - 23:08
fuente

1 respuesta

9

Creo que estás haciendo dos preguntas:

  1. ¿el cambio de carga invalida la firma: TL; DR: sí?
  2. si agrega cifrado a través de JWT, le otorga autenticidad del contenido: TL; DR: ¡no se cifre a sí mismo, use JWE!

Aquí están las respuestas con más detalle:

(1) De acuerdo con las especificaciones, enlace

la firma de un JWT firmado (JWS) se calcula sobre el encabezado protegido y la carga útil:

(consulte la sección 5.1. Firma del mensaje o Cálculo MAC)

Compute the JWS Signature in the manner defined for the
       particular algorithm being used over the JWS Signing Input
       ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' ||
       BASE64URL(JWS Payload)). 

Por lo tanto, cambiar la carga útil debería invalidar la firma.

(2) NO cifre su propio JWT !! Hay una especificación real que define cómo cifrar JWT (llamado JWE): enlace

JWE utiliza cifrado autenticado, lo que significa que el texto simple se cifra primero y luego se produce una comprobación de integridad sobre el texto cifrado. Puede obtener más información sobre el aspecto del texto sin formato en la Sección 5.1 de las Especificaciones anteriores.

Es posible almacenar de forma segura las políticas de acceso en la carga útil de su JWT si utiliza formatos encriptados o firmados. Es posible que desee utilizar el cifrado si no desea que el cliente u otras partes tengan conocimiento de los datos de la política. Si no le importa quién puede leerlo y solo le importa quién puede cambiar los valores, use firmas solamente.

Sin embargo, recuerde que cuanto más seguridad agregue, mayor será el impacto en el rendimiento, así que use su criterio sobre lo que se necesita.

Nota final: la administración de claves de la firma y las claves de cifrado también se convierten en un tema importante que debe considerar, porque al final del día, quien tenga acceso a las claves puede descifrar su JWE o modificar la firma de su JWS. Así que asegúrese de utilizar buenas prácticas de seguridad en el lugar donde almacena las claves reales, quién tiene acceso a ellas y cómo se utilizan y se guardan en la memoria.

    
respondido por el channel 20.06.2017 - 18:12
fuente

Lea otras preguntas en las etiquetas