ASP.NET Core'da verilerimiz için belirli bir süreliğine koruma sağlayabiliriz. Örneğin şifrelediğimiz bir verinin çözülmesi için bir dakikalık bir süre tanımlayabiliriz. Yani bu bir dakikalık süre aşılırsa şifreli verinin çözülemeyeceği anlamına gelir. Bunun için DataProtectionAPI kullanılıyor.
İlk önce Startup'da DataProtection'ı aşağıdaki gibi aktif etmemiz gerekli.
services.AddDataProtection();
Controller'da aşağıdaki gibi IDataProtectionProvider'ı inject ediyoruz.
public IDataProtectionProvider DataProtectionProvider { get; init; }
public TimeLimitedDataController(IDataProtectionProvider dataProtectionProvider)
{
DataProtectionProvider = dataProtectionProvider;
}
Şifreleme yapmadan önce bir tane amaç belirtmemiz gerekiyor. Örneğin; Auth Ticket, View State vs. Böylelikle amaca göre client bazında kriptografik bir anahtar oluşturuluyor. Yani AuthTicket ile şifrelediğimiz bir veri, View State ile çözülemiyor. Bu sayede veri izolasyonu ve güvenliği sağlanmış oluyor.
var dataProtector = DataProtectionProvider.CreateProtector("AuthTicket");
var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();
var payload = "This is an encrypted message for a minute.";
var result = timeLimitedDataProtector.Protect(payload, TimeSpan.FromSeconds(60));
Yukarıdaki örnekte AuthTicket amacı ile şifrelediğimiz veriyi aşağıdaki gibi çözebiliriz.
string result;
try
{
var dataProtector = DataProtectionProvider.CreateProtector("AuthTicket");
var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();
var payload = "ENCRYPTED_DATA";
result = timeLimitedDataProtector.Unprotect(payload);
}
catch (CryptographicException ex)
{
result = ex.Message;
}
return result;
Bir dakikalık süre aşıldıktan sonra şifrelenmiş veri çözülemeyecek ve aşağıdaki gibi bir hata fırlatılacak.
Amaçlar zincirleme şeklinde oluşturulabilir. Örneğin multi-tenant bir uygulama geliştiriyorsak; her tenant için ayrı bir izolasyon sağlayabiliriz.
var dataProtector = DataProtectionProvider.CreateProtector("Tenant1").CreateProtector("AuthTicket");
var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();
var payload = "This is an encrypted message that Tenant1 can see for a minute.";
var result = timeLimitedDataProtector.Protect(payload, TimeSpan.FromSeconds(60));
Tenant1 için şifrelenmiş bir veriyi yine aşağıdaki gibi Tenant1 ile çözebiliriz. Aksi halde aşağıdaki gibi bir hata fırlatılacak.
string result;
try
{
var dataProtector = DataProtectionProvider.CreateProtector("Tenant1").CreateProtector("AuthTicket");
var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();
var payload = "ENCRYPTED_DATA";
result = timeLimitedDataProtector.Unprotect(payload);
}
catch (CryptographicException ex)
{
result = ex.Message;
}
return result;
Kolay gelsin.
Yorum bırak
Yanıtla
Yanıtlamayı iptal et