Skip to main content

TCKN, VKN ve IBAN Doğrulama

TC kimlik, vergi kimlik ve IBAN sağlamasını tarayıcınızda kontrol edin. Veri hiçbir yere gitmez; sağlamanın tutması numaranın gerçek olduğunu göstermez.

Veriler tarayıcınızdan çıkmazYayın: Ağustos 2026
Numara türü

Bir numara girin, sonuç anında burada görünür.

Girdiğiniz numara tarayıcınızdan çıkmaz, hiçbir sunucuya gönderilmez.

Özet (TL;DR)

  • Sağlama, rakamların kendi içinde tutarlı olduğunu söyler. Numaranın gerçek bir kişiye, kuruma veya hesaba ait olduğunu göstermez; bunu yalnızca numarayı veren kurum bilir.
  • TC kimlik numarasının onuncu hanesi hesaplanırken ara sonuç eksiye düşebilir. JavaScript'te % işlemi kalan verir, modülüs değil, bu yüzden düzeltilmezse geçerli numaralar reddedilir.
  • IBAN mod 97 hesabı 28 haneli bir sayı üretir. Number() ile hesaplamak güvenli tam sayı sınırını aştığı için hem geçerli hesapları reddeder hem de geçersizleri kabul eder.
  • 11111111110 sağlamadan geçer ama gerçek değildir. Türkiye'de en yaygın kullanılan test numarasıdır ve ayrıca ele alınması gerekir.

Sağlama ne söyler, ne söylemez

Bir sağlama hanesi, numaranın geri kalanından hesaplanır. Tutuyorsa, rakamlarda yazım hatası olmadığını anlarsınız. Tutmuyorsa bir yerde hata vardır. Söylediği şey bundan ibarettir.

Söylemediği şey çok daha önemlidir: numaranın hiç verilip verilmediğini, kime ait olduğunu, hâlâ geçerli olup olmadığını bilmez. Sağlamadan geçen sonsuz sayıda numara üretilebilir ve bunların çoğu hiç kimseye ait değildir. Bu yüzden bu araç sonucu "geçerli kişi" değil "sağlama doğru" diye yazar.

Uyarı

Bir formda TC kimlik numarası alıyorsanız sağlama kontrolü yalnızca ilk adımdır. Kullanıcının yazım hatasını anında yakalar ve sunucuya boşuna istek gitmesini önler. Kimlik doğrulaması yerine geçmez.

TC kimlik numarası algoritması

On bir hanedir, sıfırla başlamaz. Son iki hane, ilk dokuzdan hesaplanır.

text
d10 = ((d1+d3+d5+d7+d9) * 7 - (d2+d4+d6+d8)) mod 10d11 = (d1 + d2 + ... + d10) mod 10

Buradaki tuzak, çıkarma işleminin sonucunun eksiye düşebilmesidir. JavaScript'in % işleci matematiksel modülüs değil kalan hesaplar ve sol operand eksiyse eksi sonuç verir. Bu durumda hesaplanan hane hiçbir zaman gerçek haneye eşit olmaz.

javascript
// Yanlış: 19191919190 gibi GEÇERLİ bir numarayı reddederconst d10 = (odd * 7 - even) % 10; // Doğru: sonucu 0-9 aralığına geri taşırconst d10 = (((odd * 7 - even) % 10) + 10) % 10;

Bu, gözle fark edilmeyen bir hatadır: numaraların çoğu doğru sonuç verir, yalnızca ara toplamın eksiye düştüğü durumlar bozulur. Kullanıcı geçerli kimliğini yazar, sistem reddeder, kimse nedenini anlamaz.

Sağlamadan geçen sahte numaralar

İlk on hanesi aynı olan numaralar, sağlama kurallarının doğası gereği geçerli bir on birinci hane üretir. 11111111110 bunların en bilinenidir ve neredeyse her eğitim materyalinde, her test verisinde karşınıza çıkar.

Bu araç bunları ayrı bir kategori olarak bildirir. "Sağlama tutmuyor" demek yanlış olurdu çünkü tutuyor; "geçerli" demek çok daha yanlış olurdu. Doğru cevap, numaranın yaygın bir test değeri olduğunu söylemektir.

Vergi kimlik numarası bambaşka bir algoritma

On hanedir ve TC kimlik algoritmasıyla hiçbir ilgisi yoktur. Her hane için konum ağırlığı eklenir, sonuç ondan moda alınır, sonra ikinin kuvvetiyle çarpılıp dokuza göre katlanır.

Herkesin atladığı ayrıntı, dokuza göre kalanın sıfır çıktığı durumda dokuz kabul edilmesidir. Bu dal olmadan doğrulayıcı, gerçek vergi numaralarının önemli bir kısmını reddeder.

