Blog

Ayrık sandık: oyunuz size neden bağlanamıyor

Oy Sandığı'nda kimin ne oy verdiğini biz de bilemiyoruz. Bu bir söz değil, veritabanının yapısı. Nasıl kurulduğunu ve neyi mümkün kılmadığını anlatıyoruz.

4 dk okuma

Siyasi görüş, KVKK'nın "özel nitelikli kişisel veri" dediği kategoride. Sağlık verisiyle aynı rafta duruyor. Bir ankette kime oy verdiğinizi söylediğinizde, hukukun en korunaklı saydığı bilgilerden birini vermiş oluyorsunuz.

Çoğu anket sitesi bunu şöyle çözer: veriyi toplar, "güvende tutacağız" der, gizlilik metnine bir paragraf yazar. Bu bir sözdür. Sözün sorunu, tutulup tutulmadığının dışarıdan denetlenememesidir — ve veritabanına erişimi olan herkesin sözü tek sorguyla bozabilmesidir.

Biz farklı bir yol seçtik: sözü yapıya gömdük.

İki tablo, aralarında hiçbir bağ yok

Veritabanında iki ayrı tablo var.

voters tablosu yalnızca şunu tutuyor: bu telefon numarasının kısaltılmış bir izi ve "oy kullandı mı" bilgisi. Numaranın kendisi yazılmıyor; geri döndürülemez bir özet (HMAC) yazılıyor. Bu tabloda hangi partiye oy verildiğine dair tek bir alan yok.

ballots tablosu pusulaları tutuyor: hangi parti, hangi il, hangi ilçe, yaş aralığı, cinsiyet, 2023'te ne oy verildiği. Bu tabloda seçmene ait tek bir alan yok — ne numara, ne numara özeti, ne kullanıcı kimliği, ne de voters tablosuna bakan bir satır numarası.

İki tablo arasında yabancı anahtar yok. Ortak sütun yok. Birleştirilebilecekleri bir alan yok.

Sonuç: "Bu numara kime oy verdi?" sorusunun SQL karşılığı yazılamıyor. Yazmayı denerseniz birleştirecek bir şey bulamazsınız. Bu, erişim izniyle çözülebilecek bir kısıt değil; veritabanı yöneticisi de aynı duvara çarpar.

Zaman damgası neden saate yuvarlanıyor

İki tabloyu doğrudan birleştiremezsiniz ama dolaylı bir yol vardır: zaman. Bir kişi 14:32:07'de oy kullandıysa ve o saniyede yazılmış tek bir pusula varsa, ikisini eşleştirmek için yabancı anahtara gerek kalmaz.

Bu yüzden her iki tabloda da zaman saate yuvarlanıyor. 14:32:07 değil, 14:00. Aynı saat diliminde onlarca pusula olduğunda hangisinin kime ait olduğu ayırt edilemez hale geliyor.

Dakika hassasiyeti bile yeterli değildi: az katılımlı bir saatte tek dakikaya tek pusula düşebilir. Saat, korelasyonu pratikte imkânsız kılan ilk eşik.

Oy tek işlemde yazılıyor

"Oy kullandı" işareti ile pusulanın kendisi tek bir veritabanı işleminde yazılıyor. Bunun iki sebebi var.

Birincisi mükerrer oyu engellemek: işaretleme atomik, yani aynı numarayla aynı anda gelen iki istekten yalnızca biri geçiyor.

İkincisi daha ince: ayrı ayrı yazsaydık, iki yazma arasında geçen sürede sistem çökerse "oy kullandı ama pusulası yok" ya da tersi bir durum kalırdı. Böyle bir tutarsızlık, sonradan eşleştirme yapmak isteyen biri için ipucu olurdu.

Bunun size maliyeti ne

Bu mimarinin bedeli var, saklamıyoruz.

Oyunuzu değiştiremiyorsunuz. Hangi pusulanın sizin olduğunu bulamadığımız için geri alamıyoruz da. KVKK'daki silme hakkı burada anlamını yitiriyor — silinecek bir bağ yok, veriniz zaten kimliğinizden kopuk.

Tek tek düzeltme yapamıyoruz. Bir kullanıcı "yanlışlıkla bastım" dediğinde yapabileceğimiz bir şey yok.

Kişiye özel hiçbir şey gösteremiyoruz. "Sizin gibi oy verenler" türü bir özellik bu yapıda kurulamaz.

Bunlar eksiklik değil, aynı kararın diğer yüzü. Oyunuzu size bağlayabilseydik bu özelliklerin hepsi mümkün olurdu — ve o bağ kurulabildiği anda, birinin onu kurmasını engelleyen tek şey söz olurdu.

Neyi garanti etmiyor

Dürüst olmak gerekirse sınırları da söyleyelim.

Bu yapı, sunucuya sızan birinin pusula tablosunu okumasını engellemiyor. Engellediği şey, o tablodaki satırları kişilere bağlaması. Sızan veri "İstanbul'da 34 yaşındaki bir erkek şu partiye oy verdi" der; kimin verdiğini söylemez.

Ağ düzeyinde de mutlak bir koruma değil: aynı anda siteye giren tek kişiyseniz ve o saatte yazılan tek pusula sizinse, teorik bir eşleşme kalır. Katılım arttıkça bu ihtimal hızla kayboluyor.

Bir de şu: bu yazıyı yazan taraf, sistemi kuran taraf. Sözümüze güvenmek zorunda kalmayın diye açık veri sayfasında toplu sonuçları indirilebilir tutuyoruz ve metodoloji sayfasında hesabın nasıl yapıldığını yazıyoruz.

Neden bu kadar uğraştık

60 kişilik bir ankette bunların hiçbiri gerekmiyor gibi görünebilir. Ama mimari, veri büyüdükten sonra değiştirilemeyen şeydir. Bugün "sonra ekleriz" denen gizlilik, yarın on binlerce satır biriktikten sonra eklenemiyor — çünkü eklemek, o satırların hepsini yeniden yazmak demek.

Bir de şu var: seçim anketinde insanların doğru cevap vermesi, cevabın kendilerine dönmeyeceğine güvenmelerine bağlı. O güven yoksa veri de doğru olmuyor. Ayrık sandık bu yüzden yalnızca hukuki bir tercih değil, verinin kalitesiyle ilgili bir tercih.

konulargizlilikyöntem

Siz ne düşünüyorsunuz?

Ankete katılmak iki dakika sürüyor; sonuçları oy kullandıktan sonra görebilirsiniz.

Ankete katıl

Diğer yazılar