Memik Yanık - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS RSS | İletişim

MD5 Algoritması İle Şifreleme Yapmak


Güvenliğin öne çıktığı uygulamalarda bazı bilgiler şifrelenip öyle veritabanına kaydedilmek istenir. Bu sayede veritabanı bir şekilde incelendiğinde gerçek bilgi öğrenilmemiş olur. Örneğin bir üyelik sisteminde üyelerin parolalarını şifreleyip öyle veritabanına kaydetmek isteyebilirsiniz. Bu gibi durumlarda nasıl şifreleme yapıldığını anlatmak üzerinde çalıştığım projesinin formunu aşağıdaki gibi düzenledim.

 

Bu formdaki TextBox’lara kullanıcı adı ve parolası girilip “Kaydet” düğmesi tıklandığında girilen bilgiler MD5 algoritmasıyla şifrelenip öyle veritabanına kaydedilecektir. Bu işlenin nasıl yapıldığını anlatmak için ilk olarak Kaydet düğmesinin Click olayını temsil eden metotta .NET Framework ile gelen MD5CrytoServicesProvider sınıfının örneğini aldım. 

private
void kaydet_Click(object sender, EventArgs e) 
 
  MD5CryptoServiceProvider md5_nesne = new MD5CryptoServiceProvider(); 
 

MD5, SHA1, SHA512 gibi algoritmalara Hashing algoritmaları adı verilmektedir. MD5CryptoServiceProvider nesnesi ancak byte dizisi şeklinde düzenlenmiş bilgileri şifreleyebildiği için bu koda ekleme yapıp ilk TextBox’ın içeriğini byte dizisin aldık. 

private
void kaydet_Click(object sender, EventArgs e) 
 
  MD5CryptoServiceProvider md5_nesne = new MD5CryptoServiceProvider(); 
  char[] kar_dizi = textBox1.Text.ToCharArray(); 
  int uzunluk = kar_dizi.Length;  
  byte[] byte_dizi_kullanici = new byte[uzunluk]; 
  for (int i = 0; i < uzunluk; i++) 
  
    byte_dizi_kullanici[i] =(byte) kar_dizi[i];  
   }
} 

Formdaki ilk TextBox’ın içeriğini byte dizisini alırken önce String sınıfının ToCharArray() metoduyla Char dizisine aldık. Devamında for döngüsü ile char dizisinin elemanlarını tek tek byte dizisine aldık. Tabi bu işlemi daha az satırla yapmak mümkündür. Formdaki 2. TextBox’ın içeriğini byte dizisine alırken Unicode sınıfının GetBytes() metodundan yararlandık. 

private
void kaydet_Click(object sender, EventArgs e) 
 
  MD5CryptoServiceProvider md5_nesne = new MD5CryptoServiceProvider(); 
  char[] kar_dizi = textBox1.Text.ToCharArray(); 
  int uzunluk = kar_dizi.Length;  
  byte[] byte_dizi_kullanici = new byte[uzunluk]; 
  for (int i = 0; i < uzunluk; i++) 
  
    byte_dizi_kullanici[i] =(byte) kar_dizi[i];  
  
  UnicodeEncoding uni_nesne = new UnicodeEncoding(); 
  byte[] byte_dizi_parola = uni_nesne.GetBytes(textBox2.Text);   
}

Şifrelemek istediğimiz bilgileri bu şekilde byte dizilerine aldıktan sonra sırada bu byte dizilerini MD5CryptoServiceProvider sınıfının ComputeHash() metodu ile şifrelemek var. Bu metot şifrelenecek byte dizisini parametre olarak alıp geriye başka bir byte dizisi gönderir. 

