içeriğe atla

Şifrelenmiş alanda mükerrer kontrolü: kör indeks

KVKK kapsamında TC kimlik numarasını şifrelemek gerektiğinde ortaya çıkan bir sorun var: AES-256-GCM rastgele nonce kullandığı için aynı TC no her şifrelemede farklı bayt dizisi üretiyor. Bu da veritabanı seviyesinde “bu TC no zaten kayıtlı mı” kontrolünü (UNIQUE kısıtı) imkansız kılıyor — şifreli sütuna göre karşılaştırma yapamıyorsun.

Çözüm “kör indeks” (blind index): şifreli sütunun yanına, anahtarlı bir hash (HMAC-SHA256) tutan ayrı bir sütun ekleniyor. Sorgu bu hash sütunu üzerinden yapılıyor, düz metin hiçbir yerde saklanmıyor.

Burada dikkat çeken bir detay, düz SHA256’nın neden bilinçli olarak reddedildiği:

Düz SHA256 kasıtlı olarak kullanılmıyor: anahtarsız bir hash, rainbow table saldırısına açık olurdu.

TC kimlik numarası uzayı küçük ve belirli bir algoritmaya uyuyor (11 hane, son hane bir kontrol basamağı) — yani anahtarsız hash’lersen olası tüm TC no’ları önceden hesaplayıp bir tabloya koyabilirsin, sonra hash’i o tabloda arayarak düz metni geri çıkarabilirsin. Anahtarlı HMAC bunu engelliyor, çünkü anahtar olmadan tablo önceden hesaplanamıyor.

İkinci detay: hash anahtarı ile şifreleme anahtarının aynı olmaması uygulama başlangıcında zorunlu kılınıyor. İki anahtar aynı olsaydı, birinin sızması ikisini birden çökertirdi.

Bunu neden önemsiyorum: “şifreledik, güvenli” cümlesi genelde yeterli sanılıyor. Ama şifreleme ile aranabilirlik birbiriyle gerilim içinde — birini çözerken diğerini kırmamak ayrı bir tasarım kararı gerektiriyor.