« jwt çöz » ne anlama gelir?
Bir JWT'yi çöz (« jwt decode », « decode jwt online ») dizeyi noktalardan kesmek ve her segmenti orijinal JSON'a döndürmek için Base64URL olarak çözmek demektir. Anahtar gerekmez: başlık ve payload yalnızca kodlanır, şifrelenmez. Tam olarak « jwt payload decoder » veya « decode jwt without verify » arkasındaki niyet budur: jetonun ne içerdiğini görmek, kimlik doğrulandığını iddia etmeden.
İki eylemi ayırt etmeye dikkat edin. Okuma bir JWT hiçbir şeyi kanıtlamaz: herkes çekici bir payload'lı jeton yapıp kendi gizli anahtarıyla imzalayabilir. Doğrula imza, içeriğin bir üçüncü tarafça değiştirilmediğini kanıtlar. İmza denetimi olmadan « admin: true » gösteren bir kod çözücü size bir hikâye anlatır, bir olgu değil.
Bir JWT'nin üç segmenti
Dize tam olarak noktalarla ayrılmış üç parçaya bölünür: header.payload.signature. Başlık en az şunları içerir alg ve typ, bazen kid hangi anahtarın kullanıldığını belirtmek için. Payload şunları taşır: claim'leri, IANA'nın tuttuğu bu anahtar-değer çiftlerini. İmza, ilk iki segmenti tam olarak yazıldığı gibi birleştirilmiş olarak kapsar — bir boşluğun veya karakterin en ufak değişimi karşılaştırmayı bozar.
Tüm zorluk, bu segmentlerin Base64 değil Base64URL olmasıdır: artı işareti tire, eğik çizgi alt çizgiye dönüşür ve doldurma = kaldırılır. Bu nedenle standart bir Base64 kod çözücü geçerli bir JWT üzerinde başarısız olur. Referans sekmesindeki « Base64URL ile standart Base64 karşılaştırması » tablosu tam olarak bu yer değiştirmeleri gösterir.
Bir imza nasıl doğrulanır: HS256, RS256, ES256
Bir algoritma için HMAC — HS256, HS384, HS512 — aynı gizli anahtar imzalamak ve doğrulamak için kullanılır: araç yeniden hesaplar HMAC(secret, base64url(header) + "." + base64url(payload)) ve sonucu taşınan imzayla karşılaştırır. Bu en yaygın durumdur ve aynı zamanda en tehlikelidir: gizli anahtara sahip her servis jeton verebilir. 32 bayttan kısa, ortamlar arasında yeniden kullanılan bir gizli anahtar tüm zinciri tehlikeye atmaya yeter.
Şu algoritmalar için asimetrik — RS256, RS384, RS512, ES256, ES384, ES512, PS256 — doğrulamak için yalnızca genel anahtara ihtiyacınız vardır; bu, üçüncü tarafın verdiği bir jetonu onun imzalama gizli anahtarını asla paylaşmadan denetlemeyi sağlar. Anahtarı PEM biçiminde yapıştırın -----BEGIN PUBLIC KEY----- (SPKI); bir OpenSSL dışa aktarımının ham çıktısı doğrudan kullanılabilir. ES256 için imza, WebCrypto'nun beklediği ham r||s biçimindedir.
Son olarak şundan şüphelenmelisiniz:alg confusion : servisiniz RS256 bekliyorsa ama başlığında HS256 beyan eden bir jetonu kabul ederse, saldırgan genel anahtarla — artık bir HMAC anahtarı — imzalayacak ve doğrulamadan geçecektir. Beklenen algoritmayı sunucu tarafında sabitleyin, jetonun kendisinden asla okumayın.
exp, iat, nbf: tuzağa düşüren zaman damgaları
Bu üç claim şunlardır: Unix saniyeleri, milisaniye ve saat dilimi olmadan: iat 1516239022, 2018-01-17T21:30:22Z demektir. İki hata sürekli tekrarlar: milisaniye cinsinden bir tarihle karşılaştırmak (değer on bin kat fazla) ve bir zaman damgasını UTC yerine yerel olarak yorumlamak. « Sonlanma » sekmesi iki yönde dönüştürür, ISO 8601, yerel tarih ve kalan/geçen süreyi gösterir — « zaten süresi dolmuş » bir jetonu saniye saniye hemen tespit etmek için.
Geçerlilik süresini uzatmak güvenlik seviyesini artırmaz: bir exp ilerletilmiş değer gösterilen değeri değiştirir, imzayı değil. Yeniden vermeniz gerekiyorsa jetonu gizli anahtar veya özel anahtarla yeniden imzalayın — « Kodla » sekmesinin tam görevi budur.
Base64URL: standart kod çözücüler neden başarısız olur
Base64URL (RFC 4648 §5) şu alfabeyi kullanır: A-Z a-z 0-9 - _ ve doldurmaya izin vermez. 20 karakterlik bir payload, doldurma = kaldırıldıktan sonra çoğu zaman dört katı olmayan bir uzunluk üretir: bu normaldir, bozulma değil. Karakterler - ve _ insan gözü için belirsizdir; raporlanan « bozuk jetonların » yarısının nedeni budur. Kod çözücümüz iki alfabeyi de, büyük/küçük harf karışımını, isteğe bağlı doldurmayı ve şu öneki kabul eder: Bearer.
Güvenlik: bir JWT'nin yapmadıkları
JWT ne gizlilik ne de geri çekme sağlar. Payload herkes tarafından okunabilir: asla e-posta, dahili rol veya düz metinle göndermeye razı olmadığınız kişisel veri koymayın. İmzalı bir jeton şu ana kadar geçerli kalır: exp çıkış yaptıktan sonra bile — bir geri çekme listesi, sunucu tarafında jti izleme ya da kısa geçerlilik süreleri gerekir: refresh token. İyi bir alışkanlık: exp kısa (10 ila 15 dakika), iat kontrollü, nbf şunlarla hizalı: iat, aud ve iss alındığında doğrulanır.
Kimler için önerilir
Back-end ve front-end geliştiricileri (OAuth 2.0, OpenID Connect, REST API'leri), entegratörler ve DevOps ekipleri (kimlik altyapısı, JWKS, anahtar döngüsü), testçiler ve pentestçiler (claim yeniden yazma, alg confusion, süre sonu), sistem yöneticileri (açıklanamayan 401 hata ayıklama), öğrenciler (Base64URL ve WebCrypto'yu anlama) ve bir çevrimiçi JWT kod çözücüye ihtiyaç duyan herkes — tamamlayıcı olarakBase64 kodlayıcı kod çözücü,URL kodlayıcı kod çözücü ve JSON biçimlendirici.