Teknik Muhabbetler #9 (GDPR-Data Encryption)

Furkan Güngör
Sep 19 · 6 min read

“Hiçbir sistem güvenli değildir.” Yıllar önce izlediğim ve hemen hemen herkesin izledikten sonra “Ben de hacker olacağım” cümlesini kurduğu o güzel Alman yapımı filmin akılda kalan sloganı ile bu konuya başlamak “Teknik Muhabbetler” serisinin bu yazısı için erken bir final olabilir. Eğer izlemediyseniz “Who Am I” isimli filmi izleminizi tavsiye ederim. Gerçekleri bire bir yansıtmasa da eğlenceli vakit geçirmenizi sağlayabilir.

Madem hiç bir sistem güvenli değil o zaman neden güvenlik alanında her geçen gün yeni gelişmeleri ve yatırımları okuyoruz? 🤔
Sadece yeni gelişmeler ve yatırımları okusaydık emin olun daha güvenli bir dünyada yaşıyor olurduk.
Günümüzde sistemler üzerine yapılan birçok saldırının, bilgi alma veya geçici süreliğine meşgul etme üzerine kurulu saldırılar olduğunu biliyoruz.
Yapılan araştırmalar doğrultusunda saldırıların temelinde sistemden bilgi sızdırmak üzerine odaklandığını görebiliyoruz. Bu bilgiler genellikle sistem içerisinde yer alan kullanıcıların;

  • İsim, adres, kimlik numarası
  • Konum, Ip adresi
  • Fiziksel görünüme ait veriler ve biometrik veriler
  • Irk köken bilgileri
  • Siyasi görüş
  • Tıbbi veriler

ve daha fazla alt kategoride inceleyebileceğimiz verilerden oluştuğunu söyleyebiliriz. Uygulamaların bulunduğu domaine göre bu bilgiler değişkenlik gösterebilir. Örneğin bankacılık sektöründe hizmet veren bir uygulama için yukarıdaki kategorilere ek olarak;

  • Hesap bilgileri
  • Hesap haraketleri
  • Yatırım hesapları
  • Bakiye bilgileri
  • Kart bilgileri

gibi kategoriler değerlendirilebilir.

2018 yılından itibaren GDPR (General Data Protection Regulation) olarak isimlendirilen bir dizi kurallar silsilesi ile, Avrupa genelinde AB vatandaşlarının kişisel verilerini korumayı amaçlanmıştır.

GDPR, Avrupa birliği sınırları içerisindeki vatandaşların kişisel verilerini barındıran tüm işletmeleri bu kurallara uymak zorunda olduğunu bildirir. Aksi takdirde kişisel verilerin ihmali olarak değerlendirilip kuruluşa yönetmelikte belirlenen miktarda ceza uygulanabilir. Şirketin konumu Avrupa birliği sınırları içerisinde bulunmasa dahi eğer kullanıcılarımız Avrupa birliği vatandaşı ise bu kurullara uymak zorunda olduğumuzu belirtmekte fayda var.

GDPR kurallarını özetlemek gerekirse;

  • Kullanıcıdan kişisel verileri alınırken basit ve anlaşılır bir şekilde onay alınması gerekir.
  • Kullanıcı onay verdiği bu veriler üzerinde iptal işlemlerini yine basit ve anlaşılır bir şekilde gerçekleştirebilmeli.
  • Kullanıcılar alınan bu verilerin nerelerde nasıl kullanıldığına ve ne kadar süreyle tutulacağını bilmelidir.
  • Kullanıcılar kaydedilen verileri silme ve güncelleme hakkına sahiptir.
  • Kullanıcılar veriler üstünde kısıtlama yapabilmelidir.

Bu yazının temel konusu data encryption ama yukarıda bahsettiğim onay gereksinimlerini kısa cümlelerle açıklamakta fayda var.

Temel olarak iki çeşit onay yöntemi var diyebiliriz.

  • Aktif Onay
  • Pasif Onay

Pasif Onay : Kullanıcının yaptığı aksiyonlar doğrultusunda kullanıcının verilerini kullanmak, işlemek, saklamak vb. konulara izin verdiğini kabul etmek demektir. Örneğin; İnternet üzerinde alışveriş yaptığınız uygulamadan sipariş aşamalarının tarafınıza sms veya email gibi yöntemlerle bildirilmesi. Burada tetikleyici aksiyon sizin sipariş vermenizdir. Sipariş verdiğiniz anda sms veya email gibi aksiyonlara pasif bir şekilde izin vermiş olursunuz. Kargo süreçleri için de aynı durum geçerli. Eğer bir kargonuz varsa teslimattan önce ve sonra sms veya email almayı kabul etmiş olursunuz. Aslında bu yöntem GDPR ilk çıktığında sistemlerin çok fazla aksilik yaşamaması için kabullenilen bir durum olarak karşımıza çıkıyor.

