Sql & Veritabanı İle Uygulamalar İçin Veri Şifreleme İşlemi Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri Şifreleme İşlemi Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri Şifreleme İşlemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Uygulamalarınızda veri şifreleme süreçlerini başlatmadan önce, modern bir veritabanı yönetim sistemi (PostgreSQL 17+ veya MySQL 9.0+ önerilir) ve güvenli bir anahtar yönetimi altyapısına sahip olmanız gerekir. Şifreleme, veritabanının performansını doğrudan etkileyebileceği için doğru strateji seçimi hayati önem taşır.

  • Modern bir RDBMS (İlişkisel Veritabanı Yönetim Sistemi).
  • Uygulama diliniz için güncel şifreleme kütüphaneleri (Örn: PHP için Sodium, Python için Cryptography kütüphanesi).
  • Güvenli bir "Environment" (Ortam) değişken yönetimi (örn: .env dosyaları).
  • Şifreleme anahtarlarını saklamak için bir Key Management Service (KMS) veya Vault çözümü.

Veritabanı Seviyesinde Şifreleme (TDE) Nedir?

Transparent Data Encryption (TDE), verilerin diske yazılmadan önce şifrelenmesi ve okunduğunda şifresinin çözülmesi işlemidir. Bu yöntem, veritabanı dosyalarının çalınması durumunda verilerin korunmasını sağlar ancak veritabanı motoru açıkken yetkili bir kullanıcı verileri düz metin olarak görür.

TDE, genellikle veritabanı yöneticileri tarafından yapılandırılır. Uygulama tarafında ekstra bir kod yazmanıza gerek kalmaz, ancak veritabanı sunucusunun performans yükünü artırabilir.

Uygulama Seviyesinde Şifreleme: Adım Adım

Uygulama seviyesinde şifreleme, verilerin veritabanına gönderilmeden önce uygulama kodunuz tarafından şifrelenmesidir. Bu, veritabanı yöneticilerinin bile verileri okumasını engeller. Modern standart olarak AES-256-GCM algoritmasını kullanacağız.


// PHP ile AES-256-GCM şifreleme örneği
$key = random_bytes(32); // 256-bit anahtar
$iv = random_bytes(openssl_cipher_iv_length('aes-256-gcm'));
$data = "Gizli Kullanıcı Verisi";

$encrypted = openssl_encrypt($data, 'aes-256-gcm', $key, 0, $iv, $tag);

// Veritabanına kaydedilecek format: iv + tag + encrypted_data
$storage = base64_encode($iv . $tag . $encrypted);

Yukarıdaki örnekte, veriyi veritabanına göndermeden önce şifreliyoruz. iv (Initialization Vector) ve tag, verinin şifresini çözmek için gereklidir; bu yüzden bunları veritabanında şifrelenmiş veriyle birlikte saklamalısınız.

Parola Şifreleme: Hashleme vs Şifreleme

Parolalar asla şifrelenmemeli, aksine "hash"lenmelidir. Şifreleme geri döndürülebilir, ancak hashleme tek yönlü bir işlemdir. 2026 yılı itibarıyla Argon2id algoritması, parola güvenliği için endüstri standardıdır.


// PHP ile Argon2id kullanarak parola hashleme
$password = "KullaniciParolasi123";
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);

// Doğrulama işlemi
if (password_verify($password, $hashedPassword)) {
    echo "Giriş başarılı.";
}

Parolaları veritabanında saklarken mutlaka password_hash gibi yerleşik ve güvenli fonksiyonları kullanın. Asla kendi şifreleme algoritmanızı oluşturmaya çalışmayın.

Veri Şifreleme Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
TDE (Veritabanı Seviyesi) Kolay kurulum, şeffaf çalışma Veritabanı yetkilisi veriyi görür
Uygulama Seviyesi Yüksek güvenlik, uçtan uca koruma Kod karmaşıklığı artar
Hashing (Argon2) Parolalar için en güvenli yöntem Geri döndürülemez

Güvenli Anahtar Yönetimi

