Md5 | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar md5

C# MD5 yöntemi ile metin şifreleme

14 August 2011 Yorum yapılmamış

Aşağıdaki küçük fonksiyon yardımıyla string tipindeki değişkenlerin içeriğini MD5 yöntemi ile şifreleyebiliriz.

Öncelikle kodumuzun using kısmına System.Security.Cryptography namespace‘ini eklememiz lazım.

Böylece MD5CryptoServiceProvider sınıfından yeni bir örnek (instance) oluşturabilir, ve şifreleme sağlayıcısı (crypto service provider) olarak kullanabiliriz.

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

public static string Sifrele(string Metin)
{
	MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

	byte[] ba = Encoding.UTF8.GetBytes(Metin);
	ba = md5.ComputeHash(ba);

	StringBuilder sb = new StringBuilder();
	foreach (byte b in ba)
	{
		sb.Append(b.ToString("x2").ToLower());
	}

	return sb.ToString();
}

C# ile Hash işlemi

06 July 2010 2 yorum

Sql Server ile nasıl hash yapabileceğimizi daha önce Sql Server’da Hash işlemi isimli makalemde yazmıştım. Bu sefer, .net üzerinde C# ile nasıl hash işlemi yapabileceğimizi yazacağım.

Hash, büyük boyutta girdi verisi için sabit boyutlu üretilen benzersiz değerdir. Hash algoritmalarının yapısından dolayı, girdi verisindeki küçük değişiklikler sonuç verisinde büyük farklılıklara yol açmaktadır.

.Net Framework üzerinde bulunan System.Security.Cryptography namespace’i, güvenli şifreleme ve çözme işlemleri için şifreleme servislerini barındırır.

.Net Framework şu hash algoritmalarını destekler;

MD5, girdi verisini şifrelemek için 128 bit şifreleyici kullanır
SHA1, girdi verisini şifrelemek için 160 bit şifreleyici kullanır
SHA256, girdi verisini şifrelemek için 256 bit şifreleyici kullanır
SHA384, girdi verisini şifrelemek için 384 bit şifreleyici kullanır
SHA512, girdi verisini şifrelemek için 512 bit şifreleyici kullanır

En çok kullanılan şifreleme yöntemlerinden biri SHA1‘dir.

SHA1 Hashing Algoritması Örneği

Öncelikle kod yazdığımız dosyanın using kısmına System.Secuity.Cryptography namespace’ini eklemeliyiz;

using System.Secuity.Cryptography;

SHA1 sınıfından bir örnek oluşturalım;

SHA1 sha = new SHA1CryptoServiceProvider();

SHA1 sınıfı abstract bir sınıf olduğu için kendisinden örnek oluşturamıyoruz. SHA1 sınıfından türetilen SHA1CryptoServiceProvider sınıfından bir örnek oluşturuyoruz.

Artık yapmamız gereken, sha isimli değişkenimizin ComputeHash() method’unu çağırmak. ComputeHash() method’u, şifrelenecek veriyi parametre olarak byte dizisi aldığı ve geriye şifrelenmiş veriyi byte dizisi olarak döndürdüğü için aşağıdaki örnekte olduğu gibi kullanabiliriz;

string SifrelenecekVeri = "http://www.enginpolat.com/";

string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri)));

Uygulamanın kodlarının toparlanmış hali;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

class Program
{
  static void Main(string[] args)
  {
    SHA1 sha = new SHA1CryptoServiceProvider();

    string SifrelenecekVeri = "http://www.enginpolat.com/";

    string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri)));

    Console.WriteLine(SifrelenmisVeri);

    Console.ReadLine();
  }
}

Yukarıdaki örneği çalıştırırsanız şifrelenmiş çıktı şöyle olacaktır;

8hocM3G7QhUoN7Nm3bWMSr0/SsM=

Birkaç Faydalı Extension Method

30 January 2010 2 yorum

C# 3.0 ile gelen Extension Method desteğini çok kullanışlı bulduğum için, kendi uygulamalarımda kullanmaya çalışıyorum. Bu yazımda faydalı bulduğum birkaç Extension Method‘u toplamaya çalıştım.

