Merhaba, Bu örnekte C# ile herhangi bir yazının MD5, SHA-1, SHA256, SHA384 ve SHA512 hash değerinin nasıl hesaplanabileceğini anlatmaya çalışacağım.
Şimdi önemli olan bir konudan bahsetmek istiyorum. Herhangi bir yazının hash değerini hesaplamak ciddi bir işlemdir. Hata kabul etmez. Hata yapmanız durumunda doğru hash değerini elde edemezsiniz. Buradaki hatadan kastım Yazının Encoding şeklidir.
Aşağıda (Ü) harfinin kodlama örneklerini göreceğiz.
“Ü” Harfinin UTF-8 Karşılığı: \xc3\x9c
“Ü” Harfinin UTF-16 Karşılığı: \u00dc
“Ü” Harfinin UTF-32 Karşılığı: u+000000dc
Şimdi yukarıdaki örneklere göre UTF-8 karakterlerin hash karşılığı, UTF-16 karakterlerin hash karşılıkları ile aynı olamaz. Bu yüzden hash hesaplaması yaparken lütfen karakter encoding bölümüne dikkat edin. Bir program yazarken eğer UTF-8 Encoding biçimini tercih ederseniz ve hash hesaplaması yapacaksanız, lütfen encoding biçimini değiştirmeyin. Uzun lafın kısası: eğer kullanıcıdan UTF-8 karakter kodlamasında veri aldıysanız, hash değerini UTF-8 olarak hesaplayın.
Kullanılacak Kütüphaneler
using System;
using System.Security.Cryptography; // Hash değerini hesaplamamız için gerekli kütüphane
using System.Text; // Encoding işlemleri için kullanıcağımız kütüphane
Hash Değeri Hesaplama
NOT: Buradaki kod hafıza dostu bir kod değildir.
string yazi = "Deneme";
byte[] yaziBytes = Encoding.UTF8.GetBytes(yazi); // Burada UTF-8 karakter kodlamasını kullandık.
SHA256 sha = SHA256.Create();
byte[] sonuc = sha.ComputeHash(yaziBytes);
for (int i = 0; i < sonuc.Length; i++)
{
Console.Write(sonuc[i].ToString("x2"));
}
Console.ReadLine();
Aşağıda örnek bir uygulama yapılmıştır.
using System;
using System.Security.Cryptography;
using System.Text;
namespace KorayUstundag
{
internal class Program
{
static void Main(string[] args)
{
string yazi = "Deneme";
byte[] yaziBytes = Encoding.UTF8.GetBytes(yazi);
SHA256 sha = SHA256.Create();
byte[] sonuc = sha.ComputeHash(yaziBytes);
for (int i = 0; i < sonuc.Length; i++)
{
Console.Write(sonuc[i].ToString("x2"));
}
Console.ReadLine();
}
}
}
Yukarıdaki örnek uygulamada “Deneme” yazısının SHA256 Hash değerini hesaplıyıp ekrana okunabilir bir hash değeri yazdırılmıştır.
Programı çalıştırdığınız zaman ekranda “a7ae1a431366f6d25f302684d2a7b67cec7ef1d1787b1d11c7ff1192bb4bdf46” çıktısını alacaksınız. Bu değer hiçbir zaman değişmez.
Şimdi isterseniz Memory Safe bir kod yazalım.
using System;
using System.Security.Cryptography;
using System.Text;
namespace KorayUstundag
{
internal class Program
{
static void Main(string[] args)
{
string yazi = "Deneme";
StringBuilder hashDegeri = new StringBuilder();
using (SHA256 sha = SHA256.Create())
{
byte[] sonuc = sha.ComputeHash(Encoding.UTF8.GetBytes(yazi));
for (int i = 0; i < sonuc.Length; i++)
{
hashDegeri.Append(sonuc[i].ToString("x2"));
}
}
Console.WriteLine(hashDegeri.ToString());
Console.ReadLine();
}
}
}