Şifreleme anahtarlarınızı kod içerisinde (hard-coded) asla saklamayın. Anahtarları bir "Environment" dosyasında veya HashiCorp Vault gibi bir anahtar yönetim sisteminde tutmalısınız.


// .env dosyasından anahtar okuma örneği
$encryptionKey = getenv('APP_ENCRYPTION_KEY');

// Anahtarın varlığını kontrol et
if (!$encryptionKey) {
    throw new Exception("Şifreleme anahtarı tanımlanmamış!");
}

Kritik Uyarı: Şifreleme anahtarınızı kaybederseniz, veritabanındaki verilerinize bir daha asla erişemezsiniz. Anahtarlarınızı güvenli bir şekilde yedeklediğinizden emin olun.

Sıkça Sorulan Sorular

Veritabanında şifrelenmiş veriyi nasıl arayabilirim?

Veriler şifrelendiğinde, veritabanı seviyesinde "LIKE" veya "WHERE" sorguları yapamazsınız. Arama yapmanız gerekiyorsa, verinin şifrelenmemiş bir versiyonunu (hashlenmiş veya maskelenmiş) ayrı bir sütunda tutmanız gerekebilir.

AES-256 yeterince güvenli mi?

Evet, AES-256 günümüzde askeri standartlarda kabul edilen en güvenli simetrik şifreleme algoritmalarından biridir. Doğru uygulandığı sürece (GCM modu ile) kırılması imkansıza yakındır.

Şifreleme veritabanını yavaşlatır mı?

Evet, her okuma ve yazma işleminde CPU kullanımı artacaktır. Ancak modern işlemcilerdeki AES-NI komut setleri sayesinde bu performans kaybı çoğu uygulama için ihmal edilebilir düzeydedir.

Veritabanı yedeğini şifrelemeli miyim?

Kesinlikle. Veritabanı yedeği, ana veritabanından daha savunmasız olabilir. Yedek dosyalarınızı şifrelemek, fiziksel çalınma risklerine karşı son savunma hattınızdır.

Uygulamamda SSL/TLS kullanıyorum, yine de şifrelemeli miyim?

SSL/TLS sadece verinin taşınması sırasındaki güvenliği sağlar. Veri veritabanına ulaştığında düz metin olarak kalır. Bu nedenle, veritabanı içindeki hassas verileri şifrelemek her zaman gereklidir.

İleri Düzey Şifreleme Stratejileri: Deterministic vs. Probabilistic Şifreleme

Veritabanı uygulamalarında şifreleme yaparken, verinin sorgulanabilirliği ile güvenliği arasında bir denge kurmanız gerekir. İki ana yaklaşım olan Deterministic (Belirleyici) ve Probabilistic (Olasılıksal) şifreleme yöntemleri, veritabanı performansınızı ve güvenlik seviyenizi doğrudan etkiler.

Deterministic Şifreleme (Eşitlik Aramaları İçin)

Aynı düz metin (plaintext) her zaman aynı şifreli metni (ciphertext) üretir. Bu yöntem, veritabanında WHERE email = '...' gibi eşitlik sorguları yapmanıza olanak tanır. Ancak, aynı verilerin aynı şifreli karşılığa sahip olması, saldırganların frekans analizi yaparak veriyi tahmin etmesini kolaylaştırabilir.

Probabilistic Şifreleme (Yüksek Güvenlik İçin)

Her şifreleme işleminde benzersiz bir Initialization Vector (IV) veya Salt kullanılır. Aynı veri iki kez şifrelense bile sonuçlar tamamen farklıdır. Bu, veritabanında doğrudan arama yapmayı imkansız kılar; arama yapmak için veriyi önce çekip uygulama tarafında çözmeniz gerekir.

Şifreli Veritabanlarında Performans Optimizasyonu ve İndeksleme

