Kredi Kartı Numarası Nasıl Doğrulanır? Luhn Algoritması Açıklaması
Luhn algoritması, bir kredi kartı numarasının basamaklarını belirli bir kurala göre toplayıp sonucun 10’a tam bölünüp bölünmediğine bakan bir sağlama (checksum) formülüdür. Kart ağları, oluşturdukları her numaranın bu kontrolden geçmesini garanti eder, bu yüzden tek bir rakamın yanlış yazılması neredeyse her zaman sonucu bozar ve ödeme bankaya ulaşmadan reddedilir.
Kural: Luhn algoritması kısaca
Adımlar şöyle işler:
- Numaranın en sağındaki basamaktan başlayıp sola doğru ilerleyin.
- Sağdan sayarken çift sıradaki (2., 4., 6.…) her basamağı 2 ile çarpın.
- Çarpım iki basamaklı bir sayı çıkarsa (yani 9’dan büyükse), sonuçtan 9 çıkarın. Bu, o iki basamağı toplamakla aynı işi görür (örneğin 8×2=16 için 16-9=7, çünkü 1+6=7).
- Değiştirilen ve değiştirilmeyen tüm basamakları topla.
- Toplam 10’un katıysa numara Luhn sağlamasından geçer.
Bu kural her kart ağı için aynıdır. Ağlar, kartı bastığı numaranın son basamağını tam olarak bu toplam 10’un katı çıkacak şekilde seçer, kontrol basamağı ayrı bir tablodan gelmez.
Formül, adını IBM mühendisi Hans Peter Luhn’dan alır ve 1954’te geliştirilip 1960’ta patentlenmiştir. Bugün ISO/IEC 7812 standardının bir parçası olarak kredi kartlarının yanı sıra IMEI numaralarında, bazı ulusal kimlik numaralarında ve stok takip kodlarında da aynı mantıkla kullanılır. Kriptografik anlamda güvenli değildir, amacı sahteciliği önlemek değil, insan ya da klavye kaynaklı yazım hatalarını en ucuz noktada yakalamaktır.
Örnek üzerinden adım adım kontrol
Geliştiricilerin sandbox ortamlarında sıkça kullandığı, yayınlanması güvenli olan gerçek bir Visa test numarasıyla ilerleyelim:
4111 1111 1111 1111
16 basamak var, yani soldan sağa en baştaki 4 de dahil olmak üzere çift sıradaki (sağdan 2, 4, 6… 16.) sekiz basamak ikiye katlanır. Basamak basamak tablosu şöyle:
| Konum (sağdan) | Basamak | İkiye katlanır mı | Katkı |
|---|---|---|---|
| 16 | 4 | Evet | 4×2=8 |
| 15 | 1 | Hayır | 1 |
| 14 | 1 | Evet | 1×2=2 |
| 13 | 1 | Hayır | 1 |
| 12 | 1 | Evet | 1×2=2 |
| 11 | 1 | Hayır | 1 |
| 10 | 1 | Evet | 1×2=2 |
| 9 | 1 | Hayır | 1 |
| 8 | 1 | Evet | 1×2=2 |
| 7 | 1 | Hayır | 1 |
| 6 | 1 | Evet | 1×2=2 |
| 5 | 1 | Hayır | 1 |
| 4 | 1 | Evet | 1×2=2 |
| 3 | 1 | Hayır | 1 |
| 2 | 1 | Evet | 1×2=2 |
| 1 | 1 | Hayır | 1 |
Katlanan yedi tane “1” basamağı 2’ye dönüşür ve toplamları 14 eder. Baştaki 4 katlanınca 8 olur (4×2=8, 9’dan büyük olmadığı için düzeltme gerekmez). Katlanmayan sekiz “1” basamağı ise doğrudan toplanır ve 8 eder. Genel toplam:
14 (katlanan yedi "1") + 8 (katlanan "4") + 8 (katlanmayan sekiz "1") = 30
30, 10’un tam katı olduğu için 4111111111111111 Luhn sağlamasından geçer. Bu da gerçeğe uyuyor: bu numara, Stripe ve PayPal dahil birçok ödeme sağlayıcısının belgelerinde kullanılan geçerli bir Visa test numarasıdır.
Tek bir yazım hatası neden sağlamayı bozar
Şimdi aynı numaranın son basamağını yanlışlıkla 1 yerine 2 yazdığınızı düşünün:
4111 1111 1111 1112
Son basamak sağdan 1. konumda, yani katlanmayan bir konumda. Bu yüzden değeri doğrudan toplama girer. Orijinalde bu basamağın katkısı 1’di, şimdi 2 oldu, yani toplam 30’dan 31’e çıkar. 31, 10’un katı değil, sağlama başarısız olur ve araç bu numarayı hiçbir ağa sorulmadan, hiçbir banka çağrısı yapılmadan anında geçersiz işaretler.
Bu, klavyede tek tuşluk bir kaymanın (parmak kayması) neredeyse her zaman yakalandığı anlamına gelir. Sağlama, her basamağın toplama farklı ağırlıkla katıldığı bir zincir olduğu için, ortadaki bir basamağı değiştirmek de sondaki bir basamağı değiştirmek kadar sonucu bozar.
Ağlara göre bilinen test numaraları
Aşağıdaki numaralar, ödeme sağlayıcılarının belgelerinde ve sandbox ortamlarında kullanılan, endüstri genelinde bilinen genel test numaralarıdır. Gerçek bir müşteri kartı değildir, güvenle paylaşılabilir:
| Kart ağı | Test numarası |
|---|---|
| Visa | 4111 1111 1111 1111 |
| Visa (alternatif) | 4012 8888 8888 1881 |
| Mastercard | 5555 5555 5555 4444 |
| American Express | 3782 822463 10005 |
| Discover | 6011 1111 1111 1117 |
Hepsi Luhn sağlamasından geçer, bu yüzden bir ödeme formunda bu numaralardan biri reddedilirse sorun neredeyse kesinlikle formun kendi doğrulama mantığındadır, numaranın kendisinde değil. American Express diğerlerinden farklı olarak 15 basamaklıdır ve geleneksel olarak 4-6-5 gruplarıyla yazılır, 4-4-4-4 değil.
Kendi numaranızla deneyin
Aşağıdaki araç, girdiğiniz numarayı doğrudan tarayıcınızda kontrol eder, hiçbir şey bir sunucuya gönderilmez. Yukarıdaki test numaralarından birini yapıştırıp Luhn sonucunun ve tespit edilen kart ağının nasıl değiştiğini görebilirsiniz.
Luhn size neyi söylemez
Luhn sağlamasından geçmek, yalnızca numaranın matematiksel olarak doğru biçimlendirildiğini gösterir. Bu, kartın gerçekten var olduğu, aktif olduğu ya da üzerinde bakiye bulunduğu anlamına gelmez. Bir numara Luhn geçerli olsa bile hiç basılmamış, iptal edilmiş ya da limiti sıfır bir karta ait olabilir. Bunu yalnızca kartı çıkaran banka, işlem gerçek ödeme ağına gönderildiğinde doğrulayabilir. Bu yüzden bir ödeme formunda Luhn kontrolü, ilk savunma hattıdır, tek savunma değil.
Gerçek bir ödemede sıra şöyle işler: form önce Luhn ile numaranın biçimini kontrol eder, sonra kart ağının prefiksine bakarak Visa mı Mastercard mı olduğunu belirler, ardından işlemi kartı çıkaran bankaya gönderir. Banka orada bakiyeyi, son kullanma tarihini, CVV’yi ve dolandırıcılık kurallarını kontrol eder. Luhn bu zincirin en başındaki, en ucuz ve en hızlı adımdır, bir ağ isteği veya bekleme süresi gerektirmeden saniyenin çok altında çalışır. Bu yüzden geliştiriciler onu form tarafında (client-side) çalıştırıp kullanıcıya anında geri bildirim verir, gerçek onay sürecini beklemeden.
Sık yapılan hatalar ve sınır durumlar
Luhn, tek basamak hatalarının neredeyse tamamını ve komşu iki basamağın yer değiştirmesi durumlarının çoğunu yakalar, ama tam anlamıyla kusursuz değildir. İyi bilinen ve literatürde kayıtlı bir kör noktası var: aralarındaki fark tam olarak 9 olan iki komşu basamağın yer değiştirmesi, yani bir 0 ile bir 9’un yan yana yer değiştirmesi. Bu durumda toplam değişmez, çünkü katlanan ve katlanmayan konumlardaki katkı farkı birbirini götürür, ve hatalı numara sağlamadan sessizce geçer. Pratikte bu son derece nadirdir, ama Luhn’un “her hatayı yakalar” diye pazarlanmaması gerektiğini gösteren gerçek bir sınırdır.
Bir başka yaygın karışıklık, sağlamanın yönüdür. Bazı geliştiriciler yanlışlıkla en soldaki basamaktan başlayıp sağa doğru katlar, oysa kural her zaman en sağdan başlayıp sola doğru işler. 16 basamaklı bir numarada bu fark sonucu değiştirmez çünkü basamak sayısı çifttir, ama 15 basamaklı American Express gibi tek sayılı uzunluklarda yön ters uygulanırsa hangi basamakların katlandığı değişir ve sağlama yanlış çıkar.
Bir de girdi temizliği meselesi var. Kullanıcılar kart numarasını genellikle boşluklu (4111 1111 1111 1111) ya da tire ile (4111-1111-1111-1111) yapıştırır. Sağlamayı hesaplamadan önce bu ayraçların temizlenip yalnızca rakamların bırakılması gerekir, aksi halde algoritma boşluğu ya da tireyi bir basamak sanıp yanlış sayıda karakter üzerinden hesap yapar ve geçerli bir numarayı bile hatalı olarak işaretler. İyi bir doğrulayıcı bu normalleştirmeyi kullanıcıdan saklı biçimde kendisi yapar.
Sıkça sorulan sorular
Luhn algoritması hangi kart ağlarında kullanılır? Visa, Mastercard, American Express, Discover, Diners Club, JCB ve UnionPay dahil neredeyse tüm büyük kart ağları, kart numaralarının son basamağını Luhn sağlaması geçecek şekilde belirler. Bu, tek bir ortak standarttır, ağa özel bir formül değildir.
Luhn sağlamasından geçen bir numara gerçek bir kart mı demektir? Hayır. Sağlama yalnızca dizinin matematiksel olarak doğru biçimlendirildiğini doğrular. Kartın var olduğunu, aktif olduğunu veya bakiyesi olduğunu göstermez, bunu yalnızca kartı çıkaran bankanın sistemi teyit edebilir.
Neden bazı geçerli görünen numaralar hâlâ reddediliyor? Bir ödeme formu, Luhn sağlamasının yanı sıra son kullanma tarihi, CVV, kart ağının uzunluk kuralları ve gerçek bankacılık ağı üzerinden yapılan bir yetkilendirme kontrolü de yapar. Luhn geçse bile bu diğer kontrollerden biri numarayı reddedebilir, bu ayrı bir aşamadır.
Test formlarımda gerçek bir kart numarası kullanabilir miyim? Kullanmamalısınız. Sandbox ve test ortamları için yukarıdaki tablodaki genel test numaraları tam olarak bu amaçla vardır ve hiçbir gerçek hesaba bağlı değildir. Gerçek bir kart numarasını test formuna yazmak, kartı gereksiz yere üçüncü taraf sistemlere maruz bırakır.