---
title: 'Kişisel Veri Maskeleme'
source: 'https://academia.sh/tr/kurslar/yz-guvenlik-ve-degerlendirme/kisisel-veri-maskeleme'
course: 'Yapay Zekâ Güvenliği ve Değerlendirme'
language: tr
updated: '2026-08-17T18:06:34+00:00'
license: 'CC BY-SA 4.0'
---

# Kişisel Veri Maskeleme

Modele giden veride azaltmanın iki sayısının birlikte okunması: bayrak temelli maskeleme 240 kaydın 32'sinden alan çıkarıyor ve bunların 14'ü gizli alan isteği sınıfından, 9'u tümüyle temiz kayıt; aynı politika alanı gerektiren 23 görevi çözülemez hâle getiriyor ve bu 23 görevin 7'si temiz abonelere ait; gizli alan isteği sınıfının 3 kaydı bayrağı taşımadığı için maskelemeden kaçıyor, dar politika kaçanı 14'e çıkarırken kırılan görevi 8'e indiriyor, her kaydı maskeleyen politika hiçbir istek kaçırmıyor ama 169 görevi kırıyor ve bunların 104'ü temiz abonelerin. Maskeleme hiçbir kaydı engellemediği için yanlış alarmı yoktur ve süzgeç gibi okunması yanıltıcıdır.

İki derste savunma kaydın tamamı üzerinde karar verdi: geçir, durdur ya da bir sınıf adı koy.
Üçünde de kayıt bölünmez bir bütün sayıldı ve ölçü hep aynı çiftten okundu — durdurulan zararlı ile
yanlışlıkla durdurulan temiz. Oysa bir kaydın modele gitmesi gereken kısmı ile gitmemesi gereken
kısmı ayrılabilir.

Maskeleme tam olarak bunu yapar: kayıt geçer, içindeki belirli alanlar geçmez. Hiçbir kayıt
engellenmediği için **yanlış alarmı yoktur** ve bu, onu bakışta bedelsiz bir savunma gibi gösterir.
Bedeli başka bir yerdedir. Çıkarılan alan yalnızca zararlı bir isteğin peşinde olduğu şey değildir;
bazı görevlerin **çözülmek için ihtiyaç duyduğu** şeydir de. Bu ders o iki sayıyı yan yana koyar:
maskeleme kaç kaydı temizliyor ve kaç görevin gerektirdiği alanı siliyor.

- **SV15.** Kayıt kümesi, sınıflar, gizli alan sınıfları, görev tanımı ve maskeleme **kurgudur**;
  gerçek bir kişisel veri işlenmez ve gerçek bir model uç noktası çağrılmaz. Tohum **20260218**,
  ikinci çekim **20260219**.
- **SV16.** **Bu bir saldırı dersi değildir.** Koşan kodun tamamı savunma tarafındadır: alan
  çıkarma ve sayım. Çalışan bir saldırı, yük ya da atlatma yordamı yazılmaz.
- **SV17.** **Saldırı bir metin değil bir öznitelik profilidir.** Kayıtların `metin` alanı altı
  sıradan destek talebinden birine eşittir ve **sınıfla hiçbir ilişkisi yoktur**.
- **SV18.** Kişisel verinin, mahremiyetin ve maskelemenin genel yordamı Tespit, Müdahale ve
  Uyumluluk ile Model Değerlendirme, Yorumlanabilirlik ve Etik kurslarında ölçüldü ve burada
  tekrarlanmaz. Bu ders yalnız **modele giden veride azaltmanın** sayısını verir.
- **SV19.** Taban çizgisi **maskelemesiz kurulumdur**: hiçbir alan çıkarılmaz, temizlenen kayıt 0,
  kırılan görev 0.
- **SV20.** Görev tanımı kurgudur: altı destek metninden dördü çözülmek için gizli alan
  sınıflarından birine ihtiyaç duyar, ikisi duymaz. Alan çıkarıldığında görev **çözülemez** sayılır.
- **SV21.** Sayımlar koşumdan bağımsızdır; maskeleme bir puan üretmez, yapısal bayrağa bakar. Görev
  oranının adımı **0,0042**, temiz kayıt payının adımı **0,0068**, gizli alan isteği sınıfının
  adımı **0,0588**.

## Alanı Çıkaran Savunma