Bilgi

Vergi kimlik numarası sıfırla başlayabilir; TC kimlik numarası başlayamaz. Bu yüzden vergi numarasını sayı olarak saklamak baştaki sıfırı yok eder. Her zaman metin olarak tutun.

IBAN ve taşma tuzağı

IBAN doğrulaması ISO 13616 ile tanımlıdır: ilk dört karakter sona alınır, harfler sayıya çevrilir (A=10, Z=35) ve elde edilen sayının 97 ile bölümünden kalan 1 olmalıdır.

Bir Türk IBAN'ı bu dönüşümden sonra 28 haneli bir sayı olur. Number.MAX_SAFE_INTEGER 16 hanedir, dolayısıyla Number() ile hesaplamak anlamsız sonuç verir.

javascript
// Geçerli bir TR IBAN için gerçek kalan 1'dirNumber(digits) % 97   // -> 96, taşma nedeniyleBigInt(digits) % 97n  // -> 1n, doğru // BigInt olmadan da olur, her çalışma ortamında güvenli:let r = 0;for (const ch of digits) r = (r * 10 + Number(ch)) % 97;

Uzunluk kontrolü de gereklidir. Mod 97 tek başına, bir hane eklenmiş veya silinmiş bir IBAN'ı yaklaşık doksan yedide bir olasılıkla kabul eder. Türkiye için IBAN tam olarak 26 karakterdir ve bu kontrol o olasılığı sıfırlar.

Neden üretme özelliği yok

Bu sağlamaların hepsi tersine çevrilebilir. Dokuz haneyi serbest seçip son ikisini hesaplamak, arama gerektirmeyen sabit zamanlı bir işlemdir. Yani bir üretici yazmak teknik olarak önemsizdir.

Yazılmamasının nedeni de tam olarak budur. Algoritmalar zaten kamuya açıktır, bu yüzden bir doğrulayıcı kötü niyetli birine yeni bir şey vermez. Ama "yüz tane geçerli numara üret" düğmesi ya da yapıştırılan bir listeyi tarayıp içinden geçerli görünenleri ayıklayan bir toplu mod, doğrudan dolandırıcılık aracıdır. İkisi de bilinçli olarak yok.

Veri tarayıcınızdan çıkmaz

Girdiğiniz numara hiçbir sunucuya gönderilmez, kaydedilmez ve günlüğe yazılmaz. Hesaplama tamamen tarayıcınızda çalışır; sayfa yüklendikten sonra internet bağlantınızı kesseniz bile araç çalışmaya devam eder. Girdi doğası gereği kişisel veri olduğu için bu, bir tercih değil zorunluluktur.

Sıkça Sorulan Sorular

Sağlama doğru çıktı, numara gerçek mi?
Hayır. Sağlama yalnızca rakamların birbiriyle tutarlı olduğunu gösterir. Numaranın verilip verilmediğini, kime ait olduğunu veya hâlâ geçerli olup olmadığını yalnızca ilgili kurum bilir. Sağlamadan geçen sonsuz sayıda numara vardır ve çoğu kimseye ait değildir.
Neden 11111111110 geçersiz gösteriliyor?
Sağlamadan geçtiği için teknik olarak "sağlama hatası" değil, ama gerçek bir numara da değil. Türkiye'de en yaygın test değeridir. Araç bunu ayrı bir durum olarak bildirir; "geçerli" demek yanıltıcı, "sağlama tutmuyor" demek ise yanlış olurdu.
Girdiğim numara kaydediliyor mu?
Hayır. Hesaplama tarayıcınızda çalışır, ağ üzerinden hiçbir şey gönderilmez. Sayfayı yükledikten sonra bağlantınızı kesip denerseniz aracın çalışmaya devam ettiğini görürsünüz.
Neden geçerli numara üretme seçeneği yok?
Bu sağlamalar tersine çevrilebilir olduğu için üretici yazmak kolaydır, ama kolay olması onu doğru yapmaz. Tek bir numarayı doğrulamak meşru bir ihtiyaçtır; toplu numara üretmek veya bir listeyi tarayıp geçerli görünenleri ayıklamak dolandırıcılığa hizmet eder. Bu yüzden ikisi de yok.
Formumda kullanabilir miyim?
Aynı algoritmayı kendi kodunuzda uygulayabilirsiniz, önerilir de: kullanıcının yazım hatasını anında yakalar. Ancak sağlama kontrolünü kimlik doğrulaması yerine koymayın. İki tuzağa dikkat edin: negatif kalan düzeltmesi ve IBAN'da Number() kullanmamak.

Bu aracı ve yazıyı hazırlayan: , Senior Software Engineer. Yayın: Ağustos 2026.