private
void kaydet_Click(object sender, EventArgs e)

  MD5CryptoServiceProvider md5_nesne = new MD5CryptoServiceProvider(); 
  char[] kar_dizi = textBox1.Text.ToCharArray(); 
  int uzunluk = kar_dizi.Length;  
  byte[] byte_dizi_kullanici = new byte[uzunluk]; 
  for (int i = 0; i < uzunluk; i++) 
  
       byte_dizi_kullanici[i] =(byte) kar_dizi[i];  
  
   UnicodeEncoding uni_nesne = new UnicodeEncoding(); 
   byte[] byte_dizi_parola = uni_nesne.GetBytes(textBox2.Text); 
   byte[] sifeli_kullanici = md5_nesne.ComputeHash(byte_dizi_kullanici); 
   byte[] sifeli_parola = md5_nesne.ComputeHash(byte_dizi_parola);
} 

Bu sırada şifrelenmiş kullanıcı adı ve parolası byte dizisinde tutulmaktadır. Bu byte dizilerini direk veritabanına kaydetmek mümkün(yani anlamlı olmaz) olmadığına göre dizilerin içeriklerini string değişkenlere aktarmak gerekir. Byte dizilerini string değişkene aktarmanın değişik yöntemleri olsa bile BitConverter sınıfının ToString() metodunu kullandık. MD5CryptoServiceProvider sınıfı sayesinde yapılan şifrelemenin sonucunu göstermek için forma 2 TextBox yerleştirip bu 2 değişkenin içeriğini bu TextBox’lara aktardık. 

private
void kaydet_Click(object sender, EventArgs e) 
 
  MD5CryptoServiceProvider md5_nesne = new MD5CryptoServiceProvider(); 
  char[] kar_dizi = textBox1.Text.ToCharArray(); 
  int uzunluk = kar_dizi.Length;  
  byte[] byte_dizi_kullanici = new byte[uzunluk]; 
  for (int i = 0; i < uzunluk; i++) 
  
     byte_dizi_kullanici[i] =(byte) kar_dizi[i];  
  
  UnicodeEncoding uni_nesne = new UnicodeEncoding(); 
  byte[] byte_dizi_parola = uni_nesne.GetBytes(textBox2.Text); 
  byte[] sifeli_kullanici = md5_nesne.ComputeHash(byte_dizi_kullanici); 
  byte[] sifeli_parola = md5_nesne.ComputeHash(byte_dizi_parola); 
  string kullanici_str = BitConverter.ToString(sifeli_kullanici);   
  string parola_str = BitConverter.ToString(sifeli_parola); 
 textBox3.Text = kullanici_str; 
  textBox4.Text = parola_str;  
 } 

Bu şartlarda “kullanici_str” ve “parola_str” adı verilen string değişkenlerin içerikleri veritabanına yazılabilir. Daha sonra veritabanını inceleyen kötü niyetli birisi kullanıcının adını ve gerçek parolasının ne olduğunu bilemez. Aşağıda verilen ekran görüntüsünü ilk 2 TextBox’a bilgi girip bu kodu işlettikten sonra aldım.



MD5CryptoServiceProvider
sınıfıyla yapılan şifrelemede her seferinde aynı sonuç alınır. Ayıca şifrelenmiş metinden yola çıkılarak orijinal metni elde etmek, yani deşifre işlemini yapmak mümkün değildir. Bu nedenle veritabanından herhangi bir kullanıcının adı ve parolası okunduğunda karşılaştırma yapılmadan önce TextBox’ın içeriği yukarıda yapıldığı gibi yine MD5CryptoServiceProvider sınıfıyla şifrelenip ondan sonra karşılaştırma yapılır. 

MD5CryptoServiceProvider
sınıfıyla yapılan şifreleme işlemine Hashing adı verilmektedir. Tek yönlü şifreleme yaparken bu sınıf yerine SHA1 algoritmasını kullanan SHA1CryptoServiceProvider sınıfından yararlanabilirsiniz. Bu 2 sınıfın kullanım şekilleri birbirinden farklı değildir.

Güvenlik 08.10.2009 08:03:16

1 YORUM


YorumlarYorum Yaz
Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS | İletişim
Memik Yanık 2004-2009 © Tüm Hakları Saklıdır.
Hazırlayan www.semgoksu.com