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

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

Gereksinimler ve Ön Hazırlık

Bu uygulamayı gerçekleştirmek için modern bir veritabanı yönetim sistemi (PostgreSQL veya MySQL önerilir) ve uygulama katmanında şifreleme işlemlerini yönetecek bir programlama dili (Node.js, Python veya PHP gibi) gereklidir. Şifreleme işlemleri için kullanılan kütüphanelerin güncel olması, güvenlik açıklarından korunmak adına kritik öneme sahiptir.

  • Veritabanı: PostgreSQL 16+ veya MySQL 8.0+
  • Dil: Node.js (Crypto modülü) veya Python (Fernet/Cryptography kütüphanesi)
  • Anahtar Yönetimi: Çevresel değişkenler (.env dosyası) veya AWS KMS gibi bir servis

Adım 1: Şifreleme Stratejisini Belirleme

Veri şifreleme katmanını oluştururken "at-rest" (durağan veri) şifrelemesini hedeflemelisiniz. Veritabanı seviyesinde şifreleme yerine uygulama katmanında şifreleme (Application-Level Encryption), veritabanı yöneticisi veya SQL enjeksiyonu üzerinden veriye erişen kişilerin veriyi ham haliyle görmesini engeller. Aşağıdaki tabloda yöntemlerin karşılaştırmasını görebilirsiniz.

Yöntem Avantaj Dezavantaj
Veritabanı Seviyesi Kolay kurulum DB erişimi olan herkes veriyi görür
Uygulama Katmanı Yüksek güvenlik Kod karmaşıklığı artar
TDE (Transparent) Performans Yalnızca fiziksel disk koruması

Adım 2: Simetrik Şifreleme İçin Anahtar Yönetimi

Şifreleme anahtarlarınızı asla kodun içine gömmeyin. Anahtar, verinin güvenliğini belirleyen en önemli unsurdur. Anahtarı güvenli bir ortam değişkeninde tutmalı ve rotasyon (anahtar değiştirme) politikanız olmalıdır.

// .env dosyasında anahtar yönetimi
// Anahtar 32 bayt uzunluğunda olmalıdır (AES-256 için)
ENCRYPTION_KEY=64_karakterlik_cok_gizli_bir_anahtar_dizisi_buraya
IV_LENGTH=16

Bu anahtar, veriyi şifrelemek ve çözmek için kullanılacak temel bileşendir. Anahtarın sızması durumunda tüm verileriniz risk altına girer.

Adım 3: Uygulama Katmanında Şifreleme Fonksiyonu

Veriyi veritabanına göndermeden önce şifreleyen bir yardımcı sınıf veya fonksiyon oluşturmalısınız. Burada AES-256-CBC algoritmasını kullanarak veriyi şifreleyeceğiz. Aşağıdaki örnek, Node.js kullanılarak oluşturulmuş bir şifreleme katmanı örneğidir.

const crypto = require('crypto');

function encrypt(text) {
    const iv = crypto.randomBytes(16); // Initialization Vector
    const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(process.env.ENCRYPTION_KEY), iv);
    let encrypted = cipher.update(text);
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    return iv.toString('hex') + ':' + encrypted.toString('hex');
}

Burada kullanılan IV (Initialization Vector), aynı verinin her seferinde farklı şifreli metin üretmesini sağlar. Bu, saldırganların veriler arasındaki örüntüleri (pattern) analiz etmesini zorlaştırır.

Adım 4: Veritabanı Katmanında Veri Saklama ve SQL Enjeksiyonu

Şifrelenmiş veriyi veritabanına kaydederken, veritabanı sütun tipinizin TEXT veya VARCHAR olduğundan emin olun. Şifreli veri binary formatta olabileceği için base64 veya hex formatına çevrilmesi gerekebilir.

Kritik Uyarı: Şifrelenmiş verileri asla ham SQL sorguları içine doğrudan yazmayın. SQL enjeksiyonu riskine karşı her zaman "Prepared Statements" (hazırlanmış ifadeler) kullanın.
// Hatalı: const query = "INSERT INTO users (data) VALUES ('" + encryptedData + "')";
// Doğru: Prepared Statement kullanımı
const query = 'INSERT INTO user_data (secret_info) VALUES ($1)';
await db.query(query, [encryptedData]);

