Merhaba,
Modern web uygulamalarında hassas verilerin korunması kritik bir gereksinimdir. Kullanıcı kimlik bilgileri, token’lar, cookie içerikleri veya URL parametreleri gibi veriler, yetkisiz kişilere geçtiğinde ciddi güvenlik açıklarına yol açabilir. ASP.NET Core, bu ihtiyacı karşılamak için yerleşik olarak IData Protection API sunar.
Bu yazıda; IData Protection’ın ne olduğunu, hangi problemleri çözdüğünü, nasıl yapılandırıldığını ve pratik kullanım örneklerini ele alacağım.
IData Protection Nedir?
IData Protection, ASP.NET Core’un sağladığı şifreleme (encryption) ve şifre çözme (decryption) mekanizmasını temsil eden bir API’dir.
Temel amaçları şunlardır:
-
Veriyi uygulama dışından okunamaz hale getirmek.
-
Karmaşık anahtar yönetimini geliştiriciden soyutlamak.
-
Güvenli, test edilmiş ve standartlara uygun bir kriptografik çözüm sunmaktır.
Ne Zaman Kullanılır?
IData Protection aşağıdaki senaryolarda sıklıkla tercih edilir:
-
Cookie içeriklerinin korunması.
-
URL veya QueryString içindeki hassas verilerin gizlenmesi.
-
E-posta doğrulama ve şifre sıfırlama linklerinin güvenliği.
ASP.NET Core, Authentication, Anti-Forgery Token, TempData gibi mekanizmalarda zaten IData Protection’ı dahili olarak kullanır.
IData Protection Nasıl Çalışır?
Genel akış şu şekildedir:
-
IDataProtectionProvider oluşturulur
-
Provider üzerinden bir IDataProtector elde edilir
-
Veriler Protect() ile şifrelenir
-
Aynı protector ile Unprotect() edilerek çözülür
Önemli nokta:
Aynı purpose string kullanılmadan şifre çözme yapılamaz.
Örnek
public class SampleService
{
private readonly IDataProtector _dataProtector;
public SampleService(IDataProtectionProvider provider)
{
// "Purpose string" belirleniyor
_dataProtector = provider.CreateProtector("SampleService.Protection");
}
public string Encrypt(string input) => _dataProtector.Protect(input);
public string Decrypt(string protectedData) => _dataProtector.Unprotect(protectedData);
}
Purpose String Neden Önemli?
CreateProtector("purpose") ifadesindeki "purpose", anahtar türetme sürecinin bir parçasıdır. Temel amacı şunlardır:
-
Aynı uygulama içindeki farklı veri alanlarını birbirinden ayrıştırmak.
-
Yanlış protector ile veri çözme girişimlerini engellemek.
-
Daha güvenli bir anahtar hiyerarşisi oluşturmak.
Örneğin; User.EmailConfirmation ile şifrelenen bir veri, User.PasswordReset protector'ı ile çözülemez.
Anahtar Yönetimi ve Yapılandırma
Varsayılan olarak ASP.NET Core, anahtarları dosya sisteminde saklar ve otomatik olarak anahtar döndürme (key rotation) yapar.
Varsayılan Konumlar
-
Windows: %LOCALAPPDATA%\ASP.NET\DataProtection-Keys
-
Linux: /var/lib/aspnet/DataProtection-Keys
Key Yapılandırmasını Özelleştirme
Özellikle ölçeklenebilir (load-balanced) veya konteynerize (Docker) ortamlarda anahtarların ortak bir merkezde tutulması gerekir.
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\keys"))
.SetApplicationName("MyApp")
.SetDefaultKeyLifetime(TimeSpan.FromDays(30));
-
AddDataProtection(): Altyapıyı DI container’a ekler ve mekanizmayı başlatır.
-
PersistKeysToFileSystem: Anahtarları manuel belirlenen bir klasöre yazar. Bu sayede uygulama restart edilse bile anahtarlar korunur.
-
SetApplicationName: Aynı anahtar klasörünü kullanan farklı uygulamaların birbirinin verisini çözmesini engelleyerek izolasyon sağlar.
-
SetDefaultKeyLifetime: Varsayılan 90 günlük anahtar ömrünü değiştirir (Minimum 7 gün, maksimum 1 yıl önerilir).
Key Lifecycle (Yaşam Döngüsü) ve Temizlik
Bir anahtar sırasıyla; Created, Active, Expired ve Revoked aşamalarından geçer.
-
Expiration ≠ Silinme: Bir anahtarın süresinin dolması, onun sistemden silindiği anlamına gelmez. Süresi dolan anahtar yeni şifrelemeler için kullanılmaz ancak eski verileri (eski cookie'ler veya linkler) çözebilmek için sistemde tutulmaya devam eder.
-
Key Cleanup: Süresi dolan anahtarlar, artık hiçbir veri tarafından referans edilmediklerinde bir arka plan görevi (maintenance task) tarafından otomatik olarak temizlenir.
Önemli Uyarı: Key dosyalarını manuel olarak silmek; aktif kullanıcıların oturumlarının kapanmasına ve şifreli linklerin bozulmasına neden olur. Bu işlem kesinlikle önerilmez.
Oluşan Key’ler Hangi Formatta Saklanır?
IData Protection key’leri XML formatında saklar.
Örnek bir key dosyası:
<?xml version="1.0" encoding="utf-8"?>
<key id="f3c1e2a1-8a2e-4b2c-b8e5-9d9c12345678" version="1">
<creationDate>2026-01-20T10:15:30Z</creationDate>
<activationDate>2026-01-20T10:15:30Z</activationDate>
<expirationDate>2026-04-20T10:15:30Z</expirationDate>
<descriptor>
<encryptedSecret>
<!-- Şifrelenmiş anahtar verisi -->
</encryptedSecret>
</descriptor>
</key>
| Alan | Açıklama |
|---|---|
| id | Key’in benzersiz GUID değeri |
| creationDate | Key’in oluşturulduğu tarih |
| activationDate | Şifreleme için aktif olduğu tarih |
| expirationDate | Şifreleme için son geçerlilik tarihi |
| encryptedSecret | Gerçek kriptografik anahtar (şifreli) |
Anahtarın kendisi asla plain-text değildir. İşletim sistemi veya sertifika ile ek olarak korunur.
Hata Yönetimi, Avantajlar ve Sonuç
Unprotect() işlemi sırasında veri bozulmuşsa veya yanlış bir "purpose" kullanılmışsa CryptographicException hatası alınır. Bu nedenle, çözme işlemlerinde try-catch blokları kullanmak güvenli bir yaklaşımdır.
Avantajları:
-
Platform bağımsızdır ve otomatik anahtar yönetimi sunar.
-
ASP.NET Core ekosistemiyle tam entegre çalışır.
-
Ek kütüphane bağımlılığı gerektirmez.
Sonuç: IData Protection API kullanmak, güvenlik risklerini minimize eder. Token, link ve cookie tabanlı tüm senaryolarda bu standart yapıyı kullanmanız önerilir.
Diğer bloglarımda görüşmek üzere! 👋🏻