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 wie Sie zwei Hashwerte vergleichen, um mit Visual C# zu überprüfen, ob sie identisch sind. Es enthält auch ein Codebeispiel, um zu zeigen, wie diese Aufgabe ausgeführt wird.
Originalversion des Produkts: Visual C #
Ursprüngliche KB-Nummer: 307020
Zusammenfassung
Dieser Artikel bezieht sich auf die folgenden Namespaces der Microsoft .NET Framework-Klassenbibliothek:
System.Security.CryptographySystem.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 mithilfe der im System.Security.Cryptography Namespace enthaltenen kryptografischen Ressourcen zu generieren und zu vergleichen. Da alle Hashfunktionen Eingaben vom Typ Byte[]annehmen, ist es möglicherweise erforderlich, 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:
Öffnen Sie Visual Studio .NET oder Visual Studio.
Wenn Sie eine neue Konsolenanwendung in Visual C# .NET oder Visual C# erstellen, wird zusammen mit einer leeren
Main()Methode eine öffentliche Klasse für Sie erstellt.Hinweis
In Visual C#. NET, Class1.cs wird standardmäßig erstellt. In Visual C# wird "Program.cs " standardmäßig erstellt.
Verwenden Sie die
usingDirektive für die Namespaces und dieSystemNamespacesSystem.Security.Cryptography,System.Textdamit Sie Deklarationen aus diesen Namespaces später im Code nicht qualifizieren müssen. Diese Anweisungen müssen vor allen anderen Deklarationen verwendet werden.using System; using System.Security.Cryptography; using System.Text;Deklarieren Sie eine Zeichenfolgenvariable, um die Quelldaten zu speichern, und zwei Bytearrays (von nicht definierter Größe), um die Quellbytes und den resultierenden Hashwert zu speichern.
string sSourceData; byte[] tmpSource; byte[] tmpHash;Verwenden Sie die
GetBytes()Methode derSystem.Text.ASCIIEncodingKlasse, um die 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);Berechnen Sie den MD5-Hash für Ihre Quelldaten, indem Sie eine Instanz der
MD5CryptoServiceProviderKlasse aufrufenComputeHash.Hinweis
Um einen anderen Hashwert zu berechnen, müssen Sie eine weitere Instanz der Klasse erstellen.
//Compute hash based on source data. tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);Das
tmpHashBytearray enthält jetzt den berechneten Hashwert (128-Bit-Wert= 16 Bytes) für Ihre Quelldaten. Es ist häufig hilfreich, einen solchen Wert als hexadezimale Zeichenfolge anzuzeigen oder zu speichern, was mit dem folgenden Code erreicht wird: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(); }Speichern Sie den Code, und führen Sie den Code aus, um die resultierende hexadezimale Zeichenfolge für den Quellwert anzuzeigen.
Vergleichen von zwei Hashwerten
Die Zwecke des Erstellens eines Hashs aus Quelldaten sind:
- Bietet eine Möglichkeit, um festzustellen, 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 Hexadezimalzeichenfolgen gespeichert werden (wie im letzten Schritt des obigen Abschnitts). Es ist jedoch möglich, dass beide in Form von Bytearrays verwendet werden. Der folgende Code, der mit dem im vorherigen Abschnitt erstellten Code fortsetzt, zeigt, wie zwei Bytearrays verglichen werden.
Erstellen Sie direkt unterhalb der Erstellung einer hexadezimalen Zeichenfolge einen neuen Hashwert, der auf neuen Quelldaten basiert.
sSourceData = "NotMySourceData"; tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); byte[] tmpNewHash; tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);Die einfachste Methode zum Vergleichen von zwei Bytearrays besteht darin, die Arrays in einer Schleife zu durchlaufen und jedes einzelne Element mit seinem Gegenstück zum zweiten Wert zu vergleichen. Wenn Elemente unterschiedlich sind oder die beiden Arrays nicht die gleiche Größe aufweisen, sind die beiden Werte nicht gleich.
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();Speichern Sie das Projekt, und führen Sie es dann aus, um die hexadezimale Zeichenfolge anzuzeigen, die mit dem ersten Hashwert erstellt wurde. Ermitteln Sie, ob der neue Hash dem Original entspricht.
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 der .NET Framework finden Sie unter .NET.