Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem schrittweisen Artikel erfahren Sie, wie Sie einen Hashwert abrufen und zwei Hashwerte vergleichen, um zu überprüfen, ob sie mit Visual C# identisch sind. Außerdem wird ein Codebeispiel bereitgestellt, das zeigt, wie diese Aufgabe ausgeführt wird.
Originalproduktversion: Visual C#
Ursprüngliche KB-Nummer: 307020
Zusammenfassung
Dieser Artikel bezieht sich auf die folgenden Microsoft .NET Framework-Klassenbibliotheksnamespaces:
System.Security.Cryptography
System.Text
Die System.Security.Cryptography
Klasse in .NET Framework erleichtert die Berechnung eines Hashwerts für Die Quelldaten.
Berechnen eines Hashwerts
Es ist einfach, Hashwerte mithilfe der im Namespace enthaltenen System.Security.Cryptography
kryptografischen Ressourcen zu generieren und zu vergleichen. Da alle Hashfunktionen Eingaben vom Typ Byte[]
übernehmen, muss die Quelle möglicherweise vor dem Hash in ein Bytearray konvertiert werden. Führen Sie die folgenden Schritte aus, um einen Hash für einen Zeichenfolgenwert zu erstellen:
Öffnen Sie Visual Studio .NET oder Visual Studio.
Erstellen Sie eine neue Konsolenanwendung in Visual C# .NET oder in Visual C# erstellt eine öffentliche Klasse für Sie zusammen mit einer leeren
Main()
Methode.Notiz
In Visual C# NET, Class1.cs wird standardmäßig erstellt. In Visual C# wird standardmäßig Program.cs erstellt.
Verwenden Sie die
using
Direktive für dieSystem
Namespaces undSystem.Text
die NamespacesSystem.Security.Cryptography
, damit Sie Deklarationen aus diesen Namespaces später im Code nicht qualifizieren müssen. Diese Anweisungen müssen vor 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 enthalten.
string sSourceData; byte[] tmpSource; byte[] tmpHash;
Verwenden Sie die
GetBytes()
Methode derSystem.Text.ASCIIEncoding
Klasse, 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
MD5CryptoServiceProvider
Klasse aufrufenComputeHash
.Notiz
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
tmpHash
Bytearray enthält nun den berechneten Hashwert (128-Bit-Wert=16 Bytes) für Die Quelldaten. Es ist häufig hilfreich, einen Wert wie diese als hexadezimale Zeichenfolge anzuzeigen oder zu speichern, die der folgende Code erreicht: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 zum Erstellen eines Hashs aus Quelldaten sind:
- Bereitstellen einer Möglichkeit, festzustellen, ob sich Daten im Laufe der Zeit geändert haben.
- Vergleich zweier Werte, 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 vorhanden sind. Der folgende Code, der vom im vorherigen Abschnitt erstellten Code fortgesetzt wird, zeigt, wie zwei Bytearrays verglichen werden.
Erstellen Sie direkt unterhalb der Erstellung einer Hexadezimalzeichenfolge einen neuen Hashwert basierend auf neuen Quelldaten.
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 zu durchlaufen und jedes einzelne Element mit seinem Gegenstück vom 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 aus, um die hexadezimale Zeichenfolge anzuzeigen, die aus dem ersten Hashwert erstellt wurde. Erfahren Sie, ob der neue Hash dem Original entspricht.
Vollständige Codeliste
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; i++)
{
sOutput.Append(arrInput[i].ToString("X2"));
}
return sOutput.ToString();
}
}
}
References
Weitere Informationen zur Verwendung der kryptografischen Features von .NET Framework finden Sie unter .NET.