Delen via


Visual C# gebruiken om hashwaarden te berekenen en te vergelijken

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:

  1. Open Visual Studio .NET of Visual Studio.

  2. 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.

  3. Gebruik de using instructie over de System, System.Security.Cryptographyen System.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;
    
  4. 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;
    
  5. Gebruik de GetBytes() methode van de klasse om de System.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);
    
  6. 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);
    
  7. 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();
    }
    
  8. 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.

  1. 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);
    
  2. 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();
    
  3. 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.