Gewährleisten der Datenintegrität über Hashcodes

Ein Hashwert ist ein numerischer Wert fester Länge, durch den Daten eindeutig identifiziert werden. Hashwerte werden zusammen mit digitalen Signaturen verwendet, da sie große Datenmengen durch einen sehr viel kleineren numerischen Wert darstellen. Es ist effizienter, anstelle des größeren Werts einen Hashwert zu signieren. Hashwerte sind außerdem zum Überprüfen der Integrität von Daten nützlich, die über unsichere Kanäle gesendet werden. Um festzustellen, ob die Daten verändert wurden, kann der Hashwert der empfangenen Daten mit dem Hashwert der Daten zum Zeitpunkt des Versendens verglichen werden.

In diesem Thema wird das Generieren und Überprüfen von Hashcodes mit den Klassen im System.Security.Cryptography-Namespace beschrieben.

Generieren eines Hashs

Mit den verwalteten Hashklassen kann entweder ein Bytearray oder ein verwaltetes Streamobjekt als Hashwert dargestellt werden. Im folgenden Beispiel wird der SHA1-Hashalgorithmus zum Erstellen eines Hashwerts für eine Zeichenfolge verwendet. Im folgenden Beispiel wird die Zeichenfolge mit der UnicodeEncoding-Klasse in ein Bytearray konvertiert, aus dem mithilfe der SHA1Managed-Klasse ein Hashwert generiert wird. Der Hashwert wird anschließend in der Konsole angezeigt.

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);
        }
    }
}

Durch diesen Code wird in der Konsole folgende Zeichenfolge angezeigt:

59 4 248 102 77 97 142 201 210 12 224 93 25 41 100 197 213 134 130 135

Überprüfen eines Hashs

Daten können mit einem Hashwert verglichen werden, um die Datenintegrität zu bestimmen. In der Regel werden die Daten zu einem bestimmten Zeitpunkt gehasht, und der Hashwert wird auf beliebige Weise geschützt. Später können dann die Daten erneut gehasht und mit dem geschützten Wert verglichen werden. Wenn die Hashwerte übereinstimmen, wurden die Daten nicht verändert. Wenn die Werte nicht übereinstimmen, wurden die Daten beschädigt. Damit dieses System funktioniert, muss der geschützte Hash verschlüsselt oder vor allen nicht vertrauenswürdigen Teilnehmern geheim gehalten werden.

Im folgenden Beispiel wird der vorherige Hashwert einer Zeichenfolge mit einem neuen Hashwert verglichen. Jedes Byte der Hashwerte wird untersucht und verglichen.

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.");
        }
    }
}

Wenn die beiden Hashwerte übereinstimmen, wird durch diesen Code in der Konsole folgende Meldung angezeigt:

The hash codes match.

Wenn die Werte nicht übereinstimmen, wird folgende Meldung angezeigt:

The hash codes do not match.

Siehe auch

Konzepte

Kryptografische Dienste

Weitere Ressourcen

Kryptografische Aufgaben