Verifying a Hash
Data can be compared to a hash value to determine its integrity. Usually, data is hashed at a certain time and the hash value is protected in some way. At a later time, the data can be hashed again and compared to the protected value. If the hash values match, then the data has not been altered. However, if the values do not match, the data has been corrupted. For this system to work, the protected hash must be encrypted or kept secret from all untrusted parties.
The following example compares the previous hash value of a string to a new hash value. This example loops through each byte of the hash values and makes a comparison.
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
[C#]
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.");
}
}
}
If the two hash values match, this code displays the following to the console:
The hash codes match.
However, if they do not match, the code displays the following:
The hash codes do not match.
See Also
Generating a Hash | Ensuring Data Integrity with Hash Codes | Cryptographic Tasks | Cryptographic Services