JWT, uzun bir menzile sahip küçük bir şeydir. Servisleriniz arasındaki kimlik kanıtıdır ve onu imzalayan algoritma, bir sistemde değiştirilmesi en yavaş olan parça olma eğilimindedir, çünkü her veren ve her doğrulayan aynı anda geçiş yapmak zorundadır. Bu da, ihtiyacınız olmadan önce bu seçeneğin var olduğunu bilmeyi değerli kılar.
sgcWebSockets 2026.10, RFC 9964'ün kuantum sonrası JWT algoritmalarını JWT istemcisine ve sunucusuna ekliyor: ML-DSA-44, ML-DSA-65 ve ML-DSA-87. Bunlar, aynı özelliğin üç ek değeri olarak HS, RS ve ES'nin yanında yer alır ve token'ınızla ilgili diğer her şey olduğu gibi kalır.
Bir Token Vermek
Başlıkta algoritmayı seçin, bileşene bir özel anahtar verin ve imzalayın:
oJWT := TsgcHTTP_JWT_Client.Create(nil);
oJWT.JWTOptions.Header.alg := jwtMLDSA65;
oJWT.JWTOptions.Algorithms.MLDSA.PrivateKey.Text := vPrivatePEM;
oJWT.JWTOptions.Payload.iss := 'my-service';
oJWT.JWTOptions.Payload.sub := 'user-1';
vToken := oJWT.Sign;
Özel anahtar sıradan bir PKCS#8 PEM'dir. RFC 9881'in tanımladığı üç biçimin tümü okunur, bu nedenle 32 baytlık tohum olarak, genişletilmiş anahtar olarak veya her ikisi olarak saklanan bir anahtarın hepsi çalışır.
Bir Token'ı Doğrulama
Sunucu tarafı aynı şekle sahiptir; genel anahtar ve algoritma ailesi etkinleştirilir:
oServer := TsgcHTTP_JWT_Server.Create(nil);
oServer.JWTOptions.Algorithms.MLDSA.Enabled := True;
oServer.JWTOptions.Algorithms.MLDSA.PublicKey.Text := vPublicPEM;
if oServer.Validate(vToken, vHeader, vPayload, vError) then
ShowMessage(vPayload);
Her aile kendi başına kontrol edilir, bu nedenle yalnızca ML-DSA token'ları veren bir dağıtım diğerlerini kapatabilir ve alg değeri başka bir şeye ayarlanmış olarak gelen bir token, kontrol edilmek yerine reddedilir.
Parametre Seti Eşleşmelidir
RFC 9964'te yüksek sesle belirtilmeye değer bir kural var, çünkü aksi takdirde fark edilmeden geçebilecek bir hatadır: anahtar, alg'ın adlandırdığı parametre setine ait olmalıdır. Eşleşmeyen bir anahtar reddedilir. Yanlış anahtarla imzalamak hata verir, yanlış anahtarla doğrulamak ise hata vermek yerine false döndürür, bu nedenle bir saldırgan bu farktan hiçbir şey öğrenmek için yararlanamaz.
JSON Web Keys Olarak Anahtarlar
RFC 9964, bu algoritmalar için bir anahtar türü kaydeder, AKP, ve kütüphane bunu okuyup yazar; bu da anahtarların bir dosyaya bırakılmak yerine bir JWKS uç noktasında yayımlandığı durumlarda istediğiniz şeydir:
uses
sgcHTTP_JWT_MLDSA;
var
vJWK, vPublicPEM, vPrivatePEM: string;
begin
// {"kty":"AKP","alg":"ML-DSA-65","pub":"...","priv":"..."}
vJWK := sgcMLDSA_ExportPrivateJWK(mldsa65, oSeed);
// and back again, as the PEM the components read
sgcMLDSA_ImportJWKAsPEM(vJWK, vPublicPEM, vPrivatePEM);
end;
Özel üye, RFC'nin tanımladığı 32 baytlık tohumdur ve okuyucu bu konuda katıdır: üyeler tam olarak doğru uzunlukta kanonik base64url olmalıdır, alg zorunludur ve bir özel anahtar mevcut olduğunda, aynı JWK'daki genel anahtarla uyuşmalıdır. Bunlardan herhangi birinde başarısız olan bir JWK, yarım yüklenmek yerine reddedilir.
Kanıtlanmış Birlikte Çalışabilirlik
Bir imza biçimi yalnızca başka biri de aynı baytları üretebiliyorsa faydalıdır. İki kontrol, iddia olarak değil, test olarak sunulur:
- RFC 9964'ün yayımlanmış örnekleri bayt bayt yeniden üretilir. İmzalayıcı deterministik varyanttır, bu nedenle aynı anahtar ve aynı girdi her zaman aynı imzayı verir ve RFC'nin eki, üzerinde doğrulama yapabileceğiniz bir şey haline gelir.
- Bağımsız bir uygulama tarafından üretilen token'lar, bu durumda Python kütüphanesi dilithium-py, burada doğrulanır ve RFC 9881'e göre elle yazılan anahtar kapsayıcıları değişmeden gidip geri gelir.
Bu Arada: İkili Bir HMAC Sırrı
Aynı geçişte ilgisiz bir sınırlama da ortadan kalktı. HS algoritmaları anahtarlarını metin olarak alıyordu, oysa gerçek bir HMAC anahtarı rastgele bayttır ve bunların çoğu geçerli bir metin bile değildir. Artık anahtarı, bir oct JWK'nin k üyesinin kullandığı aynı kodlama olan base64url olarak alan ikinci bir özellik var:
oJWT.JWTOptions.Algorithms.HS.SecretBase64URL := 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ...';
Ayarlandığında, hem istemcide hem de sunucuda metin sırrına göre önceliklidir.
Başkası Tarafından Yazılan Talepler (Claims)
Başka verenlerden token kabul ediyorsanız bilmeye değer bir düzeltme daha. Bir JSON dizesi, ham UTF-8 olarak veya ASCII dışı her karakter kaçış (escape) dizisiyle yazılarak oluşturulabilir ve farklı kütüphaneler farklı seçimler yapar. Her iki biçim de artık aynı metne çözümlenir, bu nedenle içinde aksan bulunan bir ad, hangi veren tarafından üretilmiş olursa olsun doğru okunur ve kaçış dizileriyle yazılmış bir alg başlığı, ifade ettiği algoritma olarak tanınır.
Yükseltme
Üç algoritma, mevcut listenin sonuna eklenmiştir, bu nedenle saklanan bir sıra numarası anlamını korur ve zaten yaptığınız hiçbir şey değişmez. ML-DSA ile imzalama sgcCrypto paketini gerektirir ve bu paket olmadan yapılan bir derleme, bu token'ları belirsiz bir şekilde başarısız olmak yerine açık bir mesajla reddeder.
Sırada Ne Var
- Delphi'de Kuantum Sonrası Kriptografi
- OpenSSL DLL'leri Olmadan Delphi TLS 1.3
- JWT Delphi İstemcisi ve JWT Delphi Sunucusu, temel bilgiler
İzleyin
Bu konuda eSeGeCe kanalında kısa bir video var.
Sorularınız, geri bildiriminiz mi var ya da geçiş konusunda yardıma mı ihtiyacınız var? Bizimle iletişime geçin — yanıtı bu kodu yazan kişilerden alacaksınız.
