Makale Özeti

MD5 Checksum ile dosyaların doğruluğunu kontrol etmek.

Makale

MD5 Checksum ile dosyaların doğruluğunu kontrol etmek.

  

MD5, message digest 5 ifadesinin kısaltması bir çok güvenlik uygulamasında ve dosyaların uyumluluğunun kontrolü gibi işlemlerde kullanılan 128 bitlik bir kriptografi algoritmasıdır.

Tüm internet standartlarında olduğu gibi bir rfc (request for comments)  ile standartları belirlenmiştir. RFC 1321 MD5 Message Digest Algorithm standartlarını belirlemektedir. http://tools.ietf.org/html/rfc1321.

MD5 tek yönlü şifreleme yapan ve her girdi için tekil olan çıktı üreten bir algoritmaya sahiptir. (64k dan küçük veri girdilerinde tekillik oranın %90 değerine düştüğünü bazı kaynaklarda okumuştum.)

.NET ile uygulama geliştiren yazılım geliştiriciler için MD5 ile çalışmak çocuk oyuncağı kadar kolaydır.

.NET ile MD5 şifrelemesi yapmak için MD5CryptoServiceProvider sınıfı yeterli olacaktır.

MD5CryptoServiceProvider sınıfı türünde bir nesne elde edildikten sonra tek yapılması gereken ComputeHash metodunun çağrılmasıdır.

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Security.Cryptography;

namespace MD5CheckSum

{

    public class MD5Computer

    {

        private MD5CryptoServiceProvider md5;

        public MD5Computer()

        {

            md5 = new MD5CryptoServiceProvider();

        }

        public string Compute(String FileName)

        {

            return Compute(new FileStream(FileName, FileMode.Open));

        }

        public string Compute(Stream stream)

        {

            byte[] bytes = md5.ComputeHash(stream);

            stream.Close();

            return ConvertToString(bytes);

        }

        private string ConvertToString(byte[] bytes)

        {

            return BitConverter.ToString(bytes).Replace("-", "");

        }

    }

}

 

Yukarıdaki örnekte bir string veya stream nesnelerini parametre olarak alıp MD5 ile hash değerini elde eden ve bu bitconverter ile stringe dönüştürülüp geriye dönülüyor.

Dosya doğruluğu kontrolü

Bazı web sitelerinde bir dosyanın indirileceği sayfalarda dosyanın sunucudaki kopyasının MD5 değeri verilir. Dosya indirildikten sonra az sonra tamamlayacağız uygulama veya benzeri bir uygulama ile indirilen dosyanın MD5 değeri alınıp, dosya sağlayacısının verdiği değer ile karşılaştırılır değerler uymuyorsa, dosya download edilirken bir şekilde bir noktada değiştirilmiş veya eksik byte transferi gibi bir sebepten ötürü bozulmuş olabilir. Dosyayı tekrar indirmek gerekbilir.

Yukarıdaki şekilde bir form tasarımı oluşturup az önce oluşturduğumuz sınıfı kullanan aşağıdaki kodları yazalım.

namespace MD5CheckSum

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void btnBrowse_Click(object sender, EventArgs e)

        {

            OpenFileDialog of = new OpenFileDialog();

            if (of.ShowDialog() == DialogResult.OK)

            {

                txtFileName.Text = of.FileName;

                Compute(of.FileName);

            }

        }

 

        private void Compute(string FileName)

        {

            if (!string.IsNullOrEmpty(FileName))

            {

                if (File.Exists(FileName))

                {

                    MD5Computer md5Computer = new MD5Computer();

                    txtMD5.Text = md5Computer.Compute(FileName);

                }

                else

                {

                    MessageBox.Show("Dosya bulunamadı.");

                }

            }

            else

            {

                MessageBox.Show("Lütfen Dosya seçiniz.");

            }

        }

 

        private void textBox1_TextChanged(object sender, EventArgs e)

        {

            BeklenenIleKarsilastir();

        }

        private void txtMD5_TextChanged(object sender, EventArgs e)

        {

            BeklenenIleKarsilastir();

        }

        private void BeklenenIleKarsilastir()

        {

            string result;

            if (string.Compare(txtMD5.Text.Trim(), txtExpectedMD5.Text.Trim(), true) == 0)

            {

                lblResult.Text = "MD5 değerleri aynı.";

                lblResult.ForeColor = Color.Black;

            }

            else

            {

                lblResult.Text = "Beklenen ve bulunan MD5 değerleri aynı değil";

                lblResult.ForeColor = Color.Red;

            }

        }

    }

}

Örnek bir dosya indirelim ve sitede verilen hash değeri ile karşılaştıralım.

Tucows sitesinde download edilen dosyalar için MD5 değerleri veriliyor. (En azından benim gördüğüm tüm dosyalar için MD5 veriyorlar.)

http://www.tucows.com/get/194294_155204 adresinden Winzip 10 kurulumunu indirelim. Dosya için verilen MD5 Hash değeri :  3ffe2fe69b6f72fd0ec0e706ee985611

Yukarıdaki resime baktığımızda bizim yazdığımız program ile tucows sitesinden alıp MD5 beklenen bölümüne yapıştırdığımız değerler aynı olduğu için dosyanın indirilirken değişmeden sunucudaki orjinal hali ile bize geldiğini anlıyoruz.

Bu makale içerisinde bu sınıfı dosyaların doğruluğunu veya dosyanın alındığı yerden hasara ve değişikliğe uğramadan geldiğini anlamak için kullandık. Bu senaryo internetden indirilen bir dosyanın doğru olarak indirildiğini, bozulmadan indirildiğini sağlayabileceği gibi bir entegrasyon projesinde iş ortağınız tarafından gönderilen özel formatlı dosyanın tam, eksiksiz ve değişmeden geldiğini anlamak için de kulllanılabilir.

Cengiz HAN
Microsoft MVP
cengiz@cengizhan.com