Programlama.com
Warning: include() [function.include]: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/pcom/inc/PrinterFriendlyheader.php on line 16

Warning: include(http://adserver.tazefasulye.net/zones/programlama.com.ustbanner.php) [function.include]: failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/pcom/inc/PrinterFriendlyheader.php on line 16

Warning: include() [function.include]: Failed opening 'http://adserver.tazefasulye.net/zones/programlama.com.ustbanner.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/pcom/inc/PrinterFriendlyheader.php on line 16
Bookmark and Share
VB 9.0 ile Şifreleme Yaparken Gözden Kaçan Bir Özellik
Programcıların atladığı fakat çok önemli olan bir özelliği buldum. Kodlarımızı yazarken dikkatli olmamız gerekiyor yoksa böyle ilginç tepkimelerle karşılaşırız
Programcılık konusunda makale yazanların atladığı çok önemli bir noktayı yakaladım. Çok önemli bir sorunla karşılaştım. Sonunun kaynağı karakter kodlama. Eğer uzun zamandır programcılıkla uğraşıyorsanız bir yerlerden öğrendiğiniz unicode ve utf8 gibi kavramlar ve Türkçe karakter uyumsuzluğu programlama dillerinde karşılaşılan bir durum. Bende şifreleme ile ilgili bir makaleye göz atarken atlanılan bir özelliği yakaladım. Makaleyi yazan kimse Türkçe karakterleri UTF8 karakter kodlaması olarak ele alıyordu. Ama .Net framework Türkçe karakter kodlamasını tanıdığı için Türkçe spesifik kodlama sınıfını kullanmak bırakın mantıklısını en iyisidir. Biraz uzun bir giriş oldu. Kodlarıma geçeceğim. Orda daha iyi anlayacaksınız.

Şimdi tek bir değişkene ihtiyacımız var.

Const metin As String = "Türkçe harfler: çğıöşü"


Yukarıdaki değişken sabit olduğu için bir sorunumuz yok. Ama asıl sorun Byte bilgisinde ortaya çıkıyor.

Byte bilgilerini almak içinde üç tane fonksiyona ihtiyacımız var


    "' Bu fonksiyon girilen metinin Türkçe ISO standartlarına
    "' göre byte bilgisini döndürür    
    Public Function GetBytes(ByVal s As String) As Byte()
        Dim kodlama = Encoding.GetEncoding(28599)
        Return kodlama.GetBytes(s)
    End Function

    "' Bu fonksiyon girilen metinin Unicode standartlarına
    "' göre byte bilgisini döndürür    
    Public Function GetBytesUnicode(ByVal s As String) As Byte()
        Return Encoding.Unicode.GetBytes(s)
    End Function

    "' Bu fonksiyon girilen metinin UTF8 standartlarına
    "' göre byte bilgisini döndürür    
    Public Function GetBytesUTF8(ByVal s As String) As Byte()
        Return Encoding.UTF8.GetBytes(s)
    End Function


Yukarıdaki fonksiyonlarda alınan bytelar farklı olabilir. Neden? Çünkü Birinde UTF8 karakter kodlaması yeralıyor ötekisinde ise ISO Türkçe karakter kodlaması yeralıyor. Ben burda ISO Türkçe karakter kodlamasını kullandım. Çünkü Türkçe'nin kendine has harflerinin dağıtılmasını kolaylaştırıyor. İsterseniz Windows un kendi karakter kodu olan Yani Windows_Turkish kodu olan 1254 sayısınıda kullanabilirsiniz.

Üçtane Türkçe karakter kodlama standartdı var.
Bunlar Windows Türkçe
ISO Türkçe ve IBM Türkçe. Ayrıca MAC Türkçe de var. Hepsinin kodu farklı.
Windows Türkçe için 1254 kodu kullanılırken
ISO Türkçe için 28599 kodu kullanılmalı.

Tam olarak Türkçe Karakter kodlama standart isimlerini veriyorum:

Standart adı: ibm857 kod sayfası: 857 kısaca adı: Turkish (DOS)

Standart adı: IBM1026 kod sayfası: 1026 kısaca adı: IBM EBDIC (Turkish Latin-5)

Standart adı: windows-1254 kod sayfası: 1254 kısaca adı: Turkish (Windows)

Standart adı: x-mac-turkish kod sayfası: 10081 kısaca adı: Turkish (Mac)

Standart adı: IBM905 kod sayfası: 20905 kısaca adı: IBM EBDIC (Turkish)

Standart adı: iso-8859-9 kod sayfası: 28599 kısaca adı: Turkish (ISO)

Türkçe karakterler için kullanılacak en iyi standart ISO standarttıdır. Çünkü hem Linux tarafından hemde Windows tarafından ve MacosX tarafındanda desteklenmek zorunda olunan bir standarttır.  İster masa üstü uygulamalarda isterseniz web programlama dillerinde unutmamanız gereken bir nokta.


Standartlarıda verdikten sonra karşılaştığım problemi veriyorum:
İşte metin değişkeni şifrelenirken karşıma çıkan değerler

birincisi UTF8 kodlaması ile alınmıştır
w92zC7TkzUrDLXJ7XIWtLQ7Vnlr9JxZNsG6JRzN+0TjjKfTnwcfFJLiPEYPiIfJz7wrUoub5FcUC96c6qjHhUA==

Aşağıdaki Unicode olarak alınmıştır
X6N2UwTpehh3OEZ5FBMKxRYQ9iOlNX0rBX+IAoNgpTmeLTFCpoR6JM9jQkJLyBYo1vpZBn4zTxZHbOx6Qd8OSw==

ve son olarakda Türkçe ISO olarak alınan
lRf6MjChk2Q+vyU6+A+1TNlA2Inu3ZlBbZ3mYYKz9yGfto4HSJfIO1NCRNWtW4/OIHhoJrExBQHV1L/OvvgrBg==

Yularıdaki sonuçlarda gördüğünüz gibi kodlarınızı yazarken çok dikkatli olmalısınız. Öyle her programcıya güvenipte kodları kopyala çalıştır yöntemi ile kolaylaştırma yoluna giderseniz böyle sorunlarla karşılaşmanız olası. Aslında sorun değil sadece harf standartları farklı olduğu için byte bilgilerindede farklılıklar çıkıyor. Bir senaryo düşünün asp.net web sayfası olsun. Sayfası kullanıcıya gönderirken ResponseEncoding özelliğini ISO-8859-9 yaptınız. Ama tarayıcı bilgiyi gönderirken UTF8 yaptı peki ne olucak. Al sana saç baş yolmaya sebeb. İşte sırf bu yüzden dikkatli olmanız için bu makaleyi yazdım. Kodlarınıza dikkat işlerinizde başarılar dilerim. Esenlikle kalın.

Tam kodlar aşağıdaki gibidir:

Option Explicit On
Option Strict On

Imports System
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text

Module Giris

    "' Bu fonksiyon girilen metinin Türkçe ISO standartlarına
    "' göre byte bilgisini döndürür    
    Public Function GetBytes(ByVal s As String) As Byte()
        Dim kodlama = Encoding.GetEncoding(28599)
        Return kodlama.GetBytes(s)
    End Function

    "' Bu fonksiyon girilen metinin Unicode standartlarına
    "' göre byte bilgisini döndürür    
    Public Function GetBytesUnicode(ByVal s As String) As Byte()
        Return Encoding.Unicode.GetBytes(s)
    End Function

    "' Bu fonksiyon girilen metinin UTF8 standartlarına
    "' göre byte bilgisini döndürür    
    Public Function GetBytesUTF8(ByVal s As String) As Byte()
        Return Encoding.UTF8.GetBytes(s)
    End Function

    Public Function Sifrele(ByVal buffer As Byte()) As String
        Dim hash As New SHA512Managed
        hash.Initialize()
        Return Convert.ToBase64String(hash.ComputeHash(buffer))
    End Function


    <STAThread()> Sub Main()

        Console.Title = "Şifreleme"
        Const metin As String = "Türkçe harfler: çğıöşü"

        Console.WriteLine("Orjinal metin: {0}", metin)
        Console.WriteLine("ISO Türkçe olarak şifrelenmiş hali:")
        Console.WriteLine(Sifrele(GetBytes(metin)))

        Console.WriteLine("Şimdide Unicode olarak şifrelenmiş hali:")
        Console.WriteLine(Sifrele(GetBytesUnicode(metin)))

        Console.WriteLine("Son olarakda UTF8 kodlamasında şifrelenmiş hali:")
        Console.WriteLine(Sifrele(GetBytesUTF8(metin)))

        Console.Read()
    End Sub

End Module

© Programlama.com 1998 - 2003. Her Hakkı Saklıdır. Lütfen Anlaşma Metnini Görmek İçin Burayı Tıklayın