Utiliser Visual C# pour calculer et comparer des valeurs de hachage

Cet article pas à pas explique comment obtenir une valeur de hachage et comment comparer deux valeurs de hachage à case activée si elles sont identiques à l’aide de Visual C#. Il fournit également un exemple de code pour montrer comment effectuer cette tâche.

Version d’origine du produit : Visual C#
Numéro de la base de connaissances d’origine : 307020

Résumé

Cet article fait référence aux espaces de noms de bibliothèque de classes Microsoft .NET Framework suivants :

  • System.Security.Cryptography
  • System.Text

La System.Security.Cryptography classe dans le .NET Framework facilite le calcul d’une valeur de hachage pour vos données sources.

Calculer une valeur de hachage

Il est facile de générer et de comparer des valeurs de hachage à l’aide des ressources de chiffrement contenues dans l’espace System.Security.Cryptography de noms. Étant donné que toutes les fonctions de hachage prennent une entrée de type Byte[], il peut être nécessaire de convertir la source en tableau d’octets avant d’être hachée. Pour créer un hachage pour une valeur de chaîne, procédez comme suit :

  1. Ouvrez Visual Studio .NET ou Visual Studio.

  2. Créer une application console dans Visual C# .NET ou visual C# crée une classe publique pour vous avec une méthode vide Main() .

    Remarque

    En Visual C#. NET , Class1.cs est créé par défaut. Dans Visual C#, Program.cs est créé par défaut.

  3. Utilisez la using directive sur les Systemespaces de noms , System.Security.Cryptographyet System.Text afin que vous n’ayez pas à qualifier les déclarations de ces espaces de noms plus loin dans votre code. Ces instructions doivent être utilisées avant toute autre déclaration.

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
  4. Déclarez une variable de chaîne pour contenir vos données sources et deux tableaux d’octets (de taille non définie) pour contenir les octets sources et la valeur de hachage résultante.

    string sSourceData;
    byte[] tmpSource;
    byte[] tmpHash;
    
  5. Utilisez la GetBytes() méthode de la System.Text.ASCIIEncoding classe pour convertir votre chaîne source en tableau d’octets (requis comme entrée de la fonction de hachage).

    sSourceData = "MySourceData";
    //Create a byte array from source data.
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    
  6. Calculez le hachage MD5 pour vos données sources en appelant ComputeHash sur un instance de la MD5CryptoServiceProvider classe .

    Remarque

    Pour calculer une autre valeur de hachage, vous devez créer une autre instance de la classe.

    //Compute hash based on source data.
    tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  7. Le tmpHash tableau d’octets contient désormais la valeur de hachage calculée (valeur de 128 bits = 16 octets) pour vos données sources. Il est souvent utile d’afficher ou de stocker une valeur comme celle-ci sous la forme d’une chaîne hexadécimale, ce que le code suivant accomplit :

    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. Enregistrez, puis exécutez votre code pour voir la chaîne hexadécimale obtenue pour la valeur source.

Comparer deux valeurs de hachage

Les objectifs de la création d’un hachage à partir de données sources sont les suivants :

  • Fournir un moyen de voir si les données ont changé au fil du temps.
  • Comparaison de deux valeurs sans jamais travailler avec les valeurs réelles.

Dans les deux cas, vous devez comparer deux hachages calculés. Il est facile de les stocker sous forme de chaînes hexadécimales (comme à la dernière étape de la section ci-dessus). Mais il est possible qu’ils se présentent tous les deux sous la forme de tableaux d’octets. Le code suivant, qui continue à partir du code créé dans la section précédente, montre comment comparer deux tableaux d’octets.

  1. Juste en dessous de la création d’une chaîne hexadécimale, créez une valeur de hachage basée sur de nouvelles données sources.

    sSourceData = "NotMySourceData";
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    byte[] tmpNewHash;
    tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  2. La façon la plus simple de comparer deux tableaux d’octets consiste à parcourir les tableaux en boucle, en comparant chaque élément individuel à son équivalent à partir de la deuxième valeur. Si des éléments sont différents ou si les deux tableaux n’ont pas la même taille, les deux valeurs ne sont pas égales.

    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. Enregistrez, puis exécutez votre projet pour afficher la chaîne hexadécimale créée à partir de la première valeur de hachage. Déterminez si le nouveau hachage est égal à l’original.

Liste complète du code

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

Pour plus d’informations sur l’utilisation des fonctionnalités de chiffrement du .NET Framework, consultez .NET.