C# / VB.NET – MD5 fonksiyonu(String To MD5)

C#, VB.NET, ASP.NET Add comments

MD5(Message Digest algorithm 5), MIT’de profesör olan Ron Rivest tarafından selefi olan MD4 üzerine geliÅŸtirilmiÅŸ hash algoritmasına dayalı bir fonksiyondur. 128 bit’lik çıktı üreten ve tek yönlü bir ÅŸifreleme sistemi olan(ki bu yüzden kırılması mümkün deÄŸildir) MD5 fonskiyonu, transfer edilmiÅŸ bilgilerin doÄŸru, eksiksiz bir ÅŸekilde yerine ulaşıp ulaÅŸmadığının kontrol edilmesinde ve public-key ÅŸifrelemesinde kullanılır. Matematiksel bir model üzerine kurulan MD5′in kırılmamazlığı, input olarak aldığı deÄŸerin uzunluÄŸuyla orantılır. Özellikle database iÅŸlemlerinde kullanıcılara ait bazı özel bilgilerin MD5 ile ÅŸifrelenecek tutulması tavsiye edilir. Bu veriler kötü niyetli kiÅŸiler tarafından çalınsa bile geri döndürülemediÄŸi için ciddi bir tehlike oluÅŸturmaz. Bazı sitelerde ÅŸifremizi unuttuÄŸumuzda bize unuttuÄŸumuz ÅŸifremiz deÄŸil yeni ÅŸifre gönderilir. Bu sitelerde ÅŸifreler, clear text(düz metin) olarak tutulmadığı için site yöneticisi de ÅŸifremizi göremez. Bu durumda ÅŸifremizi resetlemesinden baÅŸka seçenek bulunmamaktadır. Var olan ÅŸifreyi siler yeni bir kelime üretip o kelimenin MD5 deÄŸerini veritabanına atar ve bize de bu yeni kelimeyi ÅŸifre olarak gönderir.

Uygulamalarımızda string deÄŸerleri MD5 formatında ÅŸifreleyecek bir fonksiyona her zaman ihtiyacımız olabilir. Bu yazıda C# ve VB.NET dillerinde bu minik fonksiyonu bulabilirsiniz. .NET Framework’te MD5, SHA1, RSA algoritmaları ve diÄŸer ÅŸifreleme iÅŸlemleri için System.Security.Cryptography kütüphanesi sunulur. Bir string deÄŸeri MD5′ten geçirmek için MD5 sınıfının byte türünde parametre alan ComputeHash() metodu kullanılır.

using System.Text;
using System.Security.Cryptography;
. . .

string ConvertStringToMD5(string ClearText)
{
    byte[] ByteData = Encoding.ASCII.GetBytes(ClearText);
    //MD5 nesnesi oluşturalım.
    MD5 oMd5 = MD5.Create();
    //Hash değerini hesaplayalım.
    byte[] HashData = oMd5.ComputeHash(ByteData);

    //byte dizisini hex formatına çevirelim
    StringBuilder oSb = new StringBuilder();
    for (int x = 0; x < HashData.Length; x++)
    {
        //hexadecimal string deÄŸeri
        oSb.Append(HashData[x].ToString("x2"));
    }
    return oSb.ToString();
}
Function ConvertStringToMD5(ByVal ClearText As String) As String
    Dim ByteData As Byte() = Encoding.ASCII.GetBytes(ClearText)
    'MD5 nesnesi oluşturalım.
    Dim oMd5 As MD5 = MD5.Create()
    'Hash değerini hesaplayalım.
    Dim HashData As Byte() = oMd5.ComputeHash(ByteData)

    'byte dizisini hex formatına çevirelim
    Dim oSb As StringBuilder = New StringBuilder()
    Dim x As Integer = 0
    Do While x < HashData.Length
        'hexadecimal string deÄŸeri
        oSb.Append(HashData(x).ToString("x2"))
        x += 1
    Loop
    Return oSb.ToString()
End Function