Metni Encrypt – Decrypt Eden Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string Encrypt(this string stringToEncrypt, string key)
		{
			if (string.IsNullOrEmpty(stringToEncrypt))
				throw new ArgumentException("Boş metin şifrelenemez");
			if (string.IsNullOrEmpty(key))
				throw new ArgumentException("Şifreleme için anahtar vermelisiniz");

			CspParameters cspp = new CspParameters();
			cspp.KeyContainerName = key;

			RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
			rsa.PersistKeyInCsp = true;

			byte[] bytes = rsa.Encrypt(UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

			return BitConverter.ToString(bytes);
		}

		public static string Decrypt(this string stringToDecrypt, string key)
		{
			if (string.IsNullOrEmpty(stringToDecrypt))
				throw new ArgumentException("Beş metnin şifresi çözülemez");
			if (string.IsNullOrEmpty(key))
				throw new ArgumentException("Şifre çözme için anahtar vermelisiniz");
			string result = null;
			try
			{
				CspParameters cspp = new CspParameters();
				cspp.KeyContainerName = key;

				RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
				rsa.PersistKeyInCsp = true;

				string[] decryptArray = stringToDecrypt.Split("-");
				byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, NumberStyles.HexNumber))));
				byte[] bytes = rsa.Decrypt(decryptByteArray, true);

				result = UTF8Encoding.UTF8.GetString(bytes);
			}
			catch()
			{
			}
			return result;
		}
	}
}

Örnek kullanım;

string metin = "My Secret";
string sifrelenmis = metin.Encrypt("sifreleyici");
string sifresicozulmus = sifrelenmis.Decrypt("sifreleyici");

Listeler üzerinde Foreach Yapan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static void ForEach<T>(this IEnumerable<T> kaynak, Action<T> islem)
		{
			foreach (var item in kaynak)
				islem(item);
		}
	}
}

Örnek kullanım;

List<string> isimler = new List<string> { "engin", "polat", "ahmet", "mehmet", "murat" };
isimler.ForEach(isim => MessageBox.Show(isim));

İnternet Adresi Doğrulayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static bool IsValidUrl(this string text)
		{
			Regex r = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
			return r.IsMatch(text);
		}
	}
}

Örnek kullanım;

string Adres = "http://www.enginpolat.com";
bool AdresDogru = Adres.IsValidUrl();

Email Adresi Doğrulayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static bool IsValidEmail(this string text)
		{
			Regex r = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
			return r.IsMatch(text);
		}
	}
}

Örnek kullanım;

string Adres = "test@test.com";
bool AdresDogru = Adres.IsValidEmail();

Klasör Oluşturan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static void CreateDirectory(this DirectoryInfo dirInfo)
		{
			if (dirInfo.Parent != null)
				CreateDirectory(dirInfo.Parent);
			if (!dirInfo.Exists)
				dirInfo.Create();
		}
	}
}

Örnek kullanım;

var dir = new DirectoryInfo(@"C:\temp\bir\iki\uc");
dir.CreateDirectory();

Tarihin Haftasonuna Geldiğini Doğrulayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static bool IsWeekend(this DateTime value)
		{
			return (value.DayOfWeek == DayOfWeek.Sunday || value.DayOfWeek == DayOfWeek.Saturday);
		}
	}
}

Örnek kullanım;

for (DateTime date = BaslangicTarih; date <= BitisTarih; date = date.AddDays(1))
{
	if (date.IsWeekend())
		continue;
	/// Tatil değil, yapılacak işler yapılır.
}

Object türünden JSON’a, JSON’dan Object Türüne Çeviren Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string ToJson(this object obj)
		{
			JavaScriptSerializer serializer = new JavaScriptSerializer();
			return serializer.Serialize(obj);
		}

		public static T FromJson<T>(this object obj)
		{
			JavaScriptSerializer serializer = new JavaScriptSerializer();
			return serializer.Deserialize<T>(obj as string);
		}
	}
}

Örnek kullanım;

Personel Engin = new Personel("Engin Polat", 5000);
string json = Engin.ToJson();
Engin = null;
Engin = s.FromJson<Personel>();

Tarihten Yaş Hesaplayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static int Age(this DateTime tarih)
		{
			DateTime now = DateTime.Now;
			int yas = now.Year - tarih.Year;
			if (now < tarih.AddYears(yas))
				yas--;
			return yas;
		}
	}
}