Birinci blok kursun ortak tanımını kurar ve dördüncü savunmayı ekler: `SIR_ALAN` sözlüğü dört
gizli alan sınıfını adlandırır, `maskele` ise gizli alan adı taşıyan kayıtlarda alanın
çıkarıldığını bildirir. Maskeleme bir karar döndürmez, bir **dönüşüm** bildirir; kaydın kendisi
yoluna devam eder.

```python
# KURGUDUR. Kayit kumesi, siniflar, gizli alan siniflari ve maskeleme ders icinde
# tanimlanir; gercek bir kisisel veri islenmez, gercek bir model uc noktasi cagrilmaz.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


# ---- KURGU kayitlar: saldiri METNI yazilmaz, saldiri bir OZELLIK PROFILIDIR
SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
# Ozellikler yapisaldir; hicbiri calisan bir yuk degildir.
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
# Sinif basina ozellik olasiligi (kurgu). Temiz kayitlarda da dusuk paylar var:
# gercek dunyada iyi niyetli metin de bu ozellikleri tasiyabilir.
PROFIL = {
    "temiz":              [0.06, 0.02, 0.05, 0.03, 0.02, 0.04, 0.05],
    "dolayli_yonerge":    [0.88, 0.42, 0.10, 0.30, 0.35, 0.08, 0.12],
    "gizli_alan_istegi":  [0.35, 0.15, 0.86, 0.12, 0.10, 0.06, 0.08],
    "yetki_asimi":        [0.30, 0.25, 0.12, 0.84, 0.14, 0.05, 0.07],
    "kaynak_taklidi":     [0.22, 0.55, 0.08, 0.10, 0.82, 0.07, 0.06],
    "bozulmus_girdi":     [0.05, 0.03, 0.04, 0.03, 0.06, 0.80, 0.62],
}
KAYNAK_PAYI = {
    "temiz":             [0.72, 0.20, 0.08],
    "dolayli_yonerge":   [0.05, 0.70, 0.25],
    "gizli_alan_istegi": [0.55, 0.30, 0.15],
    "yetki_asimi":       [0.40, 0.35, 0.25],
    "kaynak_taklidi":    [0.10, 0.60, 0.30],
    "bozulmus_girdi":    [0.65, 0.20, 0.15],
}
# Kurgu, tumuyle zararsiz destek metinleri. Sinifla iliskisi YOKTUR;
# sinif bilgisi yalnizca ozellik profilinde durur.
METIN = ["bu ayki fatura tutari gecen aya gore yuksek geldi",
         "sayac endeksi yanlis girilmis olabilir",
         "mahallede kesinti ne zaman bitecek",
         "tarife basamagimi ogrenmek istiyorum",
         "ariza kaydim icin ekip ne zaman gelir",
         "adres degisikligi nasil yapilir"]

KAYIT = []
for i in range(240):
    r = uretec(TOHUM + 6151 * i)
    s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
    kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
    oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
    KAYIT.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                  "metin": METIN[int(r() * len(METIN))],
                  "uzunluk": 40 + int(r() * 260)})


def zararli(k):
    return k["sinif"] != "temiz"


# ---- SAVUNMA 1: kural suzgeci (yapisal, aciklanabilir)
def kural_suzgeci(k, kurallar=("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi",
                               "kaynak_damgasi_uyusmuyor")):
    return any(k["ozellik"][o] for o in kurallar)


# ---- SAVUNMA 4: kisisel veri maskeleme (yalnizca sayim)
SIR_ALAN = {"abone_kimlik": "kimlik", "iletisim": "iletisim", "adres": "konum",
            "erisim_dizgesi": "erisim"}


def maskele(k):
    """Kurgu: gizli alan adi tasiyan kayitlarda alan cikarilir."""
    return {"maskelendi": k["ozellik"]["gizli_alan_adi"]}


# ---- OLCU: durdurulan ve yanlislikla durdurulan birlikte yazilir
def olc(kayitlar, karar):
    dp = yp = dn = yn = 0
    for k in kayitlar:
        isaret, gercek = karar(k), zararli(k)
        if isaret and gercek:
            dp += 1
        elif isaret and not gercek:
            yp += 1
        elif not isaret and gercek:
            yn += 1
        else:
            dn += 1
    kesinlik = dp / (dp + yp) if dp + yp else 0.0
    duyarlilik = dp / (dp + yn) if dp + yn else 0.0
    return {"dp": dp, "yp": yp, "yn": yn, "dn": dn,
            "kesinlik": round(kesinlik, 4), "duyarlilik": round(duyarlilik, 4),
            "yanlis_engelleme_payi": round(yp / (yp + dn), 4) if yp + dn else 0.0}
```

