Skip to main content
Uygulama Geliştirme•19 dk okuma

IBAN ve TC Kimlik No Doğrulama: Kontrol Haneleri Nasıl Hesaplanır, Neyi Kanıtlamaz?

Mustafa Kürşad BaşerMustafa Kürşad BAŞER
•
IBAN ve TC Kimlik No Doğrulama: Kontrol Haneleri Nasıl Hesaplanır, Neyi Kanıtlamaz?

Geçerli biçim, var olan hesap demek değil

Özet (TL;DR)

  • IBAN'ın iki kontrol hanesi ISO 7064 MOD 97-10 ile hesaplanır. İlk dört karakter sona taşınır, harfler 10 ile 35 arası sayılara çevrilir ve ortaya çıkan sayının 97'ye bölümünden kalan 1 olmalıdır.
  • Türkiye IBAN'ı 26 karakterdir: TR, iki kontrol hanesi, beş haneli kurum kodu, her zaman sıfır olan bir rezerv hane ve sağa dayalı 16 karakterlik hesap numarası.
  • TCKN'nin 10. hanesi (tek pozisyonlar × 7 − çift pozisyonlar) mod 10, 11. hanesi ilk on hanenin toplamının mod 10'udur. JavaScript'te % negatif sonuç verebildiği için formülü olduğu gibi koda dökmek, yaklaşık 9.000 numarada bir patlayan bir hata bırakır.
  • Kontrol hanesi yazım hatalarını yakalar, o kadar. Hesabın açık olduğunu ya da numaranın beyan edilen kişiye ait olduğunu yalnızca hesabı tutan kurum ve NVİ servisleri söyleyebilir.
  • TCKN'nin düz SHA-256 özeti anonimleştirme sayılmaz. Olası 900 milyon numaranın tamamı tek bir bilgisayarda dakikalar içinde denenebilir, arama anahtarı gerekiyorsa gizli anahtarlı HMAC kullanın.

Diyelim ki ödeme formunuz IBAN alanını yeşile boyadı, kayıt veritabanına girdi ve ertesi gün transfer "alıcı hesap bulunamadı" diye geri döndü. Kodunuzda hata yok. Doğrulama size yalnızca bir şey söylüyordu ve o şey "bu hesap var" değildi.

Aynı yanılgı TC Kimlik No için de geçerli. Kontrol hanesi tutan on bir hane, bir insanın varlığını kanıtlamaz. Üstüne bir de ters yönden risk var: geçerli bir TCKN üretmek o kadar kolay ki örnek verirken bile birinin gerçek numarasını yazıya dökebilirsiniz. Bu yazıda o yüzden tek bir tam ve geçerli TCKN göreceksiniz: hiç.

Önce iki algoritmanın içine girip JavaScript ve Python ile çalıştıracağız, sonra doğrulamanın bittiği yeri ve KVKK tarafını konuşacağız.

IBAN'ın anatomisi

ISO 13616-1:2020'ye göre bir IBAN, iki harfli ISO 3166 ülke kodu, iki kontrol hanesi ve ülkenin kendi belirlediği BBAN'dan (Basic Bank Account Number) oluşur. Toplam uzunluk en fazla 34 karakterdir ama her ülke kendi sabit uzunluğunu kullanır. SWIFT'in tuttuğu IBAN Registry'ye göre bu uzunluk Norveç'te 15, Saint Lucia'da 32 karakter.

Türkiye tarafını belirleyen metin TCMB'nin 2008/6 sayılı Uluslararası Banka Hesap Numarası Hakkında Tebliğ'i. IBAN 26 karakterdir ve alanlar soldan sağa şöyle dizilir:

AlanUzunlukKural
Ülke kodu2 harfHer zaman TR
Kontrol haneleri2 rakamMOD 97-10 ile hesaplanır
Ödeme hizmeti sağlayıcısı kodu5 rakamTCMB belirler. Ağustos 2021'deki değişikliğe kadar adı "banka kodu" idi
Rezerv alan1 rakamBütün hesaplarda 0
Hesap numarası16 karakterSağa dayalı yazılır, soldaki boşluklar sıfırla doldurulur

