Makale Özeti

MD5, PHP ile yazılım geliştiren arkadaşlara gayet yakın gelecek bir başlıktır. PHP'deki md5() method'u size verdiğiniz string için 32 karakterlik alfanumerik bir string üretir ve bu string verilen değer için her zaman aynıdır. Böylece kullanıcı şifreleri veritabanında tekrar karşılaştırılabilecek şekilde güvenle saklanabilir. MD5 ile ilgili bilinmesi gereken en önemli nokta, asla geri çevrim yapılamamasıdır. Yani MD5 tek taraflı bir şifreleme tipidir.

Makale

MD5, PHP ile yazılım geliştiren arkadaşlara gayet yakın gelecek bir başlıktır. PHP'deki md5() method'u size verdiğiniz string için 32 karakterlik alfanumerik bir string üretir ve bu string verilen değer için her zaman aynıdır. Böylece kullanıcı şifreleri veritabanında tekrar karşılaştırılabilecek şekilde güvenle saklanabilir. MD5 ile ilgili bilinmesi gereken en önemli nokta, asla geri çevrim yapılamamasıdır. Yani MD5 tek taraflı bir şifreleme tipidir.

.NET Framework'ün bize sunduğu sınıflar (bu sınıflara daha sonra değineceğim) sayesinde oluşturacağımız MD5 hash string'inin tek farkı ise, her 2 karakterde bir, 2 karakterlik diziler oluşturmak için hash string'imize eklenen "-" işaretleridir.

.NET Framework'ünde bulunan System.Security.Cryptography namespace'i, size uygulamalarınızda MD5 dahil birçok şifreleme algoritmasının sınıflarını ve base sınıflarını barındırır. Bu sınıfların tek bir makale içerisinde anlatılması oldukça zor olacağından, makalenin başlığında da belirtildiği gibi, sadece MD5 algoritmasının kullanımı ile ilgili yüzeysel bilgiler vereceğim.

Öncelikli olarak makale içerisinde yazılacak örnek uygulamamız içerisinde bulunan sınıflardan kabaca bahsetmek gerekirse;

System.Security.Cryptography.MD5CryptoServiceProvider sınıfı:

System.Security.Cryptography.MD5 abstract sınıfından türetilmiştir. CryptoServiceProvider implementasyonu ile oluşturulmuştur ve görevi MD5 hash string'i üretmektir. MD5 algoritması için şifreleme işlemleri sunacak tüm sınıfların bu sınıftan türetilmesi gerekmektedir.

System.Security.Cryptography.MD5 sınıfı ise System.Security.Cryptography.HashAlgorithm sınıfından türetilmiştir ve bu sınıf bizlere ComputeHash gibi, tüm şifreleme yöntemlerinin sahip olması gereken base method'ları sunar. Ayrıca tüm şifreleme algoritmaları bu sınıftan türetilmek zorundadır.

System.BitConverter sınıfı:

Static bir sınıftır. Tek görevi base data tiplerini byte dizisine çevirmek ve byte dizisini tekrar base data tipine çevirmektir.


System.Text.UnicodeEncoding sınıfı:

Verilen unicode değerin, UTF-16 karakter sınıfına çevirilmesini sağlar.
Dilerseniz makalemizin uygulama kısmına geçelim.

Öncelikli olarak ihtiyacımız olan, verdiğimiz string değeri, System.Text.UnicodeEncoding sınıfını kullanarak byte dizisine çevirecek olan bir methoddur. Bunun sebebi MD5 hash string'imizi oluşturacak olan method'un bizden byte dizisi tipinde bir parametre istemesidir.


private static byte[] ToByteArray( object value )
{
    byte[] result = new byte[] { };
    string val = value as string;
    if ( val != null )
    result = new System.Text.UnicodeEncoding ().GetBytes ( val );
    return result;

}


Bu sınıfı static yaratmamızın sebebi, MD5 string'imizi oluşturacak olan method'umuzu da static olarak yazacak olmamızdır. Bu konuyla ilgili ayrıntılı bilgi vereceğim.

Şu anda string'i byte dizisine çeviren bir method'a sahibiz. Sıra geldi MD5 string'imizi oluşturacak method'umuzu yazmaya.

public static string ToMD5( string value )
{
    byte[] hash = new System.Security.Cryptography.MD5CryptoServiceProvider ().ComputeHash ( ToByteArray ( value ) );
    string result = System.BitConverter.ToString ( hash );
    result = result.Replace ( "-" , "" );
    return result;

}

MD5CryptoServiceProvider sınıfının sahip olduğu ComputeHash method'unu kullanarak yeni bir byte dizisine sahip olduk.

şimdi ihtiyacımız olan tek şey, sahip olduğumuz byte dizisini string'e çevirecek olan method. Bu method, daha öncesinde de bahsettiğim gibi System.BitConverter sınıfı içerisinde mevcut.

System.BitConverter sınıfının ToString method'u 3 adet overload'a sahiptir. Bunlar sırası ile aşağıdaki gibidir:

public static string ToString(byte[] value);
public static string ToString(byte[] value,int startIndex);
public static string ToString(byte[] value,int startIndex,int length);


Biz tüm byte dizimizin string'e çevirilmesini istediğimiz için, ilk overload'u kullandık.

Bu method'un bize döndürdüğü değerin içerisinde bulunan "-" işaretlerini de boş değerler ile değiştirdikten sonra, MD5 hash string'imizi döndürdük.

"-" işaretlerini değiştirmemizin sebebinden makalenin 2. paragrafında bahsetmiştim. Dileyen yazılımcı arkadaşlar, bu işaretleri değiştirmeyerek 47 karakter uzunluğunda, her 2 karakterden sonra "-" işareti taşıyan bir hash string'e sahip olabilirler.


şimdi ise kalan tek konu yazmış olduğumuz sınıfı bir uygulama içerisinde kullanmak.

Not: Test uygulamasında kullanılacak olan şifre 123 olarak belirlenmiştir ve 123 string'inin MD5 hash string'i 5FA285E1BEBE0A6623E33AFC04A1FBD5'dir. Bu değeri veritabanında sakladığımızı düşünebilirsiniz.

Aşağıdaki gibi gayet sade ve şifre girilebilecek bir alan ile giriş işlemini kontrol edecek bir butona sahip form hazırlayalım.

Formumuzda, butonumuzun OnClick event'ine aşağıdaki kodu yazalım:

if ( MD5Provider.ToMD5 ( txSifre.Text ) == "5FA285E1BEBE0A6623E33AFC04A1FBD5" )
    MessageBox.Show ( "Giriş başarılı." );
else
    MessageBox
.Show ( "Giriş hatalı." );


Uygulamamızı çalıştırıp, şifre alanın "12" yazıp, "Giriş kontrol" butonuna tıklayalım. Karşımıza aşağıdaki MessageBox çıkacaktır:

şimdi de işlemimizi şifre alanına "123" yazarak deneyelim. Karşımıza aşağıdaki MessageBox çıkacaktır. Bu da bize "123" string'inin MD5 hash string'inin her zaman aynı değere, yani 5FA285E1BEBE0A6623E33AFC04A1FBD5 string'ine eşit olduğunu gösterir.

Yazmış olduğumuz sınıfı tüm Asp.NET web uygulamalarınızda, tüm C# uygulamalarınızda ve VB.NET'e kolayca çevirerek tüm VB.NET uygulamalarınızda güvenle kullanabilirsiniz.