## Temizlenen Kayıt ve Kırılan Görev

Bedeli ölçebilmek için kaydın bir de **işi** olmalıdır. İkinci blok altı destek metnini birer
göreve bağlar ve her görevin hangi gizli alan sınıfına ihtiyaç duyduğunu yazar: fatura tutarı ve
sayaç endeksi soruları abone kimliği ister, kesinti sorusu adres ister, arıza kaydının ekibi
iletişim bilgisi ister; tarife basamağı ile adres değişikliği yordamı hiçbir alan istemez, çünkü
ikisi de genel açıklamadır. Sonra üç maskeleme politikası yan yana koşar.

```python
# KURGU gorev tanimi: her destek metni bir gorevdir ve bir kismi cozulmek icin
# gizli alan sinifindan bir alana ihtiyac duyar.
GOREV_ALAN = {METIN[0]: "abone_kimlik", METIN[1]: "abone_kimlik", METIN[2]: "adres",
              METIN[3]: None, METIN[4]: "iletisim", METIN[5]: None}


def politika(ad):
    """Uc maskeleme politikasi. Hicbiri engelleme yapmaz; hepsi alan cikarir."""
    if ad == "yok":
        return lambda k: False
    if ad == "bayrak":
        return lambda k: maskele(k)["maskelendi"]
    if ad == "dar":
        return lambda k: maskele(k)["maskelendi"] and k["kaynak"] != "kullanici"
    return lambda k: True


def say(kayitlar, f):
    m = [k for k in kayitlar if f(k)]
    kirilan = [k for k in m if GOREV_ALAN[k["metin"]]]
    kacan = [k for k in kayitlar if k["sinif"] == "gizli_alan_istegi" and not f(k)]
    return (len(m), sum(1 for k in m if not zararli(k)), len(kirilan),
            sum(1 for k in kirilan if not zararli(k)), len(kacan))


gerektiren = sum(1 for k in KAYIT if GOREV_ALAN[k["metin"]])
print("alan gerektiren gorev:", gerektiren, "/", len(KAYIT),
      " gizli alan istegi sinifi:", sum(1 for k in KAYIT if k["sinif"] == "gizli_alan_istegi"))
print()
print(f"{'politika':<10}{'maskelenen':>11}{'temizden':>10}{'kirilan gorev':>15}"
      f"{'temizden':>10}{'kacan istek':>13}")
for ad in ("yok", "bayrak", "dar", "tumu"):
    print(f"{ad:<10}" + "".join(f"{v:>{g}}" for v, g in
                                zip(say(KAYIT, politika(ad)), (11, 10, 15, 10, 13))))
print()
mask = [k for k in KAYIT if maskele(k)["maskelendi"]]
print("bayrak politikasinin maskeledigi kaydin siniflari:",
      {s: sum(1 for k in mask if k["sinif"] == s) for s in SINIF
       if sum(1 for k in mask if k["sinif"] == s)})
print("maskeleme suzgec gibi okunursa:", olc(KAYIT, lambda k: maskele(k)["maskelendi"]))
print("kirilan gorevin istedigi alan sinifi:",
      {a: sum(1 for k in mask if GOREV_ALAN[k["metin"]] == a) for a in SIR_ALAN
       if sum(1 for k in mask if GOREV_ALAN[k["metin"]] == a)})
print("hicbir gorevin istemedigi alan sinifi:",
      [a for a in SIR_ALAN if a not in GOREV_ALAN.values()])
```

```
alan gerektiren gorev: 169 / 240  gizli alan istegi sinifi: 17

politika   maskelenen  temizden  kirilan gorev  temizden  kacan istek
yok                 0         0              0         0           17
bayrak             32         9             23         7            3
dar                11         2              8         2           14
tumu              240       147            169       104            0

bayrak politikasinin maskeledigi kaydin siniflari: {'temiz': 9, 'dolayli_yonerge': 4, 'gizli_alan_istegi': 14, 'yetki_asimi': 2, 'kaynak_taklidi': 2, 'bozulmus_girdi': 1}
maskeleme suzgec gibi okunursa: {'dp': 23, 'yp': 9, 'yn': 70, 'dn': 138, 'kesinlik': 0.7188, 'duyarlilik': 0.2473, 'yanlis_engelleme_payi': 0.0612}
kirilan gorevin istedigi alan sinifi: {'abone_kimlik': 10, 'iletisim': 6, 'adres': 7}
hicbir gorevin istemedigi alan sinifi: ['erisim_dizgesi']
```