Örnek kullanım;

DateTime AhmetDogumGunu = new DateTime(1979, 05, 07);
int Yas = AhmetDogumGunu.Age();

Ayın İlk Gününü – Ayın Son Gününü Bulan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static DateTime FirstDayOfMonth(this DateTime date)
		{
			return new DateTime(date.Year, date.Month, 1);
		}

		public static DateTime LastDayOfMonth(this DateTime date)
		{
			return new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1).AddDays(-1);
		}
	}
}

Örnek kullanım;

DateTime Simdi = DateTime.Now;
MessageBox.Show("Ayın ilk günü: " + Simdi.FirstDayOfMonth().ToShortDateString());
MessageBox.Show("Ayın son günü: " + Simdi.LastDayOfMonth().ToShortDateString());

Dosyanın MD5 Değerini Hesaplayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string GetMD5(this string filename)
		{
			string result = string.Empty;

			try
			{
				MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
				FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
				byte[] arrByteHashValue = md5Provider.ComputeHash(fileStream);
				fileStream.Close();

				string hashData = BitConverter.ToString(arrByteHashValue).Replace("-", "");
				result = hashData;
			}
			catch()
			{
			}
			return result.ToLower();
		}
	}
}

Örnek kullanım;

string Dosya = @"C:\Temp\DosyaAdi.txt";
MessageBox.Show(Dosya + " dosyasının MD5 değeri: " + Dosya.GetMD5());

Sql Server’da Hash işlemi

13 January 2010 Yorum yapılmamış

Uygulamalarımızda verileri hash‘lemeye her zaman ihtiyaç duyarız. Verileri hash’lemek için kullanabileceğimiz birçok araç vardır.

Eğer veriyi veritabanı katmanında (Sql Server) hash’lemek istiyorsak, MSDN‘de şu sayfada bulunan makalede okuyabileceğiniz gibi HASHBYTES fonksiyonu ile  yapabiliriz.

HASHBYTES fonksiyonu iki parametre alır;

Algoritma: Hash’leme algoritması. Alabileceği değerler; MD2, MD4, MD5, SHA, SHA1

Veri: Hash işlemine tabi tutulacak veri

HASHBYTES fonksiyonu geriye VarBinary(8000) tipinde değer döndürür.

MD5 algoritması ile hash işlemi yapan örnek kod;

SELECT
	KULLANICI_KODU,
	KULLANICI_ADI,
	HASHBYTES('MD5', KULLANICI_SIFRE) AS KULLANICI_SIFRE
FROM
	T_KULLANICI WITH (NOLOCK)
CREATE PROCEDURE PR_KULLANICI_EKLE
(
	@KULLANICI_KODU VARCHAR(5),
	@KULLANICI_ADI VARCHAR(50),
	@KULLANICI_SIFRE VARCHAR(15)
)
AS
INSERT INTO T_KULLANICI
	(KULLANICI_KODU, KULLANICI_ADI, KULLANICI_SIFRE, KAYIT_TARIHI)
VALUES
	(@KULLANICI_KODU, @KULLANICI_ADI, HASHBYTES('MD5', @KULLANICI_SIFRE), GETDATE())

SELECT SCOPE_IDENTITY()
CREATE PROCEDURE PR_KULLANICI_LOGIN
(
	@KULLANICI_ADI VARCHAR(50),
	@KULLANICI_SIFRE VARCHAR(15)
)
AS
SELECT
	KULLANICI_KODU,
	KULLANICI_ADI,
	HASHBYTES('MD5', KULLANICI_SIFRE) AS KULLANICI_SIFRE
FROM
	T_KULLANICI WITH (NOLOCK)
WHERE
	KULLANICI_ADI = @KULLANICI_ADI AND
	KULLANICI_SIFRE = HASHBYTES('MD5', @KULLANICI_SIFRE)

Güvenlik ihtiyaçlarından ötürü kıymetli bilgilerin network’ten ulaşılmasını önlemek için, veriyi taşımadan önce hash‘lemek isteyebilirsiniz. HASHBYTES fonksiyonu bu işin son derece kullanışlı gözüküyor.

Not : Yazıyı yazdıktan sonra gördüm ki, Emre Ayrılmaz şuradaki makalesinde aynı konuyu işlemiş, okunmasında fayda var.