Tebliğ iki ayrıntıyı daha açıkça yazıyor. IBAN içinde İ, Ç, Ğ, Ö, Ş, Ü harfleri ve küçük harf kullanılmaz. Registry'deki resmî örnek TR330006100519786457841326. Kurum kodu 00061, rezerv hane 0, kalanı hesap numarası. Rezerv hanenin sıfır olması size bedava bir kontrol veriyor. IBAN'ın 10. karakteri 0 değilse, kontrol hanelerine hiç bakmadan reddedebilirsiniz.

Türkiye IBAN örneği TR330006100519786457841326 ülke kodu, kontrol haneleri, kurum kodu, rezerv hane ve hesap numarası olarak beş alana bölünmüş, altında MOD 97-10 adımları
Registry örneğinin alanları ve mod 97 doğrulaması

MOD 97-10 adım adım

Kontrol hanelerinin hesabı ISO/IEC 7064:2003'teki MOD 97-10 yöntemine dayanıyor. Doğrulama dört adım:

  1. 1Boşlukları atın, harfleri büyütün.
  2. 2İlk dört karakteri (ülke kodu ve kontrol haneleri) en sona taşıyın.
  3. 3Her harfi iki haneli bir sayıyla değiştirin: A=10, B=11, ... Z=35. TR böylece 2927 olur.
  4. 4Ortaya çıkan sayının 97'ye bölümünden kalan 1 ise IBAN biçim olarak geçerlidir.

Registry örneğinde üçüncü adımın sonunda 28 haneli bir sayı çıkıyor. JavaScript'in Number tipi ise yalnızca 2⁵³'e kadar olan tam sayıları kayıpsız tutabiliyor, yani 16 hane civarında hassasiyet bitiyor. Sayıyı doğrudan çevirip mod almak sessizce yanlış sonuç verir:

javascript
const digits = '0006100519786457841326292733'; console.log(Number(digits));// 6.100519786457841e+24console.log(Number(digits) % 97);// 96  (yanlış)console.log(BigInt(digits) % 97n);// 1n  (doğru)

Kalan 96 çıkıyor ve hiçbir hata fırlatılmıyor. ES2020 ile gelen BigInt sorunu çözüyor ama eski tarayıcıları da destekliyorsanız yaygın ve her ortamda çalışan yol daha sağlam: sayıyı soldan parça parça işleyip her adımda kalanı bir sonraki parçanın önüne eklemek. Kalan en fazla iki hane olduğundan yedi hanelik parçalarla ara değer dokuz haneyi hiç geçmiyor.

javascript
function normalizeIban(input) {  return input.normalize('NFKC').replace(/[\s-]/g, '').toUpperCase();} // Ülke kodu ve kontrol hanelerini sona at, harfleri sayıya çevir (A=10 ... Z=35)function toDigits(iban) {  const rearranged = iban.slice(4) + iban.slice(0, 4);  return rearranged.replace(/[A-Z]/g, (ch) => String(ch.charCodeAt(0) - 55));} // Uzun sayıyı 7'şer hanelik parçalarla mod 97'ye indirfunction mod97(digits) {  let rest = 0;  for (let i = 0; i < digits.length; i += 7) {    rest = Number(rest + digits.slice(i, i + 7)) % 97;  }  return rest;} function isValidTrIban(input) {  const iban = normalizeIban(input);  if (!/^TR[0-9]{2}[0-9]{5}0[0-9A-Z]{16}$/.test(iban)) return false;  return mod97(toDigits(iban)) === 1;} console.log(toDigits('TR330006100519786457841326'));// 0006100519786457841326292733console.log(mod97(toDigits('TR330006100519786457841326')));// 1console.log(isValidTrIban('tr33 0006 1005 1978 6457 8413 26'));// trueconsole.log(isValidTrIban('TR330006100519786457841362')); // son iki hane yer değiştirdi// false