## İki Sayının Birlikte Okunması

Taban satırı beklendiği gibidir: maskeleme yokken temizlenen kayıt 0, kırılan görev 0 ve gizli alan
isteği sınıfının **17 kaydının tamamı** istediği alanla birlikte modele gidiyor.

Bayrak politikası 240 kaydın **32'sinden** alan çıkarıyor. Bu 32'nin dağılımı savunmanın hedefini
ne kadar tutturduğunu gösterir: **14'ü** gerçekten gizli alan isteği sınıfından, 9'u başka zararlı
sınıflardan ve **9'u tümüyle temiz** kayıttan. Aynı satırın ikinci yarısı bedeli yazar. Maskelenen
32 kaydın **23'ünde** görev alanı gerektiriyordu ve o alan silindiği için görev çözülemez hâle
geliyor; bu 23 görevin **7'si temiz abonelere** aittir. Kaydı engellemeyen savunmanın bedeli
budur: kimse durdurulmadı, ama yirmi üç istek yanıtsız kaldı.

Üçüncü sütun çifti savunmanın kalıntısını yazar. Gizli alan isteği sınıfının **3 kaydı**
maskelemeden kaçıyor, çünkü o kayıtlar gizli alan adı bayrağını taşımıyor. Sınıfın profili bu
özniteliği 0,86 payla taşır, tamamıyla değil. Bir savunmanın kapsamı, tetiklendiği bayrağın
kapsamından büyük olamaz — ve o bayrak burada sınıfın kendisiyle aynı şey değildir.

Dar politika bunun karşı ucudur: yalnızca kullanıcı dışı kaynaktan gelen ve bayrağı taşıyan
kayıtlar maskeleniyor. Maskelenen 32'den **11'e**, kırılan görev 23'ten **8'e** iniyor, temiz
abonelerin kırılan görevi 7'den 2'ye. Kazanç gerçek, ama kaçan istek 3'ten **14'e** çıkıyor: sınıfın
on yedi kaydının on dördü artık alanıyla birlikte modele gidiyor. Daralan şey bedelle birlikte
kapsamdır.

Son satır uçtaki seçimi gösterir. Her kaydı maskelemek kaçan isteği **sıfıra** indiriyor — bu
kursta bir savunmanın kalıntısının sıfır çıktığı ilk yerdir. Bedeli aynı satırda: **169 görev**
kırılıyor, yani alan gerektiren görevlerin tamamı, ve bunların **104'ü temiz abonelere** ait. Temiz
kayıtların 104'ü, yani 147'nin 0,7075'i yanıt alamıyor. Sıfır kalıntı bir savunma hedefi olarak
ulaşılabilir ve genellikle ulaşılmaması gereken bir hedeftir.

Son iki satır bedelin alan sınıflarına eşit dağılmadığını gösterir. Kırılan 23 görevin **10'u**
abone kimliği, 7'si adres, 6'sı iletişim bilgisi istiyordu. Dördüncü gizli alan sınıfı olan erişim
dizgesini ise **hiçbir görev istemiyor**. Bu, maskelemenin tek bir açma kapama düğmesi olmadığı
anlamına gelir: hiçbir görevin ihtiyaç duymadığı alan sınıfı **bedelsiz** maskelenebilir, en çok
görevin ihtiyaç duyduğu sınıfta ise her maskeleme kararı en pahalıdır. Her kaydı maskeleyen politika
bu ayrımı hiç görmez ve 169 görevin tamamını öder. Ayrımı görebilmek için hangi görevin hangi alanı
gerektirdiğinin yazılı olması gerekir — bu bir güvenlik kararı değil, bir ürün kararıdır ve
yazılmadığında maskeleme politikası ölçülemez hâle gelir.

Son çıktı satırı bir uyarıdır. Maskelemeyi bir süzgeç sanıp `olc` ile ölçersek kesinlik 0,7188 ve
duyarlılık 0,2473 çıkar. Bu sayılar **anlamsızdır**: maskeleme hiçbir kaydı durdurmaz, dolayısıyla
`dp` sütunundaki 23 "durdurulan zararlı" değildir ve `yp` sütunundaki 9 bir yanlış alarm değildir.
Engellemeyen bir savunmayı engelleme ölçüsüyle okumak, ona hem hak etmediği bir başarı hem de
ödemediği bir bedel yazar. Bu savunmanın iki sayısı **temizlenen kayıt** ile **kırılan görevdir**.

