PHP ile TC Kimlik No Doğrulama

4 March, 2009 (12:50) | php | By: admin

TC Kimlik numarası artık hayatımızın bir parçası haline geldi. Hemen hemen her yerde bizden kimlik yerine tc kimli nomuz istenir oldu. Hal böyle olunca internet siteleri de ki bunların büyük çoğunluğu e-ticaret siteleri, kullanıcı(müşteri)lerinden tc kimlik no bilgisi istemeye başladı.Tabii bu alınan numaraların bir şekilde doğrulanması gerekir. İlk başlarda nüfus idaresinin web sitesinden bir web servisi aracılığı ile bunu kontrol ettirmek mümkündü. Fakat artık bu hizmet sadece belli kuruluşlara veriliyor.

Bu numaralar ilk bakışta gelişi güzel verilmiş gibi görünsede aslında bu rakamlarında kendi içinde bir düzeni var. İşte bu düzen bizim girilen kimlik numarasının geçerli bir kimlik numarası olup olmadığını kontrol etmemizde kullanacağımız algoritmanın temelini oluşturuyor.

Kimlik numarasına baktığımızda 11 basamaktan oluşan bir sayı gürürüz. Bu sayının son 2 basamağı ilk 9 basamağı kontrol etmek amacıyla eklenmiştir. Bu ilk 9 basamak ve son 2 basamak arasında şöyle bir bağlantı vardır.

Sayımız abcdefghijk olsun.

x = a+c+e+g+i tek basamaktaki rakamların toplamı
y = b+d+f+h çift basamaktaki rakamların toplamı
j = (7*x-y) mod10 olmalıdır. Bu birinci kuraldır.
İkinci kural ise;
k = (a+b+c+d+e+f+g+h+i+j) mod10 olmalıdır.

Yani yukarıdaki şartları sağlayan her 11 basamaklı sayı tc kimlik numarası olabilir ama bu demek değildirki bu gerçek bir tc kimlik numarasıdır. Bu metod sadece kimilik numarasının tc kimlik numarası standartlarında bir numara olduğunu doğrular. Kesin sonuç vermez.

Sonuçta kullanıcılarımızın girdiği tc kimlik numaralarını nüfus idaresinden kontrol etme şansımız yoksa bu yöntemle bir nebze de olsa doğu bir numara girilmesini sağlayabiliriz.

Şimdi gelelim php koduna. Kod içinde gerekli açıklamalar mevcuttur.

  1. /**
  2. * Verilen rakamin gecerli bir tc kimlik numarasi
  3. * olup olmadigini kontrol eder.
  4.  *
  5. * @param int $no
  6. * @return boolean
  7. */
  8. function checkIdentityNo($no) {
  9.     // Girilen numara 11 haneli mi?
  10.     if(strlen($no) != 11) {
  11.         // Değilse devam etmeye gerek yok
  12.         return FALSE;
  13.     }
  14.     $p = 0; // Cift basamaklar toplami
  15.     $s = 0; // Tek basamaklar toplami
  16.     $x = 0; // 10. basamaktaki sayi
  17.     $y = 0; // Ilk 10 basamagin toplami
  18.     // Çift ve Tek basamaklarin toplamini hesapla
  19.     for($i = 0; $i < 9; $i++) {
  20.         if($i % 2 == 0) {
  21.             $s += $no[$i];
  22.         } else {
  23.             $p += $no[$i];
  24.         }
  25.         $y += $no[$i];
  26.     }
  27.     // 10. bsamaktaki sayiyi hesapla
  28.     $x = (7*$s$p) % 10;
  29.     // Cikan sonuc girilen sayinin 10. basamagina esit mi?
  30.     if($x != $no[9]) {
  31.         // Değilse devam etmeye gerek yok
  32.         return FALSE;
  33.     }
  34.     // Ilk 10 basamagin toplami
  35.     $y += $x;
  36.     // Son basamaktaki sayi cikan sonuca eşit mi?
  37.     if($y % 10 != $no[10]) {
  38.         return FALSE;
  39.     }
  40.     return TRUE;
  41. }

Write a comment