Karma değerleri hesaplamak ve karşılaştırmak için Visual C# kullanma

Bu adım adım makalede, Visual C# kullanarak karma değeri elde etme ve iki karma değeri karşılaştırarak özdeş olup olmadıklarını denetleme adımları gösterilmektedir. Ayrıca bu görevin nasıl yapılacağını gösteren bir kod örneği de sağlar.

Orijinal ürün sürümü: Visual C#
Özgün KB numarası: 307020

Özet

Bu makale, aşağıdaki Microsoft .NET Framework Sınıf Kitaplığı ad alanlarını ifade eder:

  • System.Security.Cryptography
  • System.Text

System.Security.Cryptography.NET Framework sınıfı, kaynak verileriniz için bir karma değeri hesaplamayı kolaylaştırır.

Karma değeri hesaplama

Ad alanında bulunan System.Security.Cryptography şifreleme kaynaklarını kullanarak karma değerleri oluşturmak ve karşılaştırmak kolaydır. Tüm karma işlevleri türünde Byte[]girdiler kullandığından, karma haline getirilmeden önce kaynağı bir bayt dizisine dönüştürmek gerekebilir. Bir dize değeri için karma oluşturmak için şu adımları izleyin:

  1. Visual Studio .NET veya Visual Studio'yu açın.

  2. Visual C# .NET veya Visual C# içinde yeni bir Konsol Uygulaması oluşturun, boş Main() bir yöntemle birlikte sizin için bir genel sınıf oluşturur.

    Not

    Visual C# dilinde. NET, Class1.cs varsayılan olarak oluşturulur. Visual C#'de Program.cs varsayılan olarak oluşturulur.

  3. using Kodunuzda daha sonra bu ad alanlarının Systembildirimlerini nitelemeniz gerekmeyecek şekilde , System.Security.Cryptographyve System.Text ad alanları üzerindeki yönergesini kullanın. Bu deyimler diğer bildirimlerden önce kullanılmalıdır.

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
  4. Kaynak verilerinizi tutmak için bir dize değişkeni ve kaynak baytları ve sonuçta elde edilen karma değeri tutmak için iki bayt dizisi (tanımsız boyutta) bildirin.

    string sSourceData;
    byte[] tmpSource;
    byte[] tmpHash;
    
  5. GetBytes() Kaynak dizenizi bayt dizisine dönüştürmek için sınıfının yöntemini System.Text.ASCIIEncoding kullanın (karma işlevine giriş olarak gereklidir).

    sSourceData = "MySourceData";
    //Create a byte array from source data.
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    
  6. Sınıfının bir örneğini çağırarak ComputeHash kaynak verileriniz için MD5 karması hesaplama MD5CryptoServiceProvider .

    Not

    Başka bir karma değeri hesaplamak için sınıfının başka bir örneğini oluşturmanız gerekir.

    //Compute hash based on source data.
    tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  7. Bayt tmpHash dizisi artık kaynak verileriniz için hesaplanan karma değeri (128 bit değer=16 bayt) tutar. Bunun gibi bir değeri aşağıdaki kodun gerçekleştirdiği onaltılık bir dize olarak görüntülemek veya depolamak genellikle yararlıdır:

    Console.WriteLine(ByteArrayToString(tmpHash));
    static string ByteArrayToString(byte[] arrInput)
    {
        int i;
        StringBuilder sOutput = new StringBuilder(arrInput.Length);
        for (i=0;i < arrInput.Length; i++)
        {
            sOutput.Append(arrInput[i].ToString("X2"));
        }
        return sOutput.ToString();
    }
    
  8. Kaynak değerin elde edilen onaltılık dizesini görmek için kodunuzu kaydedin ve çalıştırın.

İki karma değeri karşılaştırma

Kaynak verilerden karma oluşturmanın amaçları şunlardır:

  • Verilerin zaman içinde değişip değişmediğini görmenin bir yolunu sağlar.
  • Gerçek değerlerle hiç çalışmadan iki değeri karşılaştırma.

Her iki durumda da iki hesaplanan karmayı karşılaştırmanız gerekir. Her ikisi de onaltılık dizeler olarak depolanıyorsa (yukarıdaki bölümün son adımında olduğu gibi) kolaydır. Ancak ikisinin de bayt dizileri biçiminde olması mümkündür. Önceki bölümde oluşturulan koddan devam eden aşağıdaki kodda iki bayt dizisinin nasıl karşılaştırıldığı gösterilmektedir.

  1. Onaltılık dize oluşturma işleminin hemen altında, yeni kaynak verileri temel alan yeni bir karma değeri oluşturun.

    sSourceData = "NotMySourceData";
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    byte[] tmpNewHash;
    tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  2. İki bayt dizisini karşılaştırmanın en basit yolu, her bir öğeyi ikinci değerden karşılık gelen öğeyle karşılaştırarak diziler arasında döngü yapmaktır. Herhangi bir öğe farklıysa veya iki dizi aynı boyutta değilse, iki değer eşit değildir.

    bool bEqual = false;
    if (tmpNewHash.Length == tmpHash.Length)
    {
        int i=0;
        while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i]))
        {
            i += 1;
        }
        if (i == tmpNewHash.Length)
        {
            bEqual = true;
        }
    }
    
    if (bEqual)
        Console.WriteLine("The two hash values are the same");
    else
        Console.WriteLine("The two hash values are not the same");
    Console.ReadLine();
    
  3. İlk karma değerden oluşturulan onaltılık dizeyi görüntülemek için projenizi kaydedin ve çalıştırın. Yeni karmanın özgün karmaya eşit olup olmadığını öğrenin.

Tam kod listesi

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

namespace ComputeAHash_csharp
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static void Main(string[] args)
        {
            string sSourceData;
            byte[] tmpSource;
            byte[] tmpHash;
            sSourceData = "MySourceData";
            //Create a byte array from source data
            tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);

            //Compute hash based on source data
            tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
            Console.WriteLine(ByteArrayToString(tmpHash));

            sSourceData = "NotMySourceData";
            tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);

            byte[] tmpNewHash;

            tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);

            bool bEqual = false;
            if (tmpNewHash.Length == tmpHash.Length)
            {
                int i=0;
                while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i]))
                {
                    i += 1;
                }
                if (i == tmpNewHash.Length)
                {
                    bEqual = true;
                }
            }

            if (bEqual)
                Console.WriteLine("The two hash values are the same");
            else
                Console.WriteLine("The two hash values are not the same");
            Console.ReadLine();
        }

        static string ByteArrayToString(byte[] arrInput)
        {
            int i;
            StringBuilder sOutput = new StringBuilder(arrInput.Length);
            for (i=0;i < arrInput.Length -1; i++)
            {
                sOutput.Append(arrInput[i].ToString("X2"));
            }
            return sOutput.ToString();
        }
    }
}

Başvurular

.NET Framework şifreleme özelliklerini kullanma hakkında daha fazla bilgi için bkz. .NET.