Adım 5: Veri Okuma ve Şifre Çözme İşlemi

Veriyi veritabanından çektikten sonra, uygulama katmanında tekrar çözmeniz gerekir. Bu işlem, kullanıcının veriyi görmesi gereken yetkili bir işlem olduğunda tetiklenmelidir.

function decrypt(text) {
    const textParts = text.split(':');
    const iv = Buffer.from(textParts.shift(), 'hex');
    const encryptedText = Buffer.from(textParts.join(':'), 'hex');
    const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(process.env.ENCRYPTION_KEY), iv);
    let decrypted = decipher.update(encryptedText);
    decrypted = Buffer.concat([decrypted, decipher.final()]);
    return decrypted.toString();
}

Bu fonksiyon, veritabanından gelen IV:EncryptedData formatındaki veriyi parçalar ve orijinal haline döndürür.

Adım 6: Güvenlik Denetimi ve Yaygın Hatalar

Şifreleme katmanı oluştururken yapılan en yaygın hata, şifreleme anahtarını veritabanı ile aynı sunucuda veya aynı dosyada tutmaktır. Ayrıca, şifreleme algoritması olarak MD5 veya SHA-1 gibi hash algoritmalarını şifreleme amacıyla kullanmak (bunlar tek yönlüdür, geri döndürülemez) büyük bir hatadır.

Yaygın hatalar:

  • Sabit IV (Initialization Vector) kullanmak.
  • Anahtarı kod içinde "hard-coded" bırakmak.
  • Veritabanı yedeklerini şifrelemeyi unutmak.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) şifreleme anahtarlarınızı yönetmek için HashiCorp Vault veya AWS KMS gibi profesyonel anahtar yönetim servislerini kullanmanız tavsiye edilir.

Sıkça Sorulan Sorular

Şifreleme veritabanı performansını düşürür mü?

Evet, her şifreleme ve deşifreleme işlemi ek CPU maliyeti getirir. Ancak modern işlemciler AES-NI komut setleri ile bu işlemleri milisaniyeler içinde yapar. Büyük ölçekli uygulamalarda yalnızca kritik verileri (TCKN, kredi kartı, adres) şifrelemek performansı korumanıza yardımcı olur.

Arama yaparken şifreli veriyi nasıl sorgularım?

Şifreli veriler üzerinde doğrudan LIKE veya WHERE sorgusu yapamazsınız. Arama yapmanız gereken veriler için "Deterministic Encryption" (belirleyici şifreleme) yöntemini kullanabilir veya arama indeksleri için ayrı bir hash sütunu tutabilirsiniz.

Şifreleme anahtarımı kaybedersem ne olur?

Anahtarınızı kaybederseniz, veritabanındaki tüm veriler geri döndürülemez şekilde kaybolur. Anahtarların yedeklenmesi ve güvenli bir şekilde saklanması (Key Escrow) hayati önem taşır.

Veritabanı yedekleri şifreli olmalı mı?

Evet, veritabanı yedeği, asıl veritabanı kadar değerlidir. Yedeklerin şifrelenmesi, yedek dosyalarının çalınması durumunda verinin korunmasını sağlar.

Hangi şifreleme kütüphanesini kullanmalıyım?

Dilinize özel, topluluk tarafından sürekli güncellenen ve "Cryptography" standartlarına uygun (Node için crypto, Python için cryptography, PHP için openssl) kütüphaneleri tercih edin.

İleri Düzey İpuçları: Anahtar Rotasyonu ve Güvenli Depolama

Şifreleme mimarisinin en kritik noktası, anahtarların statik kalmamasıdır. Anahtar rotasyonu, belirli aralıklarla veya bir güvenlik ihlali şüphesinde şifreleme anahtarını değiştirmeyi ifade eder. Bu süreç, veritabanındaki mevcut verilerin yeniden şifrelenmesini gerektirdiği için dikkatli planlanmalıdır.

