JWT (JSON Web Token) típicamente consiste en un encabezado + carga útil + firma.
Cabecera
Contiene la información de metadatos sobre el JWT.
alg: el algoritmo utilizado para firmar el token.
typ: el tipo del token, siempre 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:
iss: el emisor: la entidad que genera y emite el JWT.
sub: el sujeto, la entidad identificada por este token.
aud: la audiencia, el público objetivo de este JWT.
exp: la expiración; la marca de tiempo en formato UNIX a partir de la cual el token no debe aceptarse.
iat: emitido en (issued at), especifica la fecha en que se emitió el token.
{
"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.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
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.
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.
TsgcHTTP_JWT_Client: Cliente JWT que le permite codificar y firmar JWT y enviarlo como encabezado de autorización en los protocolos HTTP y WebSocket.
TsgcHTTP_JWT_Server: servidor JWT que permite decodificar y validar el JWT recibido como cabecera de autorización en los protocolos HTTP y WebSocket.
* Los componentes JWT requieren al menos la versión 10.6.0.5169 de Indy o sgcWebSockets Enterprise Edition.