HTTP | JWT

JWT (JSON Web Token) típicamente consiste en un encabezado + carga útil + firma.

 

Cabecera

 

Contiene la información de metadatos sobre el JWT.

 


{
  "alg": "HS256",
  "typ": "JWT"
}

Puede encontrar más cabeceras, pero las anteriores siempre estarán presentes.

 

Carga útil

 

El payload contiene las claims del JWT. Las cabeceras estándar son las siguientes:

 


{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

 

Firma

 

La firma se crea utilizando el encabezado codificado, el payload codificado, un secreto y un algoritmo criptográfico.


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5M
DIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Algoritmos admitidos

Los siguientes algoritmos son compatibles con los componentes JWT de cliente y servidor.

 

 

Se requieren las bibliotecas OpenSSL para firmar y verificar el JWT, con una excepción.

 

ML-DSA, firmas poscuánticas

Los tres algoritmos ML-DSA son los algoritmos JOSE poscuánticos de RFC 9964, y son la excepción indicada arriba: están implementados en Object Pascal puro en el paquete sgcCrypto, de modo que firman y validan sin ninguna biblioteca OpenSSL presente. La firma es ML-DSA de FIPS 204 en el modo puro con un contexto vacío sobre la entrada de firma JWS, y se transporta en el token como base64url. El firmante es determinista, así que la misma clave y la misma entrada producen siempre la misma firma.

 

Los valores del enum son jwtMLDSA44, jwtMLDSA65 y jwtMLDSA87, y la cabecera alg que escriben es ML-DSA-44, ML-DSA-65 y ML-DSA-87. El cliente firma con JWTOptions.Algorithms.MLDSA.PrivateKey, una clave privada PEM en PKCS#8, y el servidor valida con JWTOptions.Algorithms.MLDSA.PublicKey, una clave pública PEM en SubjectPublicKeyInfo. El conjunto de parámetros de la clave tiene que ser el que nombra el algoritmo: en caso contrario firmar genera un error, y la validación devuelve False.

 

Las firmas son grandes. Una firma ML-DSA-44 ocupa 2420 bytes frente a los 64 de ES256, así que el token crece en torno a 3,2 KB de base64url, y una firma ML-DSA-87 lo hace crecer en torno a 6,2 KB. Compruebe los límites de tamaño de cabecera de todo aquello por lo que pasa el token antes de adoptarlo.

 

Las claves también se pueden transportar como JSON Web Keys de tipo AKP, RFC 9964 secciones 3 y 4. sgcMLDSA_ExportPublicJWK y sgcMLDSA_ExportPrivateJWK escriben una, sgcMLDSA_ImportJWK lee cualquiera de las dos formas, y sgcMLDSA_ImportJWKAsPEM convierte un JWK directamente en las cadenas PEM que leen los dos componentes. Un JWK privado almacena la semilla de 32 bytes en priv, la única forma privada que define la sección 4, así que una clave privada expandida no se puede escribir como JWK. Las cuatro funciones se declaran en sgcHTTP_JWT_MLDSA.

 

* Los algoritmos ML-DSA necesitan el paquete sgcCrypto. Sin él los valores del enum siguen existiendo, de modo que un formulario guardado con uno de ellos se sigue cargando, pero firmar genera un error y todo token ML-DSA se rechaza.

Componentes

 

 

 

* Los componentes JWT requieren al menos la versión 10.6.0.5169 de Indy o sgcWebSockets Enterprise Edition.