Aktif Onay : Kullanıcının yaptığı aksiyonların bir öneminin olmadığı yöntemdir. Kullanıcının verilerini saklamak, paylaşmak, işlemek gibi aksiyonlar için kullanıcıdan basit ve anlaşılır bir arayüzle izin istemek ve kullanıcının istediği anda bu izinleri değiştirebilmesini sağlayabilmek olarak özetleyebiliriz. Aktif onay için en güzel örnek mobil uygulamalar olabilir. Temel nokta kullanıcının istediği zaman bu izinleri değiştirebilmesidir.

Aktif onay mekanizmalarını sektörde consent management olarak görebiliriz. Daha detaylı bilgi için buraya tıklayabilirsiniz.

GDPR oldukça derin bir konu. Tek bir yazı ile tamamlamak oldukça zor. Belki ilerleyen zamanlarda Teknik Muhabbetler serisinin altında küçük bir seri olarak yayımlayabilirim. GDPR kurallarını daha farklı alt başlıklarda da görüyoruz. Örneğin; Consent Management ile kullanıcının bilgilerini sınırlı bir süre için işlemek veya yine kullanıcının isteği doğrultusunda sistem içerisinde kullanılan ve işlenen tüm verilerin silinmesi veya anonimleşmesi gibi konularda yine GDPR üzerinde değerlendirilebilir. Ancak konuyu daha fazla uzatmadan bazı kişisel bilgilerin şifrelenerek saklanması ve bunun AspNetCore üzerinde nasıl yapılacağına değinmek istiyorum. Hadi öğrenelim… 🤓

Attribute ve Reflection kavramlarını, Teknik Muhabbetler serisinin önceki yazılarında anlatmıştım. Hatırlamakta ve bilgilerimizi tazelemekte fayda var. İlgili yazıya buradan ulaşabilirsiniz. Kullandığımız teknolojide bazı hazır çözümler var ancak konuyu anlamak ve deep-dive yapabilmek için öncelikle custom bir çözüm geliştireceğiz. Sonrasında EF Core üzerinde bu konuyla ilgili bir kütüphane ile PoC yapacağız ve yazıyı sonlandıracağız.

Basit bir Customer entity oluşturup bu entity üzerindeki bazı bilgileri şifreleyerek kaydetmek istiyoruz. Bu operasyonu yapabilmek için ilgili sütunları işaretlememiz gerekiyor. İşte tam bu noktada attribute kullanacağız.

Adım 1:

Basit bir attribute oluşturalım.

EncryptionAttribute.cs

EncryptionAttribute.cs yardımıyla ilgili sütunları işaretleyeceğiz. Buraya kadar her şey yolunda.

Adım 2:

Encrypt ve Decrypt işlemlerini yapabilmek için yardımcı bir yapıya ihtiyacımız var. Bu yapı ile plain text olarak isimlendirdiğimiz değerleri şifreleyip kaydedeceğiz.

Cipher Helper Class

Şifreleme ve şifre çözme işlemleri için private bir key değerine ihtiyaç duyuyoruz. Adı üstünde private olarak saklanmalı aksi takdirde şifrelenen veriler decrypt edilebilir. Encrypt ve Decrypt işlemleri için AES kullandım.

Advanced Encryption Standart yani Gelişmiş Şifreleme Standartı verilerin şifrelenmesi için geliştirilen bir standarttır. Ulusal Standart ve Teknoloji Enstitüsü NIST tarafından 2001 yılında kabul edilen bu standart DES şifreleme algoritmasının yerini almıştır. Kriptografi alanına ilgi duyuyorum ve yıllar önce DES şifreleme algoritmasını derinden inceledeğim bir yazı paylaşmıştım. Bu yazının konusu şifreleme algoritmaları olmadığı için şimdilik AES konusunu burada noktalıyorum. Eğer siz de ilgi duyuyorsanız DES ile ilgili paylaştığım yazıya buradan ulaşabilirsiniz.

Adım 3:

Override CRUD operation on DbContext

Db Context seviyesinde Create, Read ve Update işlemlerini override ederek şifreleme işlemlerini tamamlayalım.

