Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit stapsgewijze artikel wordt beschreven hoe u een hash-waarde kunt verkrijgen en hoe u twee hashwaarden kunt vergelijken om te controleren of deze identiek zijn met behulp van Visual C#. Het bevat ook een codevoorbeeld om te laten zien hoe u deze taak kunt uitvoeren.
Oorspronkelijke productversie: Visual C#
Oorspronkelijk KB-nummer: 307020
Samenvatting
Dit artikel verwijst naar de volgende Microsoft .NET Framework Class Library-naamruimten:
System.Security.Cryptography
System.Text
Met System.Security.Cryptography
de klasse in .NET Framework kunt u eenvoudig een hash-waarde berekenen voor uw brongegevens.
Een hashwaarde berekenen
Het is eenvoudig om hashwaarden te genereren en te vergelijken met behulp van de cryptografische resources in de System.Security.Cryptography
naamruimte. Omdat alle hash-functies invoer van het type Byte[]
hebben, kan het nodig zijn om de bron te converteren naar een bytematrix voordat deze wordt gehasht. Voer de volgende stappen uit om een hash voor een tekenreekswaarde te maken:
Open Visual Studio .NET of Visual Studio.
Maak een nieuwe consoletoepassing in Visual C# .NET of maak in Visual C# een openbare klasse voor u samen met een lege
Main()
methode.Notitie
In Visual C#. NET, Class1.cs wordt standaard gemaakt. In Visual C# wordt Program.cs standaard gemaakt.
Gebruik de
using
instructie over deSystem
,System.Security.Cryptography
enSystem.Text
naamruimten, zodat u verderop in uw code geen declaraties van deze naamruimten hoeft in aanmerking te komen. Deze instructies moeten worden gebruikt vóór andere declaraties.using System; using System.Security.Cryptography; using System.Text;
Declareer een tekenreeksvariabele voor het opslaan van uw brongegevens en twee bytematrices (van niet-gedefinieerde grootte) om de bronbytes en de resulterende hashwaarde op te slaan.
string sSourceData; byte[] tmpSource; byte[] tmpHash;
Gebruik de
GetBytes()
methode van de klasse om deSystem.Text.ASCIIEncoding
brontekenreeks te converteren naar een matrix van bytes (vereist als invoer voor de hashfunctie).sSourceData = "MySourceData"; //Create a byte array from source data. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
Bereken de MD5-hash voor uw brongegevens door een exemplaar van de
MD5CryptoServiceProvider
klasse aan te roepenComputeHash
.Notitie
Als u een andere hashwaarde wilt berekenen, moet u een ander exemplaar van de klasse maken.
//Compute hash based on source data. tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
De
tmpHash
bytematrix bevat nu de berekende hashwaarde (128-bits waarde=16 bytes) voor uw brongegevens. Het is vaak handig om een waarde zoals deze weer te geven of op te slaan als een hexadecimale tekenreeks, die de volgende code bereikt: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(); }
Sla de code op en voer deze uit om de resulterende hexadecimale tekenreeks voor de bronwaarde te zien.
Twee hashwaarden vergelijken
De doeleinden van het maken van een hash op basis van brongegevens zijn:
- Een manier bieden om te zien of gegevens in de loop van de tijd zijn gewijzigd.
- Twee waarden vergelijken zonder ooit met de werkelijke waarden te werken.
In beide gevallen moet u twee berekende hashes vergelijken. Het is eenvoudig als ze beide zijn opgeslagen als hexadecimale tekenreeksen (zoals in de laatste stap van de bovenstaande sectie). Maar het is mogelijk dat ze beide de vorm van bytematrices hebben. De volgende code, die wordt voortgezet op basis van de code die in de vorige sectie is gemaakt, laat zien hoe u twee matrices van bytes vergelijkt.
Maak net onder het maken van een hexadecimale tekenreeks een nieuwe hash-waarde op basis van nieuwe brongegevens.
sSourceData = "NotMySourceData"; tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); byte[] tmpNewHash; tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
De eenvoudigste manier om twee matrices van bytes te vergelijken, is door de matrices te doorlopen, door elk afzonderlijk element te vergelijken met de tegenhanger van de tweede waarde. Als er elementen verschillen of als de twee matrices niet dezelfde grootte hebben, zijn de twee waarden niet gelijk.
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();
Sla het project op en voer het uit om de hexadecimale tekenreeks weer te geven die is gemaakt op basis van de eerste hashwaarde. Ontdek of de nieuwe hash gelijk is aan het origineel.
Volledige codevermelding
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();
}
}
}
Verwijzingen
Zie .NET voor meer informatie over het gebruik van de cryptografische functies van .NET Framework.