Lire en anglais

Partager via


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

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

Version du produit d’origine : 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 du .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 qu’elle ne soit 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éez une application console dans Visual C# .NET ou dans Visual C# crée une classe publique pour vous, ainsi qu’une méthode vide Main() .

    Notes

    Dans 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 les espaces de noms afin que vous ne soyez pas obligé de 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.

    C#
    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.

    C#
    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 un tableau d’octets (requis comme entrée dans la fonction de hachage).

    C#
    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 une instance de la MD5CryptoServiceProvider classe.

    Notes

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

    C#
    //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 une chaîne hexadécimale, que le code suivant accomplit :

    C#
    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 et exécutez votre code pour voir la chaîne hexadécimale résultante 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 utiliser les valeurs réelles.

Dans les deux cas, vous devez comparer deux hachages calculés. Il est facile s’ils sont tous les deux stockés sous forme de chaînes hexadécimales (comme dans la dernière étape de la section ci-dessus). Mais il est possible qu’ils soient tous les deux sous la forme de tableaux d’octets. Le code suivant, qui se poursuit à 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.

    C#
    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 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 ne sont pas de la même taille, les deux valeurs ne sont pas égales.

    C#
    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 et 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.

Listing du code complet

C#
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

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