JWT (JSON Web Token) bestaat doorgaans uit een header + payload + handtekening.
Header
Bevat de metadata-informatie over de JWT.
alg: het algoritme dat wordt gebruikt om het token te ondertekenen.
typ: het type van het token, altijd JWT.
{
"alg": "HS256",
"typ": "JWT"
}
U kunt meer headers vinden, maar de vorige zijn altijd aanwezig.
Payload
De payload bevat de claims van de JWT. De standaardheaders zijn de volgende:
iss: de uitgever, de entiteit die de JWT genereert en uitgeeft.
sub: het onderwerp: de entiteit die door dit token wordt geïdentificeerd.
aud: het publiek (audience), de beoogde doelgroep voor deze JWT.
exp: de vervaldatum, het tijdstempel in UNIX-indeling waarna het token niet meer geaccepteerd mag worden.
iat: uitgegeven op; geeft de datum op waarop het token is uitgegeven.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Handtekening
De handtekening wordt gemaakt met behulp van de gecodeerde Header, gecodeerde Payload, een geheim en een cryptografisch algoritme.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
De volgende algoritmen worden ondersteund door zowel Client- als Server JWT-componenten.
OpenSSL-bibliotheken zijn vereist om de JWT te ondertekenen en te verifiëren, op één uitzondering na.
De drie ML-DSA-algoritmen zijn de post-quantum JOSE-algoritmen van RFC 9964, en zij vormen de uitzondering hierboven: ze zijn in puur Object Pascal geïmplementeerd in het sgcCrypto-pack, zodat ze ondertekenen en valideren zonder dat er een OpenSSL-bibliotheek aanwezig is. De handtekening is FIPS 204 ML-DSA in de pure modus met een lege context over de JWS-ondertekeningsinvoer, in het token meegedragen als base64url. De ondertekenaar is deterministisch, dus dezelfde sleutel en dezelfde invoer leveren altijd dezelfde handtekening op.
De enum-waarden zijn jwtMLDSA44, jwtMLDSA65 en jwtMLDSA87, en de alg-header die ze schrijven is ML-DSA-44, ML-DSA-65 en ML-DSA-87. De client ondertekent met JWTOptions.Algorithms.MLDSA.PrivateKey, een PKCS#8 PEM-privésleutel, en de server valideert met JWTOptions.Algorithms.MLDSA.PublicKey, een SubjectPublicKeyInfo PEM-publieke sleutel. De parameterset van de sleutel moet die zijn die het algoritme noemt: ondertekenen geeft anders een fout, en valideren geeft False terug.
Handtekeningen zijn groot. Een ML-DSA-44-handtekening is 2420 bytes tegenover 64 voor ES256, dus een token groeit met ruwweg 3,2 KB aan base64url, en een ML-DSA-87-handtekening met ongeveer 6,2 KB. Controleer de limieten voor headergrootte van alles waar het token doorheen gaat voordat u het toepast.
Sleutels kunnen ook worden meegedragen als AKP JSON Web Keys, RFC 9964 secties 3 en 4. sgcMLDSA_ExportPublicJWK en sgcMLDSA_ExportPrivateJWK schrijven er een, sgcMLDSA_ImportJWK leest beide vormen, en sgcMLDSA_ImportJWKAsPEM zet een JWK rechtstreeks om naar de PEM-tekenreeksen die de twee componenten lezen. Een privé-JWK slaat de 32-byte seed op in priv, de enige privévorm die sectie 4 definieert, zodat een uitgebreide privésleutel niet als JWK kan worden geschreven. Alle vier de functies zijn gedeclareerd in sgcHTTP_JWT_MLDSA.
* De ML-DSA-algoritmen hebben het sgcCrypto-pack nodig. Zonder dat pack bestaan de enum-waarden nog steeds, zodat een formulier dat ermee is opgeslagen nog steeds laadt, maar ondertekenen geeft een fout en elk ML-DSA-token wordt geweigerd.
TsgcHTTP_JWT_Client: JWT-client waarmee u JWT kunt coderen en ondertekenen en verzenden als Autorisatieheader in HTTP- en WebSocket-protocollen.
TsgcHTTP_JWT_Server: JWT-server die u in staat stelt om JWT te decoderen en te valideren die als een Authorization Header in de HTTP- en WebSocket-protocollen worden ontvangen.
* JWT-componenten vereisen minimaal Indy versie 10.6.0.5169 of sgcWebSockets Enterprise Edition.