HTTP | JWT

JWT (JSON Web Token) è tipicamente composto da intestazione + payload + firma.

 

Intestazione

 

Contiene le informazioni sui metadati del JWT.

 


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

Potrebbero essere presenti ulteriori intestazioni, ma quelle precedenti saranno sempre presenti.

 

Payload

 

Il payload contiene i claim del JWT. Gli header standard sono i seguenti:

 


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

 

Signature

 

La firma viene creata utilizzando l'Header Codificato, il Payload Codificato, un Segreto e un Algoritmo Crittografico.


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5M
DIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Algoritmi supportati

I seguenti algoritmi sono supportati sia dal componente JWT Client che Server.

 

 

Le librerie OpenSSL sono richieste per firmare e verificare il JWT, con un'eccezione.

 

ML-DSA, firme post-quantistiche

I tre algoritmi ML-DSA sono gli algoritmi JOSE post-quantistici della RFC 9964, e sono l'eccezione appena citata: sono implementati interamente in Object Pascal nel pack sgcCrypto, quindi firmano e validano senza alcuna libreria OpenSSL presente. La firma è ML-DSA di FIPS 204 in modalità pura con una stringa di contesto vuota sull'input di firma JWS, trasportata nel token come base64url. Il firmatario è deterministico, quindi la stessa chiave e lo stesso input producono sempre la stessa firma.

 

I valori dell'enum sono jwtMLDSA44, jwtMLDSA65 e jwtMLDSA87, e l'header alg che scrivono è ML-DSA-44, ML-DSA-65 e ML-DSA-87. Il client firma con JWTOptions.Algorithms.MLDSA.PrivateKey, una chiave privata PEM in formato PKCS#8, e il server valida con JWTOptions.Algorithms.MLDSA.PublicKey, una chiave pubblica PEM in formato SubjectPublicKeyInfo. Il parameter set della chiave deve essere quello indicato dall'algoritmo: in caso contrario la firma genera un'eccezione e la validazione restituisce False.

 

Le firme sono grandi. Una firma ML-DSA-44 è di 2420 byte contro i 64 di ES256, quindi un token cresce di circa 3,2 KB di base64url, e una firma ML-DSA-87 di circa 6,2 KB. Verificare i limiti di dimensione degli header di tutto ciò che il token attraversa prima di adottarlo.

 

Le chiavi possono anche essere trasportate come JSON Web Key AKP, RFC 9964 sezioni 3 e 4. sgcMLDSA_ExportPublicJWK e sgcMLDSA_ExportPrivateJWK ne scrivono una, sgcMLDSA_ImportJWK legge entrambe le forme e sgcMLDSA_ImportJWKAsPEM converte una JWK direttamente nelle stringhe PEM che i due componenti leggono. Una JWK privata memorizza il seed di 32 byte in priv, l'unica forma privata definita dalla sezione 4, quindi una chiave privata espansa non può essere scritta come JWK. Tutte e quattro le funzioni sono dichiarate in sgcHTTP_JWT_MLDSA.

 

* Gli algoritmi ML-DSA richiedono il pack sgcCrypto. Senza di esso i valori dell'enum esistono comunque, quindi una form salvata con uno di essi si carica ancora, ma la firma genera un'eccezione e ogni token ML-DSA viene rifiutato.

Componenti

 

 

 

* I componenti JWT richiedono almeno la versione Indy 10.6.0.5169 o sgcWebSockets Enterprise Edition.