Emre Kızıldaş
Published in

Emre Kızıldaş

Verilerinizi Veritabanınızda Şifreli Olarak Saklayın — .Net Core & EntityFramework

Merhaba, bu yazımızda sizinle verilerinizi veritabanında şifrelenmiş biçimde nasıl saklayabileceğiniz ve verileri çekerken otomatik olarak şifresi çözülmüş biçimde nasıl çekebileceğinizden bahsedeceğiz.

Özellikle son zamanlarda artan veri sızıntısı haberlerine istinaden bu şekilde bir yazı yazma ihtiyacı hissettim. Bazı veritabanı kolonlarının gizli veriler içerdiği göz önüne alındığında, veritabanımızın ele geçirilme durumlarında verilerin şifrelenmiş olması büyük önem kazanmaktadır.

Photo by Markus Winkler on Unsplash

Bu yazımızda sizinle “string” tipindeki verilerinizin veritabanında şifreli tutulmasını ve ilgili verileri kullanmak istediğinizde otomatik olarak şifresini çözerek gösterilebilmesi sağlanacak.

Proje Oluşturalım

Bu adımda herhangi bir mimari yaklaşımın getirdiği gerekliliklerden bağımsız olarak basit bir konsol uygulaması oluşturalım.

Projeye isim verdikten sonra projenin “.Net 5.0” versiyonu seçilerek oluşturalım.

NuGet Paketlerini Yükleyelim

Projemizde kullanmak üzere aşağıdaki listede yer alan NuGet paketlerini yükleyelim:

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools
  • Npgsql.EntityFrameworkCore.PostgreSQL
  • EntityFrameworkCore.EncryptColumn (*)

Projeye ait .csproj dosyası aşağıdaki gibi olacaktır:

Veritabanı Nesnesi ve Tablo Oluşturalım

Projemizde “Entity” isminde klasör oluşturup içerisine “User” isminde bir sınıf yaratalım. “User” sınıfınızı basit olarak aşağıdaki gibi oluşturabilirsiniz:

Sonrasında bu sınıfı bir veritabanı tablosu haline getirebilmek için projemiz içerisinde “Context” isminde bir klasör oluşturup içerisinde “ExampleDbContext” isminde bir sınıf yaratalım. Bu sınıf “DbContext” sınıfını kalıtım alacak şekilde oluşturulmalıdır.

Bazı ek geliştirmeler ile “Users” isminde tablo oluşturup bu tablodaki “ID” parametresinin otomatik olarak oluşturulmasını sağlayabilirsiniz.

Sonrasında bu kodları veritabanında birer tablo haline getirebilmek için “migration” komutlarımızı uygulayalım.

“Package Manager Console” üzerinden öncelikle “Add-Migration initialize” komutunu çalıştıralım, sonrasında ise “update-database” komutunu çalıştırarak veritabanımızı hazır hale getirelim.

Bu komutlar sırasında aşağıdaki hata alınırsa bir SQL scripti çalıştırılması gerekmektedir:

Veritabanınızı doğru şekilde kurguladığınızda aşağıdaki ekran görüntüsünü elde etmeniz gerekmektedir:

Şifrelenecek Kolonları Belirleme ve Veritabanı Konfigürasyonu

Veritabanınız üzerinde şifreli olarak verileri saklanmasını istediğiniz kolonlar için aşağıdaki şekilde “attribute” kullanılması gerekmektedir.

“EntityFrameworkCore.EncryptColumn.Attribute” sınıfında yer alan “EncryptColumn” parametresi kullanılacaktır.

Tablomuzdaki şifrelenecek kolonları belirledikten sonra veritabanı konfigürasyonunu yapabiliriz.

  • “ExampleDbContext” sınıfı içerisinde “IEncryptionProvider” arayüzü kullanılarak bir parametre oluşturulur.
  • “ExampleDbContext” sınıfının kurucu metodunda şifreleme anahtarımızı belirliyoruz. Ardından şifreleme sağlayıcımızı oluşturuyoruz.
  • Son olarak “OnModelCreating” metodu içerisinde şifreleme sağlayıcısını kullanacağımızı belitiyoruz.
modelBuilder.UseEncryption(this._provider);

“ExampleDbContext” sınıfının görüntüsü son olarak şu şekilde olacaktır:

Veri Ekleme Ve Listeleme

“Program.cs” sınıfı içerisinde test amaçlı olarak veritabanımızdaki “Users” tablosuna bir satır ekleyelim. Sonrasında eklediğimiz kullanıcıyı listeleyelim.

Bu programı çalıştırdığımızda ortaya çıkan konsol ekranı aşağıdaki gibidir:

Bildiğiniz gibi “IdentityNumber” ve “EmailAddress” kolonlarını şifreli olarak belirlemiştik. Veritabanında bu alanların görüntüsü ise şu şekildedir:

Artık veritabanınızda istediğiniz kolonlar için “EncryptColumn” niteliğini kullanarak ilgili kolonun veritabanında şifrelenmiş veri ile saklanmasın sağlayabilirsiniz.

Projenin kaynak koduna aşağıdaki linkten ulaşabilirsiniz.

(*) Ayrıca açık kaynak kodlu olarak oluşturduğum “EntityFrameworkCore.EncryptColumn” paketine katkıda bulunmak isterseniz GitHub repo adresi şu şekildedir:

--

--

Çeşitli yazılım dillerinde ve platformlarında projeler oluşturmak üzere paylaşımlarda bulunduğum kişisel blog.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store