HTTP | JWT

O JWT (JSON Web Token) normalmente consiste em header + payload + signature.

 

Header

 

Contém as informações de metadados sobre o JWT.

 


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

Você pode encontrar mais cabeçalhos, mas os anteriores estarão sempre presentes.

 

Payload

 

O payload contém as claims do JWT. Os cabeçalhos padrão são os seguintes:

 


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

 

Assinatura

 

A assinatura é criada utilizando o Header Codificado, o Payload Codificado, um Secret e um Algoritmo Criptográfico.


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5M
DIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Algoritmos suportados

Os algoritmos a seguir são suportados tanto pelos componentes JWT de Cliente quanto de Servidor.

 

 

As bibliotecas OpenSSL são necessárias para assinar e verificar o JWT, com uma exceção.

 

ML-DSA, assinaturas pós-quânticas

Os três algoritmos ML-DSA são os algoritmos JOSE pós-quânticos da RFC 9964, e são a exceção citada acima: eles são implementados em Object Pascal puro no pacote sgcCrypto, portanto assinam e validam sem nenhuma biblioteca OpenSSL presente. A assinatura é ML-DSA da FIPS 204 no modo puro com um contexto vazio sobre a entrada de assinatura JWS, transportada no token em base64url. O assinador é determinístico, portanto a mesma chave e a mesma entrada sempre produzem a mesma assinatura.

 

Os valores do enum são jwtMLDSA44, jwtMLDSA65 e jwtMLDSA87, e o header alg que eles escrevem é ML-DSA-44, ML-DSA-65 e ML-DSA-87. O cliente assina com JWTOptions.Algorithms.MLDSA.PrivateKey, uma chave privada PEM PKCS#8, e o servidor valida com JWTOptions.Algorithms.MLDSA.PublicKey, uma chave pública PEM SubjectPublicKeyInfo. O conjunto de parâmetros da chave tem que ser o que o algoritmo nomeia: caso contrário, assinar gera um erro e a validação retorna False.

 

As assinaturas são grandes. Uma assinatura ML-DSA-44 tem 2420 bytes contra 64 do ES256, portanto um token cresce aproximadamente 3,2 KB de base64url, e um de ML-DSA-87 cerca de 6,2 KB. Verifique os limites de tamanho de header de tudo por onde o token passa antes de adotá-lo.

 

As chaves também podem ser transportadas como JSON Web Keys AKP, RFC 9964 seções 3 e 4. sgcMLDSA_ExportPublicJWK e sgcMLDSA_ExportPrivateJWK escrevem uma, sgcMLDSA_ImportJWK lê qualquer uma das duas formas, e sgcMLDSA_ImportJWKAsPEM converte um JWK diretamente nas strings PEM que os dois componentes leem. Um JWK privado armazena a semente de 32 bytes em priv, a única forma privada que a seção 4 define, portanto uma chave privada expandida não pode ser escrita como JWK. As quatro funções estão declaradas em sgcHTTP_JWT_MLDSA.

 

* Os algoritmos ML-DSA precisam do pacote sgcCrypto. Sem ele os valores do enum continuam existindo, portanto um formulário salvo com um deles ainda carrega, mas assinar gera um erro e todo token ML-DSA é rejeitado.

Componentes

 

 

 

* Os Componentes JWT exigem pelo menos a versão 10.6.0.5169 do Indy ou a Edição Enterprise do sgcWebSockets.