• Статья
  • Чтение занимает 3 мин

В этой пошаговой статье показано, как получить значение hash и сравнить два значения хаша, чтобы проверить, идентичны ли они с помощью Visual C#. Он также предоставляет пример кода, чтобы показать, как это сделать.

Оригинальная версия продукта:   Visual C #
Исходный номер КБ:   307020

Аннотация

В этой статье упоминаются следующие пространства имен библиотеки платформа .NET Framework класса:

  • System.Security.Cryptography
  • System.Text

Класс в платформа .NET Framework позволяет легко вычислить значение System.Security.Cryptography hash для исходных данных.

Вычисление значения hash

Легко создавать и сравнивать значения hash с помощью криптографических ресурсов, содержащихся в System.Security.Cryptography пространстве имен. Так как все функции hash принимают ввод типа, может потребоваться преобразовать источник в массив byte перед его Byte[] хашированием. Чтобы создать hash для значения строки, выполните следующие действия:

  1. Откройте Visual Studio .NET или Visual Studio.

  2. Создание нового приложения консоли в Visual C# .NET или в Visual C# создает общедоступный класс для вас вместе с пустым Main() методом.

    Примечание

    В Visual C#. NET, Class1.cs создается по умолчанию. В visual C# по умолчанию создается Program.cs.

  3. Используйте директиву в пространствах имен и имен, чтобы в коде не требовалось квалифицировать объявления из этих пространств using System System.Security.Cryptography System.Text имен. Эти утверждения необходимо использовать перед любыми другими заявлениями.

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
  4. Объявите переменную строки для хранения исходных данных и два массива byte (неопределяемого размера) для хранения исходных bytes и полученных значений хаширования.

    string sSourceData;
    byte[] tmpSource;
    byte[] tmpHash;
    
  5. Используйте метод класса, чтобы преобразовать исходные строки в массив bytes (необходимый в качестве ввода в функцию GetBytes() System.Text.ASCIIEncoding хешинга).

    sSourceData = "MySourceData";
    //Create a byte array from source data.
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    
  6. Вычисляйте хаш MD5 для исходных данных, позвонив ComputeHash в экземпляр MD5CryptoServiceProvider класса.

    Примечание

    Чтобы вычислить другое значение hash, необходимо создать еще один экземпляр класса.

    //Compute hash based on source data.
    tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  7. В массиве byte теперь содержится вычисляемая для исходных данных значение tmpHash hash (128-bit value=16 bytes). Часто полезно отображать или хранить такое значение как гексадецимальная строка, которую выполняет следующий код:

    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. Сохраните и запустите код, чтобы увидеть в результате гексадецимальную строку для исходных значений.

Сравнение двух значений hash

Цели создания хаш из исходных данных:

  • Предоставление способа узнать, изменились ли данные с течением времени.
  • Сравнение двух значений без работы с фактическими значениями.

В любом случае необходимо сравнить два вычислительных хеши. Это легко, если они хранятся как гексадецимальные строки (как и на последнем шаге вышеуказанного раздела). Но вполне возможно, что они оба будут в виде массивов byte. В следующем коде, который продолжается из кода, созданного в предыдущем разделе, показано, как сравнить два массива bytes.

  1. Ниже создания гексадецимальной строки создайте новое значение хеши на основе новых исходных данных.

    sSourceData = "NotMySourceData";
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    byte[] tmpNewHash;
    tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  2. Самый простой способ сравнения двух массивов bytes — это цикл через массивы, сравнивая каждый отдельный элемент со вторым значением. Если какие-либо элементы отличаются друг от другого или если два массива не имеют одного размера, эти два значения не равны.

    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. Сохраните и запустите проект, чтобы просмотреть гексадецимальную строку, созданную из первого хеш-значения. Узнайте, равен ли новый хаш оригиналу.

Полное перечисление кода

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();
        }
    }
}

Ссылки

Дополнительные сведения об использовании криптографических функций платформа .NET Framework см. в .NET.