## Çekimden Bağımsızlık

Maskeleme bir puan üretmez, bir eşiği yoktur ve bir modele sormaz; yapısal bir bayrağa bakar.
Kararı aynı kayıt için her koşumda aynıdır. Bu, sayıların kümeden de bağımsız olduğu anlamına
gelmez: üçüncü blok aynı tanımı ikinci bir tohumla yeniden çeker.

```python
def kume(tohum):
    """Ayni tanim, ikinci cekim: yalnizca tohum degisir."""
    k2 = []
    for i in range(240):
        r = uretec(tohum + 6151 * i)
        s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
        kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
        oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
        k2.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                   "metin": METIN[int(r() * len(METIN))],
                   "uzunluk": 40 + int(r() * 260)})
    return k2


print(f"{'cekim':<10}{'zararli':>8}{'maskelenen':>11}{'kirilan':>9}"
      f"{'kirilan/mask.':>15}{'kacan istek':>13}{'adim':>8}")
for tohum in (20260218, 20260219):
    kk = kume(tohum)
    m, tm, kir, tkir, kac = say(kk, politika("bayrak"))
    n = sum(1 for k in kk if k["sinif"] == "gizli_alan_istegi")
    print(f"{tohum:<10}{sum(1 for k in kk if zararli(k)):>8}{m:>11}{kir:>9}"
          f"{kir / m:>15.4f}{str(kac) + '/' + str(n):>13}{1 / m:>8.4f}")
print()
print("gorev orani adimi:", round(1 / 240, 4),
      " temiz kayit adimi:", round(1 / 147, 4))
```

```
cekim      zararli maskelenen  kirilan  kirilan/mask.  kacan istek    adim
20260218        93         32       23         0.7188         3/17  0.0312
20260219        83         25       17         0.6800         1/11  0.0400

gorev orani adimi: 0.0042  temiz kayit adimi: 0.0068
```

## Özet

- Maskeleme hiçbir kaydı engellemez; iki sayısı **temizlenen kayıt** ile **kırılan görevdir** ve
  süzgeç ölçüsüyle okunması yanıltıcıdır.
- Bayrak politikası 32 kayıttan alan çıkarır — 14'ü gizli alan isteği sınıfından, 9'u tümüyle
  temiz — ve alanı gerektiren 23 görevi çözülemez hâle getirir; bu 23'ün 7'si temiz abonelere aittir.
- Gizli alan isteği sınıfının 3 kaydı bayrağı taşımadığı için maskelemeden kaçar: bir savunmanın
  kapsamı tetiklendiği bayrağın kapsamından büyük olamaz.
- Dar politika kırılan görevi 23'ten 8'e indirir, kaçan isteği 3'ten 14'e çıkarır; her kaydı
  maskeleyen politika kaçanı sıfıra indirir ve 169 görev kırar, bunların 104'ü temiz abonelerindir.
- Kırılan 23 görevin 10'u abone kimliği ister; erişim dizgesini hiçbir görev istemez, yani o alan
  sınıfı bedelsiz maskelenebilir. Maskeleme tek bir düğme değil, alan sınıfı başına bir karardır.
- İki çekimde temizlenen kayıt 32 ve 25, kırılan görev 23 ve 17; oran 0,7188 ile 0,6800 arasında
  kalır ve sıralama değişmez.

## Sonraki Adım

Üç derste savunma hep **metnin üzerinde** çalıştı. Kural süzgeci metnin yapısal özniteliklerini
okudu, içerik denetimi ona bir sınıf adı verdi, maskeleme içinden bir alan çıkardı. Üçünün de
ortak varsayımı, modele giren metni denetlemenin yeterli olduğuydu. Oysa bir kaydın zararı metinde
değil, metnin **tetiklediği eylemdedir**: çağrılan araç, yazılan kayıt, gönderilen mesaj. Süzgeci
geçmiş bir isteğin elinde ne kadar yetki olduğu, o yetkinin daraltılmasının kaç zararlıyı
durduracağı ve kaç görevi tamamlanamaz bırakacağı hiç sorulmadı. Sonraki ders savunmayı metinden
alıp **eylemin** üzerine koyar.