SampleDbContext.cs

Yukarıda yazılan kod yığınını basit cümlelerle açıklayalım.

Add, Update ve Find metodları virtual olarak işaretlendiği için geliştiriciler bu metotları override edebiliyor. Bu yapıları override ederken Cipher ve Reflection yardımıyla ilgili entity üzerinde şifrelenerek kaydedilmesi gereken alanları bulup şifreliyoruz. Find ederken kullanıcının bu datayı anlaması için bu alanları tekrar clear hale getiriyoruz. Add işleminden sonra örnek data aşağıdaki görünümü oluşturmuştur.

Buraya kadar her şey yolunda gibi görünüyor. Tabii bazı sorunlar var. Add,Read ve Update işlemlerinde araya girip bazı operasyonlar yaptırıyoruz. Bu operasyonlar normal işlem süresini biraz uzatacaktır. Ancak bu sorundan daha önemli bir problemimiz var. Bu bilgiler şifrelendiği için bu bilgiler üzerinde filtreleme işlemi yaparken oldukça zorlanabiliriz. Kullanıcı ‘xxx’ telefon numarasına sahip kullanıcıyı görüntülemek isterse bu operasyonu nasıl sağlayacağımız ile ilgili bir çözümümüz yok. Hadi gelin çözüm önerilerinde bulunalım.

Çözüm 1

Kullanıcı telefon numarası üzerinde bir filtre gerçekleştirirse veri tabanı üzerinden tüm veriyi okuyalım. Teker teker bu alanları decrypt edelim ve kullanıcının istediği veri kümesini geri dönelim.

Eminim şu an bu çözümü okurken “Yook artık!!” diyorsunuzdur. Çözüm çözümdür. Çalışır mı? Evet çalışır. Ancak veri sayısı arttıkça bu endpoint size cevap verebilmek için uygulamanın kanını emecektir. 🦇

Çözüm 2

Kullanıcı, şifrelenmiş bu bilgiler üzerinde bir filtre gerçekleştirirse kullanıcının verdiği bilgiyi de şifreleyelim ve şifrelenmiş veriyi karşılaştıralım. Şifrelenmiş veriler eşlenirse kullanıcı ilgili kaydı görebilir.

Bu çözüm bir önceki çözüme göre daha mantıklı. İlerleyen zamanlarda veri sayısı artsa bile yaptığımız şey string kıyaslamasından daha kompleks bir şey olmadığı için performans anlamında bize çok sorun yaratmayacaktır.

İşte tam bu noktada FowApps ürün ailesi olarak bazı uygulamalarımızda kullandığımız bir kütüphaneyi size tanıtmak istiyorum.

EntityFrameworkCore.DataEncryption kütüphanesi ile entity üzerinde bulunan ve şifrelemek istediğimiz alanları işaretleyebiliyoruz. Bu alanlar üzerinde sorgular çalışırken filtrelenmek istenen veri şifrelenerek karşılaştırılıyor ve yukarıda yazdığımız kod yığınlarını yazmak zorunda kalmıyoruz. Hadi deneyelim ve öğrenelim.🧐

Detaylı bilgi için tıklayınız.

PM> Install-Package EntityFrameworkCore.DataEncryption

Nuget üzerinden kütüphaneyi indirerek başlıyoruz.

Şifrelemek istediğimiz alanları Encrypted attribute ile işaretliyoruz.

Encryption provider olarak Aes seçip DbContext yapısını yukarıdaki gibi güncelliyoruz. Tüm işlemler bu kadar. Artık istediğinz alanı şifreleyebilirsiniz.

NOT

Filtre işlemlerinde sadece equals desteklenmektedir. Contains gibi sorgular çalışmayacaktır çünkü metinin tümü ile herhangi bir parçasının şifrelenmiş halleri birbirinden farklıdır.

Yazdığınız kodlar production ortamında hatasız ve bugsız çalışsın. Testler sizi korusun. 🤲

FowApps

Focus on your work.

FowApps

FowApps is a spinoff of BilgeAdam Technologies which has over 24 years of experience, 1,000+ full-time employees including 600+ highly qualified engineers, serving 900+ highly satisfied global / national companies and governmental agencies.

Furkan Güngör

Written by

Solution Developer — I want to change the world, give me the source code.

FowApps

FowApps is a spinoff of BilgeAdam Technologies which has over 24 years of experience, 1,000+ full-time employees including 600+ highly qualified engineers, serving 900+ highly satisfied global / national companies and governmental agencies.