30 Mayıs 2007 Çarşamba

TC Kimlik No Doğrulama Algoritması

 

TC Kimlik No Doğrulama Algoritması


Abdullah ÇATAKLI  

 

TC Kimlik No Doğrulama Algoritmasının T-SQL ile gerçekleştireceğiz.

 

 

 

Hepimiz bir şekilde veritabanımızda personel, müşteri gibi şahıs bilgilerinin tutulduğu tablolar yapmışızdır. Peki, bu tablolardaki TC Kimlik No alanına aldığımız değerler gerçekten doğru mu? Veya böylesine önemli bir bilgiyi kullanıcılar el çabukluğuyla yanlış mı girdiler. İşte bu makalede TC Kimlik No bilgisinin doğru olup olmadığını test eden fonksiyonu tanıyacağız.

Bildiğimiz gibi TC NO kimlik numarası 11 karakterli sayısal bir değerdir. Ve bir benzeri asla yoktur. TC Kimlik No bilgilerimiz aslında rasgele oluşturulmuş, düzensiz rakamlar değillerdir. Belli bir algoritma ile bu verilerin doğruluğunu test edebiliriz.

Bu fonksiyon ile sadece TC No bilgisinin doğru girilip girilmediği kontrol edilir. Fonksiyonun kullanımı gayet basit. Sadece TC NO kimlik numarasını bigint tipinde sayısal olarak alıyor ve yerine Boolean tipinde olan bit değerini döndürüyor. Eğer doğruysa 1 yanlışsa 0 değerini döndürüyor. Bu fonksiyon sayesinde İlgili tabloda bir Trigger oluşturup kaydedilmek istenen TC NO değeri kontrol edilip hatalı ise işlem durdurulabilir.

Fonksiyonun Kullanımı

SELECT  dbo.Fn_TcNoDogrumu(22879614234) 

ayrıca aynı fonksiyonu, bir tablo sütununa check constraint olarak da verebilirsiniz.

Fonksiyonun Kodu

CREATE FUNCTION dbo.Fn_TcNoDogrumu(@TcNo Bigint)
RETURNS BIT
AS
BEGIN
DECLARE @ATCNO  Bigint
DECLARE @BTCNO  Bigint
DECLARE @C1    Tinyint
DECLARE @C2    Tinyint
DECLARE @C3    Tinyint
DECLARE @C4    Tinyint
DECLARE @C5    Tinyint
DECLARE @C6    Tinyint
DECLARE @C7    Tinyint
DECLARE @C8    Tinyint
DECLARE @C9    Tinyint
DECLARE @Q1    Int
DECLARE @Q2    Int
DECLARE @R             Bit
 
SET @ATCNO = @TcNo / 100
SET @BTCNO = @TcNo / 100
 
IF LEN(CONVERT(VARCHAR(19),@TcNo)) = 11
BEGIN
SET @C1 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C2 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C3 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C4 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C5 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C6 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C7 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C8 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @C9 = @ATCNO % 10 SET @ATCNO = @ATCNO / 10 
SET @Q1 = ((10-((((@C1+@C3+@C5+@C7+@C9)*3)+(@C2+@C4+@C6+@C8)) % 10))%10)
SET @Q2 = ((10-(((((@C2+@C4+@C6+@C8)+@Q1)*3)+(@C1+@C3+@C5+@C7+@C9))%10))%10)
 
IF (@BTCNO * 100)+(@Q1 * 10)+@Q2 = @TcNo SET @R = 1 ELSE SET @R = 0
 
END ELSE SET @R = 0
 
RETURN @R
END

Sonuç ve Öneriler

Bu örneği ben T-SQL kullanarak programladım. Ancak görüldüğü gibi çok fazla sayıda işlem gerektiren karışık bir hesaplama yapılmakta. SQL Server 2005'de de bu türden bir fonksiyonu doğrudan kullanabileceğiniz gibi CLR desteğinden yararlanarak, C# gibi bir dille de aynı işlevi sağlayacak bir fonksiyon kodlayabilirsiniz.

Ayrıca, algoritmayı daha üst seviyelerde veri doğrulama amacıyla kendi programlama ortamınızda yeniden gerçekleyebilirsiniz.

Hiç yorum yok: