Asimetrik Anahtarlar (Public/Private Key) ile JWT Doğrulama Mantığı

K. Murat Baseren
3 min readMay 9, 2024

--

Asimetrik anahtarlar (Public/Private Key) ile JWT doğrulama yöntemi, bir anahtar çiftinin kullanılmasına dayanır: bir private key ve bir public key. Bu anahtarlar matematiksel olarak birbirleriyle ilişkilidir; private key ile yapılan bir imza, karşılık gelen public key ile doğrulanabilir, ancak public key ile imzalama yapılamaz. Bu özellik, verinin güvenli bir şekilde imzalanmasını ve doğrulanmasını sağlar.

Çalışma Mantığı

Token Oluşturma (Imzalama)

Token’ı oluşturan taraf (genellikle bir sunucu), payload’ı (taşıması gereken veri) ve başlık kısmını alır, belirli bir algoritma kullanarak bu bilgileri birleştirir ve bir JWT oluşturur. Daha sonra, bu JWT’yi private key kullanarak imzalar. Bu imzalama işlemi, JWT’nin bütünlüğünü ve kaynağının doğruluğunu korumak için yapılır.

Token Dağıtımı

İmzalı JWT, gereken taraflara (genellikle istemcilere) gönderilir.

Token Doğrulama

Token’ı alan taraf (istemci veya bir başka sunucu), JWT’nin imzasını doğrulamak için token’ı imzalayan tarafın public key’ini kullanır. Eğer JWT’nin imzası, public key ile başarıyla doğrulanırsa, bu JWT’nin manipüle edilmediği ve token’ı imzalayan taraf tarafından oluşturulduğu anlamına gelir.

Basit Bir Örnek

Bu örnekte, bir JWT’nin nasıl oluşturulacağını ve daha sonra nasıl doğrulanacağını basit bir şekilde gösteriyorum. Bu işlemler için System.IdentityModel.Tokens.Jwt paketini kullanacağım, bu yüzden bu paketi projenize eklemeniz gerekecek.

Token Oluşturma

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Cryptography;
using Microsoft.IdentityModel.Tokens;

public class TokenService
{
public string GenerateToken(RSA privateKey)
{
var tokenHandler = new JwtSecurityTokenHandler();
var now = DateTime.UtcNow;

var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, "email")
// Diğer claimler buraya eklenebilir.
}),
Expires = now.AddMinutes(30), // Token süresi
SigningCredentials = new SigningCredentials(new RsaSecurityKey(privateKey), SecurityAlgorithms.RsaSha256Signature)
};

var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}

Token Doğrulama

public ClaimsPrincipal ValidateToken(string token, RSA publicKey)
{
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new RsaSecurityKey(publicKey),
ValidateIssuer = false,
ValidateAudience = false,
// Saat farkı toleransı için:
ClockSkew = TimeSpan.Zero
};

SecurityToken validatedToken;
ClaimsPrincipal principal = tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
return principal; // Doğrulama başarılı ise, token içindeki claimler bu nesnede bulunur.
}

Bu örnekler, asimetrik anahtarlarla JWT oluşturma ve doğrulama işlemlerinin temel adımlarını göstermektedir. Gerçek uygulamalarda, anahtarları güvenli bir şekilde saklamak, token’ın süresini ve izin verilen kullanım senaryolarını dikkatlice yönetmek gibi ek güvenlik önlemleri alınmalıdır.

Private ve Public Anahtar Oluşturma

Peki burada private ve public anahtarlar nerede?

Token ‘ı oluşturan tarafın bu private ve public anahtarları oluşturması gerekir. Private anahtar token oluşturmada kullanılır. Token ile beraber public anahtar karşı tarafa(müşteri, istemci vs) verilir.

Private ve public anahtarların oluşturulmasında openssl kullanıyor olacağım.

OpenSSL Yükleme

Ben chocolatey kullanarak yükleme yaptım. Siz isterseniz download edip yükleme yapabilirsiniz. Chocolatey ile OpenSSL yüklemek için ilgili komut(terminal i yönetici olarak açın)

choco install openssl

Asimetrik Anahtar Çiftinin Oluşturulması

Normalde, bu anahtarlar bir kez oluşturulur ve özel anahtar güvenli bir şekilde saklanırken, genel anahtar gerektiği yerde (örneğin, bir API üzerinde) kullanılmak üzere paylaşılır.

Aşağıdaki komut ile önce private key i oluşturmalı adından onu kullanarak public key i oluşturmalısınız.

Private Key

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

Public Key

openssl rsa -pubout -in private_key.pem -out public_key.pem

Bu basit örnek; asimetrik anahtarlarla JWT oluşturma ve doğrulama işleminin temel adımlarını göstermektedir.

Proje Kodlarında Kullanma

Ürettiğiniz .key uzantılı dosyaları .NET projelerinizde kullanmak için RSA tipinde değerlendirmeniz gerekmektedir.

Aşağıdaki örnek kod bunun içindir.

string publicKey = await File.ReadAllTextAsync("public_key.key");

var rsa = RSA.Create(2048);
rsa.ImportFromPem(publicKey);

--

--

K. Murat Baseren

Software Architect | .NET Developer | Project Manager | Instructor | Lifetime Learner