Son satırdaki örnekte yalnızca iki hanenin yeri değişti ve mod 97 bunu yakaladı. Bu bir tesadüf değil. Aşağıda TCKN ile karşılaştırırken tekrar döneceğim.

Kontrol hanelerini kendiniz üretmek

Hesap numarasından IBAN üretmeniz gerekiyorsa aynı işlemi tersinden yaparsınız. Kontrol hanelerinin yerine 00 koyup kalanı bulun, 98'den çıkarın ve sonucu iki haneye tamamlayın. Python'un tam sayıları sınırsız büyüdüğü için parçalamaya gerek kalmıyor:

python
import reimport unicodedata def normalize(raw: str) -> str:    raw = unicodedata.normalize('NFKC', raw)    return re.sub(r'[\s-]', '', raw).upper() def to_digits(s: str) -> str:    # int('T', 36) == 29, int('7', 36) == 7    return ''.join(str(int(ch, 36)) for ch in s) def check_digits(country: str, bban: str) -> str:    n = int(to_digits(bban + country + '00'))    return f'{98 - n % 97:02d}' def is_valid(raw: str) -> bool:    iban = normalize(raw)    if not re.fullmatch(r'[A-Z]{2}[0-9]{2}[0-9A-Z]{11,30}', iban):        return False    return int(to_digits(iban[4:] + iban[:4])) % 97 == 1 def print_format(iban: str) -> str:    return ' '.join(iban[i:i + 4] for i in range(0, len(iban), 4)) bban = '00061' + '0' + '0519786457841326'cd = check_digits('TR', bban)print(cd)# 33print(print_format('TR' + cd + bban))# TR33 0006 1005 1978 6457 8413 26print(is_valid('TR33 0006 1005 1978 6457 8413 26'))# Trueprint(is_valid('TR33 0006 1005 1978 6457 8413 26'))  # tam genişlikli rakamlar# True

İki küçük ayrıntı var. int(ch, 36) hem rakamları hem harfleri tek hamlede çeviriyor, A için 10, Z için 35 veriyor. Regex'te \d yerine [0-9] yazmamın sebebi de şu: Python'da \d varsayılan olarak bütün Unicode rakamlarını kabul eder, "3" gibi tam genişlikli bir karakter de buna dahil. Kullanıcının yapıştırdığı metni önce NFKC ile normalleştirip sonra yalnızca ASCII kabul etmek, veritabanına garip karakter sızmasını önlüyor.

TCKN: dokuz hane veri, iki hane kontrol

TC Kimlik No 11 hanedir ve ilk hanesi 0 olamaz. Son iki hane, ilk dokuz haneden hesaplanan kontrol haneleridir. 10. haneyi bulmak için 1, 3, 5, 7 ve 9. hanelerin toplamını 7 ile çarpar, 2, 4, 6 ve 8. hanelerin toplamını bundan çıkarır ve sonucun mod 10'unu alırsınız. 11. hane daha basit, ilk on hanenin toplamının mod 10'u.

Bir not düşmem gerekiyor. Bu kural yıllardır yazılımcıdan yazılımcıya aktarılıyor ve sayısız sistemde çalışıyor, ama NVİ'nin yayımladığı resmî bir spesifikasyonda bulabildiğim bir metin yok. O yüzden bu bölümün kaynakçasında bir referans görmeyeceksiniz. Algoritmayı aşağıda kodla sınadım, iddiaları da yalnızca çalıştırdığım koddan türetiyorum.

Adım adım bakalım. Örnek olarak bilerek geçersiz bir önek seçiyorum: 012345678. İlk hanesi 0 olduğu için hiçbir kimlik numarası bununla başlayamaz, ama aritmetiği göstermek için yeterli.

AdımHesapSonuç
Tek pozisyonlar (1, 3, 5, 7, 9)0 + 2 + 4 + 6 + 820
Çift pozisyonlar (2, 4, 6, 8)1 + 3 + 5 + 716
10. hane(20 × 7 − 16) mod 10 = 124 mod 104
11. hane(0 + 1 + ... + 8 + 4) mod 10 = 40 mod 100