Anahtar rotasyonu için şu stratejiyi izleyebilirsiniz:

  • Versiyonlama: Veritabanındaki her şifreli satıra, kullanılan anahtarın ID'sini veya versiyonunu tutan ek bir sütun ekleyin.
  • Çift Anahtar Desteği: Uygulamanızda hem eski hem de yeni anahtarı aynı anda okuyabilecek bir mantık kurun. Böylece verileriniz, arka planda yavaşça güncellenirken sistem kesintiye uğramaz.
  • KMS (Key Management Service) Kullanımı: Anahtarları kod içerisinde veya düz metin dosyalarda tutmak yerine, AWS KMS, HashiCorp Vault veya Azure Key Vault gibi servisleri tercih edin.

Şifreleme Performansını Optimize Etme

Veri şifreleme, CPU üzerinde ek yük oluşturur. Özellikle yüksek trafikli uygulamalarda bu yükü minimize etmek için şu yöntemleri uygulayabilirsiniz:

  1. Sadece Hassas Verileri Şifreleyin: Tüm sütunları şifrelemek yerine, sadece KVKK/GDPR kapsamında olan (TCKN, e-posta, telefon, adres) alanları hedefleyin.
  2. İstemci Tarafı Önbellekleme: Sık kullanılan şifreleme anahtarlarını uygulama belleğinde (in-memory) güvenli bir şekilde tutarak, her işlemde anahtar yönetim servisinden anahtar isteme maliyetini düşürün.
  3. Batch İşlemler: Büyük veri setlerini şifrelerken veya çözerken, işlemleri küçük parçalara (batch) bölerek CPU'nun tek bir işlemle kilitlenmesini engelleyin.

Aşağıda, bir anahtar yönetim sisteminden anahtar alırken kullanılan basit bir "Graceful Key Loading" mantığı örneği yer almaktadır:

// Örnek: Anahtarın bellekte tutulması ve periyodik kontrolü
let cachedKey = null;
let lastFetchTime = 0;
const CACHE_DURATION = 3600000; // 1 saat

async function getEncryptionKey() {
    const now = Date.now();
    if (!cachedKey || (now - lastFetchTime > CACHE_DURATION)) {
        // Güvenli bir kasadan anahtarı çek
        cachedKey = await vaultService.fetchSecret('DB_ENCRYPTION_KEY');
        lastFetchTime = now;
    }
    return cachedKey;
}

// Kullanım örneği
async function encryptData(data) {
    const key = await getEncryptionKey();
    return crypto.encrypt(data, key);
}
Dikkat: Şifreleme anahtarlarını asla uygulama loglarına veya hata ayıklama (debug) çıktılarına yazdırmayın. Geliştirme ortamında bile olsa, "Masking" (maskeleme) kütüphaneleri kullanarak hassas verilerin loglanmasını engelleyin.

Test ve Doğrulama Süreçleri

Şifreleme katmanını devreye almadan önce, "Unit Test" aşamasında şu senaryoları mutlaka simüle edin:

  • Yanlış Anahtar Testi: Yanlış bir anahtar ile şifre çözme denemesi yapıldığında sistemin "Decryption Failed" hatasını doğru bir şekilde fırlattığından emin olun.
  • Veri Bütünlüğü: Şifrelenip çözülen verinin, orijinal veriyle birebir aynı (byte-perfect) olduğunu doğrulayın.
  • Performans Testi: 10.000 satırlık bir okuma işleminde şifreleme katmanının eklediği gecikme süresini (latency) ölçün ve kabul edilebilir sınırlar içinde kaldığını teyit edin.

Sonuç

SQL & Veritabanı ile veri şifreleme katmanı oluşturmak, uygulamanızın güvenlik mimarisini bir üst seviyeye taşır. Uygulama katmanında şifreleme yaparak, veritabanı katmanındaki olası sızıntıların etkisini minimize edersiniz. Bir sonraki adım olarak, anahtar rotasyon mekanizmalarını inceleyebilir ve uygulama loglarınızda hassas verilerin asla yer almadığından emin olmak için log maskeleme tekniklerini araştırabilirsiniz.

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

Kendin yap (DIY) projeleri ve teknik tamirat rehberleri konusunda uzmanım. Denenmiş ve test edilmiş yöntemlerle okuyuculara güvenilir bilgiler sunuyorum.

Yorumlar (0)

Yorum Yaz