
Wed Oct 07 2026

Hazırsan başlayalım 🚀
Bir veri hattında hassas kişisel veriler (PII) — TC kimlik numarası, e‑posta, telefon — saklıyorsunuz.
Güvenlik gereği bu verileri şifrelemek istiyorsunuz, ama aynı zamanda:
Basit bir tek yönlü şifreleme (AES‑GCM, RSA vb.) uygularsanız veriler karışık bir blob haline gelir.
Sonuç? Arama imkansız hale gelir ❌
Deterministik / Format‑Preserving Encryption (FPE)
WHERE email = ? gibi sorgular çalışır.Searchable Encryption / Blind Index
Tokenization
Hybrid Yaklaşım
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Deterministik / FPE | İndekslenebilir, hızlı arama | Aynı verinin tekrarı görünür (pattern leakage) |
| Blind Index (HMAC) | Güvenli, indeksli, pattern leakage azalır | Ekstra kolon + key yönetimi |
| Tokenization | Veri asla veritabanında yok | Vault erişimi gerekir, ekstra latans |
| Hybrid | Güvenlik‑performans dengesi | Tasarım karmaşıklığı artar |
Bu bölümde sorunu tanıdık, basit şifrelemenin aramayı nasıl kırdığını gördük ve arama yeteneğini koruyan ana stratejileri özetledik.
Sonraki kısımda bu yöntemlerden birini (ör. Blind Index) adım adım kodlayarak nasıl entegre edeceğimizi görelim 🛠️
Hazırsan bu konuyu da beraber çözelim. Basit şifreleme (örneğin AES ile bir alanı tek başına şifrelemek) ilk bakışta "güvenli" görünse de, gerçek hayatta ciddi kayıplar getiriyor. 🎯
Veritabanında bir kolonu şifrelediğinizde, o veri artık anlamsız bir bayt dizisi haline gelir.
SELECT * FROM users WHERE email = 'ahmet@ornek.com' sorgusu artık sonuç vermez ⛔LIKE '%@ornek.com' gibi kısmi aramalar da işe yaramazNe oluyor burada?
Veriyi okumak için her satırı çekip, uygulama katmanında şifresini çözmeniz (decrypt) gerekiyor. Bu da:
Her iki yönetmelik de "veri sahibinin hakları" konusunda net: erişim, düzeltme, silme hakları vardır.
| Senaryo | Basit şifrelemeyle durum |
|---|---|
| Kullanıcı "verilerimi göster" derse | Tüm tablo çekilip decrypt edilmek zorunda 😰 |
| "E-postamı sil" derse | Arama yapılamadığı için hepsini tarayıp bulman gerekir |
| Denetim (audit) gelirse | "Bu veriyi nasıl buldunuz?" sorusuna cevap vermek zordur 📋 |
Özetle: Basit şifreleme, veriyi korur ama yönetilemez hale getirir. 🛠
| Kazanç | Kayıp |
|---|---|
| Veri sızıntısında okunamazlık ✅ | Arama, filtreleme, raporlama yok ❌ |
| Basit uygulama ✅ | Uygulama katmanı karmaşıklığı artar (her yerde decrypt) ❌ |
| — | İndeks kullanılamaz, full table scan kaçınılmaz ❌ |
| — | Yedek/arşiv okunamaz hale gelebilir ❌ |
Diyelim ki users tablosunda email kolonunu AES-256 ile şifrelediniz.
-- Veritabanında şu duruyor:
id | email_encrypted
---|----------------
1 | 0xA3F2... (binary blob)
2 | 0x7B9C...
Artık şunları YAPAMAZSINIZ:
WHERE email = 'ayse@sirket.com' → Sonuç yok ⛔WHERE email LIKE '%@sirket.com' → Çalışmaz ⛔ORDER BY email → Anlamsız sıralama ⛔UNIQUE constraint → Veritabanı düzeyinde zorlanamaz ⛔Ne yapmalıyız?
Bu durumda şifreli arama (searchable encryption), deterministik şifreleme (deterministic encryption) veya tokenizasyon gibi yöntemlere ihtiyacımız var. Ama onlar da kendi getirdikleri risklerle beraber... 😉
Kısa özet: Basit şifreleme "veriyi gizler" ama "veriyi kullanamaz" hale getirir. KVKK/GDPR süreçlerinde kanıtlanabilir erişim ve hızlı yanıt gerektiğinde bu yöntem sizi zor durumda bırakır. ❗️
Veritabanında şifreli veriler üzerinde arama yapmak, klasik "encrypt-then-store" mantığıyla çelişiyor. Çünkü şifreleme veriyi karıştırır, sıralama ve eşleştirme imkansız hale getirir. Peki ya kullanıcı "email = 'ayse@example.com'" diye arama yapmak istiyorsa? 🤔
İşte bu noktada devreye arama destekli şifreleme (searchable encryption) yaklaşımları giriyor. Hangi yöntemi ne zaman kullanacağını bilmek, hem güvenlik hem de performans açısından kritik. Hadi üç ana tekniği tek tek inceleyelim 👇
Mantık: Asıl veriyi (ör. e-posta) güçlü bir şifrelemeyle (AES-GCM) saklarsın. Arama için ayrı bir deterministik "blind index" oluşturursun — bu indeks, verinin kendisinden değil, bir keyed hash'ten (HMAC veya Argon2id) türetilir.
Kullanıcı Verisi → Şifrele (AES-GCM) → Depola
Kullanıcı Verisi → HMAC(secret_key, veri) → Blind Index → İndeksle (B-tree / Hash Index)
Arama Sorgusu → HMAC(secret_key, sorgu) → Index Lookup → Eşleşen Satırları Getir → Şifreleri Çöz
Nasıl çalışıyor?
HMAC(secret, "ayse@example.com") her zaman aynı çıktüyü verir → eşitlik sorgusu (WHERE blind_idx = ?) çalışır.secret_key sadece uygulama sunucusunda रहता; veritabanı sızsa bile indeks tersine çevrilemez (rainbow table koruması için per-user salt veya pepper eklenebilir).Ne zaman uygun?
ORDER BY), aralık sorgusu (BETWEEN), LIKE gerekmiyorsa.Dikkat ⚠️
Mantık: Aynı plaintext her zaman aynı ciphertext'i üreten bir şifreleme modu (ör. AES-SIV, AES-GCM-SIV veya AES-ECB asla kullanma!). Böylece veritabanı indeksi doğrudan ciphertext üzerinde kurulabilir.
# Basit bir gösterim (production'da AES-GCM-SIV veya libsodium crypto_aead_det_xchacha20poly1305 kullan)
from cryptography.hazmat.primitives.ciphers.aead import AESGCMSIV
key = b"32-bytes-very-secret-key-123456" # 32 byte
aad = b"user-email-column" # Associated Authenticated Data
def encrypt_deterministic(plaintext: bytes) -> bytes:
# AES-GCM-SIV: deterministic, nonce-reuse resistant
return AESGCMSIV(key).encrypt(b"", plaintext, aad) # nonce boş → deterministik
def decrypt_deterministic(ciphertext: bytes) -> bytes:
return AESGCMSIV(key).decrypt(b"", ciphertext, aad)
Ne zaman uygun?
Dikkat ⚠️
LIKE yok.Mantık: Veriyi şifreli halde bırakıp, arama/filtreleme mantığını da şifreli alanda çalıştıran matematiksel şema. En güçlü (ve en yavaş) yöntem.
Kullanıcı Verisi → FHE.Encrypt(pk) → Ciphertext (ör. CKKS / TFHE-2 şeması)
Arama Sorgusu → FHE.Encrypt(pk) → Encrypted Query
Sunucu → FHE.Eval(circuit, ciphertext, query) → Encrypted Result
İstemci → FHE.Decrypt(sk) → Sonuç (plaintext)
Ne zaman uygun?
WHERE age > 30 AND salary BETWEEN 5000 AND 10000.Dikket ⛔
| Özellik | Blind Indexing | Deterministic Enc. | FHE |
|---|---|---|---|
| Desteklenen Sorgu | = (eşitsiz) |
=, JOIN |
=, >, <, BETWEEN, LIKE, agg. |
| Performans | 🚀 Çok hızlı (standart index) | 🚀 Hızlı (standart index) | 🐢 Çok yavaş (ms–sn–dk) |
| Depolama Ek Maliyeti | +1 sütun (32–64 B) | Yok (tek sütun) | 📈 100–1000x |
| Güvenlik Modeli | Sunucu indeks görür (HMAC) | Sunucu ciphertext görür | Sunucu hiçbir şey öğrenmez |
| Frekans Analizi Riski | Orta (salt/pepper ile azalır) | Yüksek | Yok |
| Anahtar Yönetimi | Uygulama tarafında secret | Uygulama tarafında key | Client-side key (pk/sk) |
| Uygulama Kolaylığı | ✅ Kolay (ORM hook ile) | ✅ Orta | ❌ Zor (özel schema/kütüphane) |
| Tipik Kullanım | PII arama (email, TC, telefon) | FK/JOIN kolonları, düşük riskli PII | Gizli analitik, çok kiracılı sıfır güven |
Benim kuralım: Basit başla, ihtiyaç arttıkça yükselt.
flowchart LR
A[Kullanıcı Verisi\n"ayse@example.com"] --> B[AES-GCM Şifreleme]
A --> C[HMAC(secret, veri)\n→ Blind Index]
B --> D[(Veritabanı\nencrypted_email)]
C --> E[(Veritabanı\nemail_blind_idx\n+ B-tree Index)]
F[Arama: "ayse@example.com"] --> G[HMAC(secret, sorgu)]
G --> H[Index Lookup\nWHERE email_blind_idx = ?]
H --> I[Eşleşen Row ID'ler]
I --> J[encrypted_email'i Çek]
J --> K[AES-GCM Çözme]
K --> L[Sonuç Dön]
Ne oluyor burada?
secret ile blind index'e dönüştürülür.Hangi yaklaşımı seçeceğine karar verirken tehdit modelini (kim ne görüyor?), sorgu karmaşıklığını (ne arıyorsun?) ve performans bütçeni (ne kadar gecikme tolere edersin?) yan yana koy. Çoğu ekip için Blind Indexing "iyi yeterince" güvenli ve operasyonel kolaylık sağlar. Daha ileri ihtiyaçlarda yukarı doğru tırmanırsın 🎯
Merhaba! 👋 Hazırsan veri hattımızı adım adım inceleyelim. Düşün senin elinde bir veri akışı var: kaynak → güvenlik → şifreleme → indeksleme → tüketici. Her katman kendi sorumluluğunda, birbirinden bağımsız ama sorunsuz çalışıyor. Hadi pratik bir örnek üzerinden anlayalım 🚀
Her katman container içinde izole, Docker Compose ile bir arada ayağa kalkıyor. Böylece lokalde tek komutla docker compose up diyorsun ve hat çalışıyor ✨
Aşağıda her servisin çekirdek mantığını gösteren mini bir Python snippet var. Gerçek projede tabii ki daha fazla hata yakalama, loglama, config yönetimi eklersin.
# encryption_service/app.py
import os
from cryptography.fernet import Fernet
KEY = os.getenv("ENCRYPTION_KEY") # 32‑byte base64
fernet = Fernet(KEY.encode())
def encrypt(payload: bytes) -> bytes:
return fernet.encrypt(payload)
def decrypt(token: bytes) -> bytes:
return fernet.decrypt(token)
if __name__ == "__main__":
# Basit test
data = b"gizli veri"
enc = encrypt(data)
print("Encrypted:", enc)
print("Decrypted:", decrypt(enc))
# indexer_service/app.py
import json
from elasticsearch import Elasticsearch
es = Elasticsearch(os.getenv("ES_URL", "http://elasticsearch:9200"))
def index_document(index: str, doc: dict):
resp = es.index(index=index, document=doc)
return resp["_id"]
if __name__ == "__main__":
sample = {"message": "merhaba dünya", "timestamp": "2024-01-01T00:00:00Z"}
doc_id = index_document("logs", sample)
print("Indexed with id:", doc_id)
# consumer_service/app.py
import pika, json
def callback(ch, method, properties, body):
payload = json.loads(body)
print("📥 Consumer received:", payload)
# Burada iş mantığın olur (DB yaz, bildirim gönder, vs.)
ch.basic_ack(delivery_tag=method.delivery_tag)
def main():
conn = pika.BlockingConnection(pika.ConnectionParameters("rabbitmq"))
channel = conn.channel()
channel.queue_declare(queue="processed_data", durable=True)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue="processed_data", on_message_callback=callback)
print("🚀 Consumer waiting for messages...")
channel.start_consuming()
if __name__ == "__main__":
main()
version: "3.9"
services:
# 1️⃣ Güvenlik katmanı (ör. OAuth2 Proxy) – basit bir placeholder
auth-proxy:
image: oauth2-proxy/oauth2-proxy:latest
environment:
OAUTH2_PROXY_PROVIDER: "oidc"
OAUTH2_PROXY_OIDC_ISSUER_URL: "https://auth.example.com"
OAUTH2_PROXY_CLIENT_ID: "${CLIENT_ID}"
OAUTH2_PROXY_CLIENT_SECRET: "${CLIENT_SECRET}"
ports:
- "4180:4180"
depends_on:
- encryption-service
# 2️⃣ Şifreleme servisi
encryption-service:
build: ./encryption_service
environment:
ENCRYPTION_KEY: "${ENCRYPTION_KEY}"
expose:
- "8000"
depends_on:
- indexer-service
# 3️⃣ İndeksleme servisi
indexer-service:
build: ./indexer_service
environment:
ES_URL: "http://elasticsearch:9200"
expose:
- "8001"
depends_on:
- elasticsearch
# 4️⃣ Tüketici servisi
consumer-service:
build: ./consumer_service
environment:
RABBITMQ_HOST: "rabbitmq"
depends_on:
- rabbitmq
# Altyapı bileşenleri
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
volumes:
- esdata:/usr/share/elasticsearch/data
rabbitmq:
image: rabbitmq:3.13-management
ports:
- "5672:5672"
- "15672:15672"
volumes:
- rmqdata:/var/lib/rabbitmq
volumes:
esdata:
rmqdata:
Ne oluyor burada?
depends_on).auth-proxy trafiği yakalayıp kimlik doğrulaması yapıyor, sonra encryption-service’e yönlendiriyor.indexer-service’e gidip Elasticsearch’e yazılıyor.consumer-service kuyruktan (RabbitMQ) alıp işliyor.[Client] → (HTTPS) → [auth-proxy] → [encryption-service] → [indexer-service] → [Elasticsearch]
↓
[RabbitMQ] ← [consumer-service]
service isimleriyle birebir eşleşir.Bu yapı küçük başlangıç için yeterli; ileride her servisi ayrı namespace’lere, Helm chart’larına, CI/CD pipeline’larına bölebilirsin. 🎉
İpucu: .env dosyana ENCRYPTION_KEY, CLIENT_ID, CLIENT_SECRET gibi sırları koy, repoya asla commit etme! 🔐
Hadi şimdi docker compose up -d diyip hatı canlıya alalım 🚢
Performans ve güvenlik arasında denge kurmak, veri hattınızın can damarıdır 🎯.
Her ekstra şifreleme katmanı gecikme getirir; ama hangi gecikmeyi tolere edebilirsiniz?
Deterministik şifreleme (ör. AES‑GCM, SIV) → ≈ 5 ms gecikme.
Tam Homomorfik Şifreleme (FHE) → ≈ 1 500 ms gecikme.
Ara çözümler (Örn. Order‑Preserving Encryption, Secure Enclaves) → 10‑100 ms aralığı.
Kural: Gecikme bütçenizi ölçün, ardından o bütçeye sığan en güçlü şifrelemeyi seçin.
| Senaryo | Tercih Edilen Teknik | Neden? |
|---|---|---|
| Gerçek‑zamanlı mesajlaşma, IoT telemetri | Deterministik / AEAD | < 10 ms gecikme, yüksek throughput |
| Kullanıcı verilerini analiz etmeden işleme (ML inference) | FHE / MPC | Veri asla açık olmaz, batch işlem toleranslı |
| Arama / sıralama gereken veritabanı sorguları | Order‑Preserving / Structured Encryption | Sorgu performansı korunur, kısmi gizlilik yeterli |
| Çok hassas finansal raporlama, nadir çalışan batch | FHE | Maksimum gizlilik, gecikme kabul edilebilir |
Aşağıdaki Python benchmark betiği fikri, iki yöntemin (deterministik vs. FHE simülasyonu) ortalama gecikmesini karşılaştırmanıza yardımcı olur. Gerçek FHE kütüphanesi yerine time.sleep ile gecikme taklit edilmiştir; üretimde pyfhel, concrete vb. kullanılabilir.
import time
import statistics
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
# ---------- Deterministik şifreleme (AES‑GCM) ----------
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
nonce = b"123456789012" # 12 byte nonce (gerçekte rastgele olmalı)
plaintext = b"benchmark data " * 100 # ~1.6 KB
def encrypt_aesgcm():
return aesgcm.encrypt(nonce, plaintext, None)
# ---------- FHE benzetimi (yüksek gecikme) ----------
def encrypt_fhe_sim():
# Gerçek FHE çağrısı buraya gelecek; şimdilik 1.5 s bekle
time.sleep(1.5)
return b"fake‑ciphertext"
# ---------- Benchmark yardımcı fonksiyonu ----------
def benchmark(func, runs=30):
latencies = []
for _ in range(runs):
start = time.perf_counter()
func()
latencies.append((time.perf_counter() - start) * 1000) # ms
return {
"ort": statistics.mean(latencies),
"medyan": statistics.median(latencies),
"stdev": statistics.stdev(latencies) if runs > 1 else 0,
}
if __name__ == "__main__":
print("🔐 AES‑GCM (deterministik) benchmark:")
print(benchmark(encrypt_aesgcm))
print("\n🧮 FHE simülasyonu benchmark:")
print(benchmark(encrypt_fhe_sim))
Bu sayede ne oluyor?
runs sayısı değiştirip senaryonuza en uygun tekniği veriyle kanıtlayabilirsiniz.Sonuç: Performans ve güvenlik birbirinin zıddı değil, doğru araç setiyle dengelenebilir bir sistem kurabilirsiniz ✅.
Hazırsan başlayalım 🚀
Deterministik şifreleme, aynı girdi için her zaman aynı şifreleme sonucunu üretir. Bu sayede verileri arama / eşleştirme amacıyla indeksleyebiliriz, ama yine de düz metin olarak saklamamış oluruz.
WHERE email_enc = ? gibi sorgular çalıştırırsınız.record_id), böylece aynı değer farklı kayıtlarda farklı görünmez; ancak global salt kullanırsanız rainbow‑table saldırısı riski artar. Dikkatli olun ❗️import os
import json
import base64
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
# ------------------------------
# Yardımcı: AES‑ECB (deterministik) + PKCS7 padding
# ------------------------------
def _aes_encrypt_deterministic(key: bytes, plaintext: bytes) -> bytes:
"""
Aynı plaintext + aynı key → her zaman aynı ciphertext.
ECB modu deterministik olur; IV kullanmıyoruz.
"""
# PKCS7 padding (block size = 16)
pad_len = 16 - (len(plaintext) % 16)
padded = plaintext + bytes([pad_len]) * pad_len
cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend())
encryptor = cipher.encryptor()
return encryptor.update(padded) + encryptor.finalize()
# ------------------------------
# Ana fonksiyon: alan şifrele + indeks oluştur
# ------------------------------
def encrypt_and_index(record: dict, field: str, master_key: bytes, record_id: str) -> tuple[dict, dict]:
"""
Args:
record : Orijinal kayıt (ör. {"email": "ali@example.com"})
field : Şifrelenecek alan adı ("email")
master_key : 32‑byte AES‑256 anahtarı (gizli, ortak değil!)
record_id : Kayıt için benzersiz kimlik (UUID, PK vb.)
Returns:
encrypted_record : Alanı şifrelenmiş haliyle yeni dict
index_dict : {field: {ciphertext_b64: record_id}} yapısı
"""
# 1️⃣ Record‑specific salt = record_id (deterministik)
# Burada master_key'i doğrudan kullanıyoruz; isterseniz HKDF ile türetebilirsiniz.
key = master_key # basitlik için; prod’da key derivation önerilir
# 2️⃣ Alan değerini al ve bytes’a çevir
plain_value = record[field].encode("utf-8")
# 3️⃣ Deterministik şifrele
cipher_bytes = _aes_encrypt_deterministic(key, plain_value)
cipher_b64 = base64.urlsafe_b64encode(cipher_bytes).decode("ascii")
# 4️⃣ Yeni kayıt oluştur (orijinal alan yerine ciphertext)
encrypted_record = record.copy()
encrypted_record[field] = cipher_b64
# 5️⃣ İndeks sözlüğü: ciphertext → record_id
index_dict = {field: {cipher_b64: record_id}}
return encrypted_record, index_dict
# ------------------------------
# 🎯 Kullanım örneği
# ------------------------------
if __name__ == "__main__":
# 32‑byte (256‑bit) master key — **gerçek ortamda güvenli bir vault’tan alınmalı!**
MASTER_KEY = os.urandom(32)
veri = {"email": "ali@example.com"}
record_id = "rec-001"
sifreli, indeks = encrypt_and_index(veri, "email", MASTER_KEY, record_id)
print("🔐 Şifrelenmiş kayıt :", json.dumps(sifreli, ensure_ascii=False))
print("📇 İndeks :", json.dumps(indeks, ensure_ascii=False))
encrypt_and_index fonksiyonu hem şifrelenmiş kaydı hem de arama indeksini döndürür.{"email": {"<ciphertext_b64>": "rec-001"}} şeklinde tutulduğunda, veritabanında email_enc kolonu üzerinden O(1) arama yaparsınız.Artık elinizde deterministik şifreleme + indeks çifti var. Keyifli kodlamalar! ✅
Veri hattında PII (kişisel tanımlayıcı veri) şifrelemek, hem GDPR hem de KVKK’nın “veri güvenliği” ve “veri sahibi hakları” maddelerini karşılamanın en doğrudan yoludur 🎯. Şifreleme sayesinde veri sızsa bile anlamlı olmaz; bu da ceza riskini ve itibar kaybını büyük oranda azaltır ✅.
Kısaca: Veriyi şifrelemek yetmez; kim ne zaman çözebilir ve veri sahibi hakları nasıl desteklenir sorularına teknik cevap veren bir mimari kurun.
Aşağıdaki maddeler, veri hattı akışınızı denetim (audit) öncesinde tek tek taramak için kullanabileceğiniz bir şablondur. Her madde için “Yapıldı / Yapılmadı / Kısmi” durumunu not edin ve kanıt (log, policy, test sonucu) toplayın.
{
"auditChecklist": [
{
"id": "A-01",
"title": "Etki Analizi (DPIA) Tamamlandı mı?",
"status": "Yapıldı",
"evidence": "DPIA raporu v1.3, tarih: 2024-03-12"
},
{
"id": "A-02",
"title": "Gizlilik Politikası Güncellendi mi?",
"status": "Yapıldı",
"evidence": "Web sitesi gizlilik politikası v2.1, onay tarihi: 2024-04-01"
},
{
"id": "A-03",
"title": "PII Şifreleme Stratejisi Belgelendi mi?",
"status": "Kısmi",
"evidence": "Şifreleme mimari diyagramı (v0.9), anahtar rotasyon planı eksik"
},
{
"id": "A-04",
"title": "Deterministik Şifreleme Kullanımı Test Edildi mi?",
"status": "Yapılmadı",
"evidence": ""
},
{
"id": "A-05",
"title": "Anahtar Yönetimi (KMS/HSM) Yapılandırıldı mı?",
"status": "Yapıldı",
"evidence": "AWS KMS key policy, rotasyon 90 gün, erişim logları CloudTrail"
},
{
"id": "A-06",
"title": "Veri Sahibi Hak Talep Süreci Otomatikleştirildi mi?",
"status": "Kısmi",
"evidence": "Silme API v1.0 hazır, düzeltme/hak erişim API’si geliştirme aşamasında"
},
{
"id": "A-07",
"title": "Denetim İzleri (Audit Logs) Saklanıyor mu?",
"status": "Yapıldı",
"evidence": "Elasticsearch cluster, 12 aylık retention, immutable index"
},
{
"id": "A-08",
"title": "Üçüncü Taraf Paylaşımları Sözleşmelerle Kapsandı mı?",
"status": "Yapıldı",
"evidence": "DPA imzalı tedarikçi listesi (PDF, 2024-02-20)"
}
]
}
Hazırsanız bu checklist’i bir sonraki sprintte Definition of Done’a ekleyin ve denetim günü geldiğinde “Her şey yolunda, kanıtlar burada” diyebilecek duruma gelin ✅.
Hazırsan kısaca özetleyelim 🎯
Bu yazıda şunları gördük:
❗️ Kritik nokta: Şifreleme bir "ekstra" değil, varsayılan olmalı. Arama özelliğini korurken veri hattı şifrelemesini başarmak, doğru araç seti ve mimari kararlarıyla tamamen mümkün.
Hadi iş başa:
Şimdi, istediğiniz arama özelliğini korurken veri hattı şifrelemeyi nasıl başlatabileceğinizi öğrenin.
✅ Başarılı olursun: Veri sızması riski düşer, compliance kutucuğu dolur, arama hızı aynı kalır.
Makalede Desteklenen Yüksek Performanslı Aramalara Dalacağız — şifreli veriler üzerinde full-text search, fuzzy matching ve range query nasıl yapılır, hangi kütüphaneler (Bleve, Tantivy, OpenSearch plugins) işinize yarar ve benchmark sonuçları ne diyor? Görüşmek üzere! 👋
Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.
All rights reserved