Ortaya çıkan 01234567840 iki kontrol hanesinden de geçiyor ama ilk hane kuralına takılıyor. Bir doğrulayıcıyı test ederken tam da bu yüzden işe yarıyor.

TC Kimlik No'nun on bir hanesi: tek pozisyonlar ve çift pozisyonlar ayrı renkte, 10. ve 11. hanenin formülü ve son hanenin neden hep çift olduğu
TCKN kontrol hanelerinin formülü

Formülden şaşırtıcı bir sonuç çıkıyor. Tek pozisyonların toplamına T, çiftlerinkine Ç dersek 10. hane 7T − Ç'ye denk, ilk on hanenin toplamı ise T + Ç + 7T − Ç = 8T'ye denk düşüyor. Yani 11. hane hep 8T'nin son rakamı ve bu yüzden hep çift. Son hanesi tek olan bir numarayı başka hiçbir hesaba girmeden reddedebilirsiniz. İlk dokuz hane serbest olduğundan olası numara sayısı da tam 900 milyon.

JavaScript'in negatif mod tuzağı

Formülü JavaScript'e olduğu gibi yazdığınızda (7T − Ç) % 10 her zaman 0 ile 9 arasında kalmaz. JavaScript'te % bölümden kalanı bölünenin işaretiyle döndürüyor, matematikteki mod gibi davranmıyor. İlk hane en az 1 olduğu için T en az 1, Ç ise en fazla 36. 7 × 1 − 36 = −29 ve -29 % 10 sonucu −9 oluyor.