Verileri şifrelediğinizde, veritabanı motoru verinin gerçek değerini bilmediği için standart B-Tree indeksleri verimsizleşir. Şifreli veriler üzerinde performanslı çalışmak için aşağıdaki stratejileri izleyebilirsiniz:

  • Blind Indexing (Kör İndeksleme): Şifrelenmiş verinin bir "hash" değerini (örneğin HMAC-SHA256) ayrı bir sütunda saklayın. Arama yaparken, aranan değerin hash'ini hesaplayıp bu sütun üzerinden sorgulama yapın.
  • Veri Tipi Seçimi: Şifrelenmiş veriler genellikle VARBINARY veya BLOB formatında saklanır. Bu veri tiplerinin indekslenmesi standart VARCHAR indekslerinden daha fazla bellek tüketir.
  • Kısmi Şifreleme: Tüm sütunu şifrelemek yerine, sadece hassas olan kısımları (örneğin kredi kartının son 4 hanesi hariç tamamını) şifreleyerek indekslenebilirliği koruyun.

Aşağıdaki örnekte, bir "Kör İndeks" (Blind Index) oluşturarak şifreli veride nasıl hızlı arama yapabileceğinizi görebilirsiniz:

-- Örnek: Kullanıcı e-postası için kör indeksleme stratejisi
-- 'email_encrypted' sütunu AES-256 ile şifrelenmiştir.
-- 'email_blind_index' sütunu ise HMAC(email, secret_key) değerini tutar.

-- Arama yaparken:
-- 1. Uygulama tarafında aranan email'in HMAC değerini hesapla.
-- 2. Sorguyu bu değer üzerinden çalıştır.

SELECT * FROM users 
WHERE email_blind_index = 'a1b2c3d4e5f6g7h8i9j0...'; 

-- Bu yöntem, verinin kendisini açmadan (decrypt) hızlıca bulmanızı sağlar.

Şifreleme Süreçlerinde Hata Ayıklama (Debugging)

Şifreleme süreçlerinde en sık karşılaşılan hatalar genellikle anahtar uyuşmazlıkları ve IV (Initialization Vector) yönetimidir. Hata ayıklama sırasında şu adımları izleyin:

  1. Anahtar Rotasyonu Kontrolü: Eğer veritabanında eski bir anahtarla şifrelenmiş veri varsa, yeni anahtara geçişte (re-keying) verinin bozulmadığından emin olun.
  2. Base64 Kodlaması: Şifreli veriyi veritabanına yazarken Base64 formatına çevirdiğinizden emin olun. Aksi takdirde, veritabanı karakter seti (collation) ayarları şifreli bayt dizisini bozabilir.
  3. Loglama: Asla şifreli veriyi veya anahtarları log dosyalarına yazdırmayın. Sadece işlemin başarılı olup olmadığını ve kullanılan algoritma versiyonunu kaydedin.

Veritabanı şifreleme projelerinde, şifreleme anahtarının (Master Key) uygulama kodundan ayrı bir Key Management Service (KMS) üzerinde tutulması, hata ayıklama sürecini daha güvenli hale getirir.

Sonuç

Sql & Veritabanı ile uygulamalar için veri şifreleme işlemi, savunma derinliği (defense-in-depth) stratejisinin bir parçasıdır. Parolalar için Argon2id, hassas veriler için AES-256-GCM kullanarak ve anahtarlarınızı güvenli bir şekilde yöneterek, 2026 yılı standartlarında güvenli bir altyapı kurabilirsiniz. Bir sonraki adım olarak, veritabanı erişim loglarını inceleyerek anormal sorguları tespit eden bir izleme sistemi kurmayı düşünebilirsiniz.

Sorumluluk Reddi: Bu makale eğitim amaçlıdır. Uygulama güvenliği karmaşık bir konudur ve yanlış yapılandırma veri kaybına yol açabilir. Üretim ortamlarında uygulama yapmadan önce güvenlik uzmanlarına danışmanız ve kapsamlı testler yapmanız önerilir.

Bu yazıya tepkinizi paylaşın:
Mert Çelik

Hobi ve teknik beceriler üzerine eğitici içerikler kurguluyorum. Okuyucuların günlük hayatta karşılaştığı sorunlara uygulanabilir çözümler sunmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz