JWT İmzaları Nasıl Doğrulanır: HS256, RS256 ve ES256
JWT İmzaları Nasıl Doğrulanır
Bir JWT, taleplerini düz metin olarak taşır. Sahteciliği önleyen tek şey imzadır. Doğrulama olmadan, bir saldırgan keyfi token'lar oluşturabilir ve herhangi bir kullanıcının kimliğine bürünebilir. Bu kılavuz, en yaygın üç JWT imzalama algoritmasını ve her birinin nasıl doğrulanacağını ele alır.
Doğrulama Süreci
Algoritmadan bağımsız olarak, JWT imza doğrulaması aynı adımları izler:
- Header, payload ve imzayı çıkarmak için token'ı
.ile bölün. algalanını okumak için header'ı base64url ile çözün.- Algoritma ve anahtarı kullanarak header ve payload'dan imzayı yeniden hesaplayın.
- Yeniden hesaplanan imzayı token'ın imzasıyla karşılaştırın.
- Eşleşirlerse, token gerçektir.
HS256 (HMAC-SHA256)
HS256 simetrik bir algoritmadır — aynı gizli anahtar imzayı oluşturur ve doğrular.
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Doğrulamak için, paylaşılan gizli anahtarla HMAC'i yeniden hesaplayın ve karşılaştırın:
Token: header.payload.sig
Secret: "my-shared-secret"
1. Hesapla: HMACSHA256("header.payload", "my-shared-secret")
2. Karşılaştır: computedSignature === sig
Güvenlik hususları: Gizli anahtar gizli olmalı, periyodik olarak değiştirilmeli ve en az 256 bit entropiye sahip olmalıdır. HS256, birçok hizmetin paylaşılan gizli anahtara ihtiyaç duyduğu mikro hizmet mimarileri için ideal değildir.
RS256 (RSA-SHA256)
RS256 asimetriktir. Yayınlayıcı özel anahtarla imzalar; doğrulayıcılar karşılık gelen genel anahtarla kontrol eder.
signature = RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Doğrulamak için genel anahtarı kullanın:
Token: header.payload.sig
Public: "-----BEGIN PUBLIC KEY-----..."
1. RSA genel anahtarını yükleyin
2. Doğrulayın: RSA_SHA256_verify("header.payload", sig, publicKey)
Avantajlar: İmzalama ve doğrulama anahtarları ayrıdır. Herhangi bir hizmet, gizli bir anahtar tutmadan doğrulama yapabilir. Genel anahtarlar, kolay rotasyon için bir JWKS uç noktasından sunulabilir.
ES256 (ECDSA-SHA256)
ES256, P-256 eğrisi ile ECDSA kullanır. RS256 gibi asimetriktir.
signature = ECDSA_SHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Doğrulama, ECDSA P-256 genel anahtarını kullanır. ES256 çok daha küçük imzalar üretir (RSA-2048 için 256 byte'a karşı 64 byte) ve daha hızlı doğrulama sunar.
Algoritma Karşılaştırması
| Özellik | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | Anahtar türü | Simetrik (paylaşılan gizli) | Asimetrik (RSA çifti) | Asimetrik (EC çifti) | | İmza boyutu | 32 byte | 256 byte | 64 byte | | Anahtar dağıtımı | Gizli olarak paylaşılır | Genel anahtar herkese açıktır | Genel anahtar herkese açıktır | | Rotasyon | Orta düzey | Kolay (JWKS) | Kolay (JWKS) | | Kullanım alanı | Güvenilir dahili sistemler | Dağıtık API'ler | Mobil, IoT |
Yaygın Doğrulama Hataları
- Algoritma karıştırma saldırısı. Kodunuz
algdeğerini token'dan zorlama olmadan okursa, bir saldırgan algoritmayı değiştirebilir. Her zaman algoritmanın beklenen değerle eşleştiğini doğrulayın. alg: "none"kabul etmek. Bazı kütüphaneler imzasız token'ları kabul eder.alg: "none"değerini açıkça reddedin.- İmza kısaltma. Sabit olmayan zaman karşılaştırması, zamanlama saldırıları yoluyla bilgi sızdırabilir. JWT kütüphanenizin yerleşik karşılaştırmasını kullanın.
JWT Token'ları Çevrimiçi Doğrulayın
Herhangi bir token'ı çözmek ve doğrulamak için JWT decoder aracını kullanın. Token'ı yapıştırın, header ve payload'u görüntüleyin ve uygun gizli veya genel anahtarı sağlayarak imzayı doğrulayın. Tüm işlemler tarayıcınızda gerçekleşir.