javascript
function isValidTckn(input) {  const s = String(input).trim();  if (!/^[1-9][0-9]{10}$/.test(s)) return false;   const d = Array.from(s, Number);  const odd = d[0] + d[2] + d[4] + d[6] + d[8];  const even = d[1] + d[3] + d[5] + d[7];   // JavaScript'te % negatif sonuç verebilir, 10 ekleyip tekrar mod al  const tenth = (((odd * 7 - even) % 10) + 10) % 10;  const eleventh = (odd + even + d[9]) % 10;   return d[9] === tenth && d[10] === eleventh;} console.log((10 * 7 - 36) % 10, (1 * 7 - 36) % 10);// 4 -9console.log(isValidTckn('01234567840')); // kontrol haneleri tutuyor, ilk hane 0// falseconsole.log(isValidTckn('12345678901'));// false

Bu hata neden testlerde görünmüyor? 900 milyon önekin tamamını taradığımda negatif ara sonuç veren yalnızca 99.090 önek çıktı, yaklaşık 9.000'de bir. Rastgele birkaç yüz numarayla yazılmış bir test bunu neredeyse hiç yakalamaz. Sonra bir gün gerçek bir kullanıcı numarasını girer ve formunuz "geçersiz" der. Python'da % bölenin işaretini aldığı için aynı satır doğru çalışıyor.

Python'da isdigit tuzağı

python
def tckn_check_digits(first9: str) -> str:    d = [int(c) for c in first9]    odd = d[0] + d[2] + d[4] + d[6] + d[8]    even = d[1] + d[3] + d[5] + d[7]    tenth = (odd * 7 - even) % 10        # Python'da sonuç hep 0-9    eleventh = (odd + even + tenth) % 10    return f'{tenth}{eleventh}' def is_valid_tckn(raw: str) -> bool:    s = raw.strip()    if len(s) != 11 or not (s.isascii() and s.isdigit()) or s[0] == '0':        return False    return s[9:] == tckn_check_digits(s[:9]) print(tckn_check_digits('012345678'))# 40print(is_valid_tckn('01234567840'))# Falseprint('1234567890²'.isdigit())# Trueprint(is_valid_tckn('1234567890²'))# False

str.isdigit() üst simge "²" gibi karakterler için de True döndürüyor, ardından int() bunları çeviremeyip ValueError fırlatıyor. Doğrulayıcınız bir exception yüzünden 500 dönmesin diye isascii() kontrolünü öne koyun ya da regex'te [0-9] kullanın.

Kontrol hanesinin kör noktası

İki algoritma da tek bir hanenin yanlış yazılmasını her durumda yakalıyor. Fark, yan yana iki hanenin yer değiştirmesinde ortaya çıkıyor. TCKN'de tek ve çift pozisyondaki iki hane yer değiştirince 10. hanenin ara değeri 8 × (fark) kadar oynuyor. Fark 5 ise bu 40 ediyor ve mod 10'da sıfıra düşüyor. 11. hane de 8T'ye bağlı olduğundan aynı şekilde susuyor. 20.000 rastgele numara üzerinde çalıştırdığım betikte farklı rakamlı yan yana yer değiştirmelerin %9,91'i fark edilmedi ve kaçanların hepsinde rakamlar arasındaki fark 5'ti.

Hata türüTCKN (mod 10)IBAN (MOD 97-10)
Tek hanenin yanlış yazılmasıHepsi yakalandıHepsi yakalandı
Yan yana iki hanenin yer değiştirmesi%9,91 kaçtı (fark 5 olanlar)Hiçbiri kaçmadı
Rastgele bir dizinin geçme olasılığı100'de 1 (iki hane mod 10)97'de 1

Farkın kaynağı bölen. 97 iki haneye sığan en büyük asal sayı ve 10 ile ortak böleni yok. Tek bir rakamın değişmesi sayıyı δ × 10ᵏ kadar, yan yana iki rakamın yer değiştirmesi 9 × δ × 10ᵏ kadar oynatıyor ve δ en fazla 9 olduğu için bu farkların hiçbiri 97'ye tam bölünmüyor. Mod 10'daki "fark 5" tuzağının burada karşılığı yok.

Doğrulamanın kanıtlamadığı şeyler

Kontrol hanesi bir yazım denetimidir. Size "bu dizi kurala uygun" der, başka hiçbir şey söylemez. Biçim doğrulamasından geçmiş bir IBAN kapatılmış bir hesaba, başka birine ait bir hesaba ya da hiç açılmamış bir hesap numarasına işaret ediyor olabilir. Bunu bilen tek taraf, hesabı tutan kurumdur. Transferin gerçekten kime gideceğini ödeme sistemi ve bankanın sunduğu servisler doğrular.

TCKN için de durum aynı. Numaranın bir kişiye ait olup olmadığını ve beyan edilen adla eşleşip eşleşmediğini NVİ söyler. NVİ'nin tckimlik.nvi.gov.tr üzerindeki KPSPublic SOAP servisi en az 2010'dan beri TCKimlikNoDogrula adında bir işlem sunuyor. İşlem TCKN, ad, soyad ve doğum yılını alıp true ya da false dönüyor. Daha kapsamlı sorgular ise NVİ'ye başvurup erişim izni alan kurumların kullanabildiği Kimlik Paylaşımı Sistemi (KPS) üzerinden yapılıyor.

Uyarı

Kontrol hanesinden geçen bir TCKN'ye "doğrulandı" etiketi koymayın. Arayüzde ve veritabanında "biçimi geçerli" ile "kimliği doğrulandı" iki ayrı durum olsun. Para transferi, sözleşme ya da yaş doğrulaması gibi sonucu olan her işlemde ikincisini bekleyin.

KVKK: TCKN log'a düşmesin

6698 sayılı Kişisel Verilerin Korunması Kanunu, verinin işlendiği amaçla bağlantılı, sınırlı ve ölçülü olmasını (madde 4) ve veri sorumlusunun hukuka aykırı erişimi önleyecek teknik ve idari tedbirleri almasını (madde 12) istiyor. Uygulamada TCKN'nin en sık sızdığı yerler formun kendisi değil, onun etrafındaki altyapı oluyor:

  • GET isteğine konmuş bir ?tckn= parametresi, web sunucusunun erişim log'una olduğu gibi yazılır.
  • Doğrulama hatasında fırlatılan exception, mesajında değeri de taşıyorsa hata takip aracına gider.
  • Request body'yi olduğu gibi loglayan bir middleware, formdaki TCKN'yi de düz metin olarak saklar.
  • Analitik event'lerine "debug için" eklenen alanlar üçüncü taraf bir sunucuya taşınır.

Maskeleme işe yarıyor ama kontrol haneleri burada beklenmedik bir sızıntı yaratıyor. Son dört haneyi gösterdiğinizde, bilinmeyen yedi hane için kaba hesapla 9 milyon olasılık kalması gerekir. 10. ve 11. hane ilk dokuz haneye bağlı olduğundan bu sayı 180.000'e iniyor, ben bunu bütün olasılıkları tarayarak saydım. Yalnızca son iki haneyi gösterdiğinizde bile 900 milyonluk uzay 18 milyona düşüyor. Ekranda göstermeniz gerekiyorsa son iki hane yeterli, log'a ise hiçbir parçasını yazmayın.

Bir de "özetini alırız" fikri var. TCKN'nin düz SHA-256 özeti anonimleştirme değildir, çünkü girdi uzayı küçük. 900 milyon adayı tek çekirdekte Python ile özetlemek dakikalar sürüyor. Kayıt eşleştirmek ya da tekrar eden başvuruyu yakalamak için arama anahtarı gerekiyorsa, anahtarı veritabanının dışında duran bir HMAC kullanın. Asıl değeri geri okumanız gerekiyorsa da şifreleme kullanın.

python
import hashlibimport hmacimport os def mask_tckn(tckn: str) -> str:    return '*' * 9 + tckn[-2:] def mask_iban(iban: str) -> str:    return iban[:4] + ' **** **** **** **** **' + iban[-4:-2] + ' ' + iban[-2:] # Anahtar koddan değil, gizli ortam değişkeninden ya da secret manager'dan gelirKEY = os.environ.get('TCKN_HMAC_KEY', 'dev-only-key').encode() def tckn_lookup_key(tckn: str) -> str:    return hmac.new(KEY, tckn.encode(), hashlib.sha256).hexdigest() print(mask_tckn('12345678901'))# *********01print(mask_iban('TR330006100519786457841326'))# TR33 **** **** **** **** **13 26print(len(tckn_lookup_key('12345678901')))# 64

Veritabanı tarafında TCKN'yi BIGINT değil CHAR(11) olarak tutmanızı öneririm. Bir kimlik numarası üzerinde toplama yapılmaz, maskeleme ve biçimlendirme metin işlemidir. IBAN zaten harf içerdiği için metin olmak zorunda. Hangi sütuna hangi tipi seçeceğinizi SQL ve RDBMS rehberinde daha ayrıntılı anlattım.

Formda kullanıcıyı yormadan

İnsanlar IBAN'ı bankanın mobil uygulamasından kopyalar, e-postadan yapıştırır, bazen de kâğıttan okuyup dörtlü gruplar hâlinde yazar. Doğrulayıcının işi bu çeşitliliği reddetmek değil, sindirmek. Benim tercih ettiğim akış şöyle:

  1. 1Girdiyi önce normalleştirin: NFKC, boşluk ve tire temizliği, büyük harf. Kullanıcıdan "boşluksuz yazın" diye istemeyin.
  2. 2Saklarken ve API'ye gönderirken boşluksuz elektronik biçimi kullanın. Tebliğ de elektronik ortamda IBAN'ın bitişik yazılmasını istiyor.
  3. 3Gösterirken dört karakterlik gruplara bölün. Yazılı belgelerde dörtlü gösterim tebliğin açık kuralı, ekranda da okumayı ve karşılaştırmayı kolaylaştırıyor.
  4. 4Hata mesajını ayırın. "26 karakter olmalı" ile "bir hane yanlış yazılmış olabilir" farklı sorunlar ve kullanıcıya farklı şey yaptırır.
  5. 5Doğrulamayı her tuş vuruşunda değil, alan bittiğinde ya da uzunluk tamamlandığında yapın. Yarım bir IBAN'a kırmızı göstermek kullanıcıyı haksız yere suçlar.

Biçim kontrolü için regex yeterli ama aritmetik yapamaz. Desen "TR ve ardından 24 karakter" der, mod 97'yi ise kod hesaplar. Elinizdeki bir IBAN'ı hızlıca kontrol etmek isterseniz IBAN Doğrulama aracı aynı adımları tarayıcıda uyguluyor.

Bilgi

İstemci tarafındaki doğrulama kullanıcıya hız kazandırır, güvenlik sağlamaz. Aynı kontrolü sunucuda da çalıştırın. İsteği tarayıcıyı atlayarak gönderen birinin karşısında yalnızca sunucu kodu vardır.

Sonuç

Kontrol hanesini yazım hatasını kullanıcı daha formdayken yakalayan ucuz bir filtre olarak kullanın ve ondan fazlasını beklemeyin. Kuralım şu: biçim kontrolü istemcide ve sunucuda, gerçek doğrulama kaynağında, TCKN ise hiçbir log satırında. Bu üçünden biri eksikse ya kullanıcıyı boşuna yoruyorsunuz ya parayı yanlış yere gönderiyorsunuz ya da sızmayı bekleyen bir veriyi saklıyorsunuz.

Sıkça Sorulan Sorular

IBAN'daki kurum kodundan bankayı bulabilir miyim?
Kodları TCMB belirlediği için bir eşleme tablosuyla bulabilirsiniz. Ama Ağustos 2021'de yürürlüğe giren 2021/5 sayılı tebliğden beri banka dışındaki ödeme hizmeti sağlayıcıları da IBAN oluşturabiliyor. Bu yüzden beş haneli kodu "banka kodu" diye adlandırıp arayüzde her zaman bir banka adı göstermeye çalışmak artık doğru değil.
Kontrol haneleri 00, 01 ya da 99 olabilir mi?
Olamaz. Kontrol hanesi 98'den 0 ile 96 arasındaki bir kalan çıkarılarak bulunur, yani yalnızca 02 ile 98 arasında değer alır. Üçüncü ve dördüncü karakteri 00, 01 ya da 99 olan bir girdiyi mod 97 hesabına girmeden reddedebilirsiniz.
Kontrol hanesi tutmayan bir IBAN'ı otomatik düzeltip önerebilir miyim?
Önermeyin. Tek hanesi bozulmuş 2.000 rastgele TR IBAN'ında, tek bir haneyi değiştirerek mod 97'den geçen ortalama 2,88 aday çıktı ve vakaların yalnızca %8,8'inde tek aday vardı. Yanlış adayı önermek parayı başka birinin hesabına göndermek demek. Kullanıcıya IBAN'ı kaynağından tekrar kopyalamasını söyleyin.
Yabancı IBAN'ları da aynı kodla doğrulayabilir miyim?
Mod 97 adımı bütün ülkelerde aynı. Değişen, ülkeye göre sabit uzunluk ve BBAN deseni. Yabancı IBAN kabul ediyorsanız uzunluğu IBAN Registry'den alınmış bir tabloyla kontrol edin. Yalnızca mod 97'ye bakarsanız, bir hanesi eksik ya da fazla yazılmış her 97 IBAN'dan biri yine de geçer. Uzunluk kontrolü bu açığı bedavaya kapatıyor.

Kaynakça

Bu yazıyı paylaş

Mustafa Kürşad Başer
Yazar

Mustafa Kürşad Başer

Kıdemli Yazılım Mühendisi

Karmaşık sorunlara zarif çözümler üretmekten keyif alan, tutkulu bir yazılım mühendisi. Kodlamanın ötesinde, teknoloji, sanat ve insan bilincinin kesişim noktalarını keşfetmekle derinden ilgileniyor.