Garantie de l'intégrité des données à l'aide des codes de hachage
Une valeur de hachage est une valeur numérique d'une longueur fixe qui identifie des données de manière unique. Les valeurs de hachage représentent une grande quantité de données sous la forme d'une valeur numérique nettement inférieure de manière à être utilisées avec les signatures numériques. Vous pouvez signer une valeur de hachage plus efficacement qu'en signant la valeur plus importante. Les valeurs de hachage sont également utiles pour vérifier l'intégrité des données envoyées sur des canaux non sécurisés. La valeur de hachage des données reçues peut être comparée à la valeur de hachage des données telle qu'elle a été envoyée pour déterminer si les données ont été modifiées.
Cette rubrique explique comment générer et vérifier les codes de hachage à l'aide des classes dans l'espace de noms System.Security.Cryptography.
Génération d'un hachage
Les classes de hachage managées peuvent effectuer un hachage soit sur un tableau d'octets, soit sur un objet de flux managé. L'exemple suivant utilise l'algorithme de hachage SHA1 pour créer une valeur de hachage pour une chaîne. Cet exemple utilise la classe UnicodeEncoding pour convertir la chaîne en un tableau d'octets hachés à l'aide de la classe SHA1Managed. La valeur de hachage est ensuite affichée sur la console.
Imports System
Imports System.Security.Cryptography
Imports System.Text
Module Program
Sub Main()
Dim HashValue() As Byte
Dim MessageString As String = "This is the original message!"
'Create a new instance of the UnicodeEncoding class to
'convert the string into an array of Unicode bytes.
Dim UE As New UnicodeEncoding()
'Convert the string into an array of bytes.
Dim MessageBytes As Byte() = UE.GetBytes(MessageString)
'Create a new instance of the SHA1Managed class to create
'the hash value.
Dim SHhash As New SHA1Managed()
'Create the hash value from the array of bytes.
HashValue = SHhash.ComputeHash(MessageBytes)
'Display the hash value to the console.
Dim b As Byte
For Each b In HashValue
Console.Write("{0} ", b)
Next b
End Sub
End Module
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Class1
{
static void Main(string[] args)
{
byte[] HashValue;
string MessageString = "This is the original message!";
//Create a new instance of the UnicodeEncoding class to
//convert the string into an array of Unicode bytes.
UnicodeEncoding UE = new UnicodeEncoding();
//Convert the string into an array of bytes.
byte[] MessageBytes = UE.GetBytes(MessageString);
//Create a new instance of the SHA1Managed class to create
//the hash value.
SHA1Managed SHhash = new SHA1Managed();
//Create the hash value from the array of bytes.
HashValue = SHhash.ComputeHash(MessageBytes);
//Display the hash value to the console.
foreach (byte b in HashValue)
{
Console.Write("{0} ", b);
}
}
}
Ce code affiche la chaîne suivante sur la console.
59 4 248 102 77 97 142 201 210 12 224 93 25 41 100 197 213 134 130 135
Vérification d'un hachage
Des données peuvent être comparées à une valeur de hachage pour déterminer leur intégrité. Habituellement, les données font l'objet d'un hachage à un moment donné et la valeur de hachage est protégée d'une certaine manière. Les données peuvent ultérieurement faire de nouveau l'objet d'un hachage et être comparées à la valeur protégée. Si les valeurs de hachage correspondent, les données n'ont pas été modifiées. Si les valeurs ne correspondent pas, les données ont été endommagées. Pour que ce système fonctionne, le hachage protégé doit être chiffré ou tenu à l'abri de toutes les parties qui ne sont pas dignes de confiance.
L'exemple suivant compare la valeur de hachage précédente d'une chaîne à une nouvelle valeur de hachage. Cet exemple parcourt chaque octet des valeurs de hachage et effectue une comparaison.
Imports System
Imports System.Security.Cryptography
Imports System.Text
Module Module1
Sub Main()
'This hash value is produced from "This is the original message!"
'using SHA1Managed.
Dim SentHashValue As Byte() = {59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135}
'This is the string that corresponds to the previous hash value.
Dim MessageString As String = "This is the original message!"
Dim CompareHashValue() As Byte
'Create a new instance of the UnicodeEncoding class to
'convert the string into an array of Unicode bytes.
Dim UE As New UnicodeEncoding()
'Convert the string into an array of bytes.
Dim MessageBytes As Byte() = UE.GetBytes(MessageString)
'Create a new instance of the SHA1Managed class to create
'the hash value.
Dim SHhash As New SHA1Managed()
'Create the hash value from the array of bytes.
CompareHashValue = SHhash.ComputeHash(MessageBytes)
Dim Same As Boolean = True
'Compare the values of the two byte arrays.
Dim x As Integer
For x = 0 To SentHashValue.Length - 1
If SentHashValue(x) <> CompareHashValue(x) Then
Same = False
End If
Next x
'Display whether or not the hash values are the same.
If Same Then
Console.WriteLine("The hash codes match.")
Else
Console.WriteLine("The hash codes do not match.")
End If
End Sub
End Module
using System;
using System.Security.Cryptography;
using System.Text;
class Class1
{
static void Main()
{
//This hash value is produced from "This is the original message!"
//using SHA1Managed.
byte[] SentHashValue = { 59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135 };
//This is the string that corresponds to the previous hash value.
string MessageString = "This is the original message!";
byte[] CompareHashValue;
//Create a new instance of the UnicodeEncoding class to
//convert the string into an array of Unicode bytes.
UnicodeEncoding UE = new UnicodeEncoding();
//Convert the string into an array of bytes.
byte[] MessageBytes = UE.GetBytes(MessageString);
//Create a new instance of the SHA1Managed class to create
//the hash value.
SHA1Managed SHhash = new SHA1Managed();
//Create the hash value from the array of bytes.
CompareHashValue = SHhash.ComputeHash(MessageBytes);
bool Same = true;
//Compare the values of the two byte arrays.
for (int x = 0; x < SentHashValue.Length; x++)
{
if (SentHashValue[x] != CompareHashValue[x])
{
Same = false;
}
}
//Display whether or not the hash values are the same.
if (Same)
{
Console.WriteLine("The hash codes match.");
}
else
{
Console.WriteLine("The hash codes do not match.");
}
}
}
Si les deux valeurs de hachage correspondent, ce code affiche ce qui suit sur la console :
The hash codes match.
Si celles-ci ne correspondent pas, le code affiche ce qui suit :
The hash codes do not match.