Verwenden von Visual C# zum Berechnen und Vergleichen von Hashwerten

In diesem Schritt-für-Schritt-Artikel erfahren Sie, wie Sie einen Hashwert abrufen und zwei Hashwerte vergleichen, um mithilfe von Visual C# zu überprüfen, ob sie identisch sind. Es enthält auch ein Codebeispiel, das zeigt, wie diese Aufgabe ausgeführt wird.

Ursprüngliche Produktversion: Visual C#
Ursprüngliche KB-Nummer: 307020

Zusammenfassung

Dieser Artikel bezieht sich auf die folgenden Namespaces der Microsoft .NET Framework-Klassenbibliothek:

  • System.Security.Cryptography
  • System.Text

Die System.Security.Cryptography -Klasse im .NET Framework erleichtert das Berechnen eines Hashwerts für Ihre Quelldaten.

Berechnen eines Hashwerts

Es ist einfach, Hashwerte mit den kryptografischen Ressourcen zu generieren und zu vergleichen, die System.Security.Cryptography im Namespace enthalten sind. Da alle Hashfunktionen Eingaben vom Typ Byte[]annehmen, kann es erforderlich sein, die Quelle in ein Bytearray zu konvertieren, bevor sie gehasht wird. Führen Sie die folgenden Schritte aus, um einen Hash für einen Zeichenfolgenwert zu erstellen:

  1. Öffnen Sie Visual Studio .NET oder Visual Studio.

  2. Erstellen Sie eine neue Konsolenanwendung in Visual C# .NET oder in Visual C# erstellt eine öffentliche Klasse zusammen mit einer leeren Main() Methode für Sie.

    Hinweis

    In Visual C#. NET , Class1.cs standardmäßig erstellt wird. In Visual C# wird Program.cs standardmäßig erstellt.

  3. Verwenden Sie die using -Anweisung für die SystemNamespaces , System.Security.Cryptographyund System.Text , damit Sie Deklarationen aus diesen Namespaces später in Ihrem Code nicht qualifizieren müssen. Diese Anweisungen müssen vor allen anderen Deklarationen verwendet werden.

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
  4. Deklarieren Sie eine Zeichenfolgenvariable, die Ihre Quelldaten enthält, und deklarieren Sie zwei Bytearrays (von nicht definierter Größe), die die Quellbytes und den resultierenden Hashwert enthalten.

    string sSourceData;
    byte[] tmpSource;
    byte[] tmpHash;
    
  5. Verwenden Sie die GetBytes() -Methode der System.Text.ASCIIEncoding -Klasse, um Ihre Quellzeichenfolge in ein Bytearray zu konvertieren (erforderlich als Eingabe für die Hashfunktion).

    sSourceData = "MySourceData";
    //Create a byte array from source data.
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    
  6. Berechnen Sie den MD5-Hash für Ihre Quelldaten, indem Sie für eine instance der MD5CryptoServiceProvider -Klasse aufrufenComputeHash.

    Hinweis

    Um einen weiteren Hashwert zu berechnen, müssen Sie einen weiteren instance der -Klasse erstellen.

    //Compute hash based on source data.
    tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  7. Das tmpHash Bytearray enthält jetzt den berechneten Hashwert (128-Bit-Wert=16 Bytes) für Ihre Quelldaten. Es ist häufig nützlich, einen Wert wie diesen als hexadezimale Zeichenfolge anzuzeigen oder zu speichern, was der folgende Code ermöglicht:

    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. Speichern Sie den Code, und führen Sie diesen aus, um die resultierende hexadezimale Zeichenfolge für den Quellwert anzuzeigen.

Vergleichen von zwei Hashwerten

Die Zwecke der Erstellung eines Hashs aus Quelldaten sind:

  • Bietet eine Möglichkeit, zu ermitteln, ob sich Daten im Laufe der Zeit geändert haben.
  • Vergleich von zwei Werten, ohne jemals mit den tatsächlichen Werten zu arbeiten.

In beiden Fällen müssen Sie zwei berechnete Hashes vergleichen. Es ist einfach, wenn beide als hexadezimale Zeichenfolgen gespeichert werden (wie im letzten Schritt des obigen Abschnitts). Es ist jedoch möglich, dass beide in Form von Bytearrays vorliegen. Der folgende Code, der mit dem im vorherigen Abschnitt erstellten Code fortfährt, zeigt, wie zwei Bytearrays verglichen werden.

  1. Erstellen Sie direkt unterhalb der Erstellung einer hexadezimalen Zeichenfolge einen neuen Hashwert basierend auf neuen Quelldaten.

    sSourceData = "NotMySourceData";
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    byte[] tmpNewHash;
    tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  2. Die einfachste Möglichkeit zum Vergleichen von zwei Bytearrays besteht darin, die Arrays in einer Schleife zu durchlaufen, wobei jedes einzelne Element mit seinem Gegenstück aus dem zweiten Wert verglichen wird. Wenn elemente unterschiedlich sind oder die beiden Arrays nicht die gleiche Größe aufweisen, sind die beiden Werte ungleich.

    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. Speichern Sie das Projekt, und führen Sie es dann aus, um die hexadezimale Zeichenfolge anzuzeigen, die aus dem ersten Hashwert erstellt wurde. Finden Sie heraus, ob der neue Hash gleich dem Ursprünglichen ist.

Vollständige Codeauflistung

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

References

Weitere Informationen zur Verwendung der kryptografischen Features des .NET Framework finden Sie unter .NET.