14 Responses to “C# / VB.NET – MD5 fonksiyonu(String To MD5)”

  1. Selim Akıllı Says:

    Hocam teşekkürler, kendi projemde kullanıyorum, hakkını helal et ;) .

  2. Önsel AYDIN Says:

    Merhaba hocam bide decrypt fonksiyonu gerekiyor. Bakabilirmisin.

  3. Ahmet Kaymaz Says:

    Sayın Aydın,

    eÄŸer MD5′ten geri dönmeyi kastediyorsan bu mümkün deÄŸil en azından ÅŸimdilik :) . MD5, Hash algoritmasının bir örneÄŸi olup tek yönlü ÅŸifreleme yapar yani MD5 fonksiyonunda geçmiÅŸ deÄŸeri geri okuyamazsın. En basit ÅŸekliyle düşünelim örneÄŸin “AB” ÅŸeklinde bir string deÄŸerimizin olduÄŸunu ve toplama yöntemiyle bunu ÅŸifreleyen bir hash fonksiyonu olduÄŸunu düşünelim. “AB”= 65+66 = 131. Bu yeni deÄŸerden asıl deÄŸere ulaÅŸmak için güçlü makinelerle birçok ihtimali deÄŸerlendirmek gerekir. EÄŸer gerektiÄŸinde asıl deÄŸerini de okuyayım diyorsan System.Convert.ToBase64String() metodunu kullanabilirsin.

  4. Önsel AYDIN Says:

    İlginiz için çok teşekkür öncelikle. Şimdi ben sqlde bir alanımı sizin fonksiyonunuzla şifrelettirip kaydettim. DB8AC1C259EB89D4A131B253BACFCA5F319D5F2 gibi.Diyelim 1234 asıl stringim. Bunu dbden okurken biyerde 1234 gibi göstermem gerekiyor.Yani db den select ile çekerken şifreli hali değilde asıl hali görünmeli gibi bir method lazım asıl bana.

  5. Ahmet Kaymaz Says:

    MD5 ile ÅŸifreleme yapmanın mantığı hiçbir ÅŸekilde o deÄŸerin okunmamasını saÄŸlamaktır. EÄŸer hem ÅŸifreli dursun hem de istediÄŸim zaman asıl halini okuyabileyim diyorsanız MD5′i deÄŸil geri dönüşümü olan ÅŸifreleme algoritmalarını kullanabilirsiniz. ÖrneÄŸin Base64 ile kolaylıkla Encode ve Decode yapabilirsiniz. AÅŸağıdaki kodları inceleyip kendinize uyarlayabilirsiniz.
    Encode()

    static public string EncodeTo64(string toEncode){
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
    string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
    return returnValue;
    }

    Decode()

    static public string DecodeFrom64(string encodedData){
    byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
    string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
    return returnValue;
    }

    Bkz:http://arcanecode.wordpress.com/2007/03/21/encoding-strings-to-base64-in-c/

  6. Kenan DOGAN Says:

    Hocam merhaba,
    md5 in algoritmasını açık bir dille anlatan kaynak belirtmeniz mümkünmü?
    teşekkürler.

  7. Ahmet Kaymaz Says:

    Kenan bey,

    mutlaka denk gelmişsinizdir. Bununla ilgili aşağıdaki linkleri inceleyebilirsiniz.

    http://en.wikipedia.org/wiki/MD5
    http://www.ietf.org/rfc/rfc1321.txt
    http://www.secure-hash-algorithm-md5-sha-1.co.uk/

    Tabi bu kaynaklar ne kadar açık bir dil kullanıyor, bilemiyorum.

  8. Kenan DOGAN Says:

    Hocam ,
    Rivest’in makalesini inceliyorum zaten,
    ama biraz karışık.
    oncelikle hash yapacagımız yazıyı binary formata döndürmemiz gerkiyormu?
    append nasıl oluyor.mesela 1000 bit olunca?
    mesajı 32 lik bitleremi ayıracaz?
    word A,B,C ve D ne oluyor?
    F,G,H,I fonksiyonlarına giren X,Y,Z ne oluyor.
    XvY nasıl oluyor?
    [abcd k s i] nasıl bir fonksiyon….

    hocam md5 in nasıl işledigini anlayamadım.
    kısa bir metin üstünde açıklarsanız süper oalcak.
    ***@***.com a yazarsanız daha super olacak.
    kolay gelsin,
    Saygılar,
    Kenan DOGAN

  9. Ahmet Kaymaz Says:

    Sanırım daha akademik bir çalışmaya ihtiyacınız var.
    MD5 en basit haliyle uzunluÄŸu ne olursa olsun parametre olarak aldığı girdiyi 128 bit uzunluÄŸunda bir deÄŸer dönüştürür. MD5 girdiyi, 512 bitlik bloklara bölerek iÅŸlem yapar. EÄŸer girdi 512′ye tam bölünemiyorsa ona göre sizin de bahsettiÄŸiniz padding yani bit ekleme iÅŸlemi yapılır. A,B,C,D bu hash fonksiyonun baÅŸlangıç registerleridir. Her biri 32 bit olan bu deÄŸiÅŸkenler(state variables) 512 bitlik blokların iÅŸleme girmesi sonucu deÄŸer alırlar ve sonuçta yan yana konularak 4*32=128 bitlik bir çıktı elde edilir. F,G,H,I ise fonksiyon içerisindeki yardımcı fonksiyonlar (auxiliary functions) olarak düşünebilir. Bu fonksiyonlar her biri 32 bitlik olan 3 ifadeyi parametre olarak ve sonuçta bu ifadeleri mantıksal operatörlerden(and, or, not ve xor ) geçirir. Bu fonksiyonlar FF,GG,HH,II metodları tarafından çaÄŸrılır. Buradaki X, Y, Z baÅŸlangıç registerleri tarafından gönderilmiÅŸ bitleri temsil ediyor.
    Bu 4 step, her 512 bitlik blok için 16 kez çağrılır ve sonuçta her blok için 4*16=64 işlem yapılmış olur. Bu işlemde bitlerin kaydırılması sözkonusudur.
    FF[ABCD 0 7 1] FF[DABC 1 12 2] FF[CDAB 2 17 3] FF[BCDA 3 22 4]
    FF[ABCD 4 7 5] FF[DABC 5 12 6] FF[CDAB 6 17 7] FF[BCDA 7 22 8]
    FF[ABCD 8 7 9] FF[DABC 9 12 10] FF[CDAB 10 17 11]
    FF[BCDA 11 22 12]
    FF[ABCD 12 7 13] FF[DABC 13 12 14] FF[CDAB 14 17 15]
    FF[BCDA 15 22 16]

    Bu konuda ben de çok deneyimli değilim. Bu bilgilerle birlikte bir literatör taraması yapmanız daha doğru olacaktır. Bunun için de en uygun doküman http://www.faqs.org/rfcs/rfc1321.html adresidir olmazsa doğrudan bu algoritmayı çıkarmış kişiye mail atmanızdır: rivest@theory.lcs.mit.edu

  10. chtsmt Says:

    ya bu md5 is not declare ditor nerden tanımlıcaz anlayamadım lütfen yardım edbilirmisiniz

  11. Ahmet Kaymaz Says:

    Kodunuzu göremediğim için birşey diyemeyeceğim ama
    MD5 sınıfı System.Security.Cryptography isim-uzayı altında bulunmaktadır. Bu isim-uzayını using veya imports projeye eklememiş olabilir misiniz.

  12. çetin Says:

    oSb.Append(HashData[x].ToString(“x2″));

    hocam burada neden x2 eklemesi yapıyoruz. eklesek ne olur eklemesek ne olur.

  13. Ahmet Kaymaz Says:

    Çetin,

    “x2″ Hexadecimal sayıları string türünde göstermek için kullanılır.

  14. Murat Yurtdas Says:

    hocam cok teşekkürler gerçekten çok işime yaradı.

Leave a Reply


7 − = 4

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS GiriÅŸ