Dela via


Säkerställa dataintegritet med hashkoder

Ett hashvärde är ett numeriskt värde med en fast längd som unikt identifierar data. Hash-värden representerar stora mängder data som mycket mindre numeriska värden, så de används med digitala signaturer. Du kan signera ett hash-värde mer effektivt än att signera det större värdet. Hash-värden är också användbara för att verifiera integriteten för data som skickas via osäkra kanaler. Hash-värdet för mottagna data kan jämföras med hash-värdet för data när de skickades för att avgöra om data har ändrats.

Det här avsnittet beskriver hur du genererar och verifierar hashkoder med hjälp av klasserna i System.Security.Cryptography namnområdet.

Generera en hash

Hash-klasserna kan hasha antingen en matris med byte eller ett dataströmobjekt. I följande exempel används SHA-256-hashalgoritmen för att skapa ett hash-värde för en sträng. Exemplet använder Encoding.UTF8 för att konvertera strängen till en matris med byte som hashas med hjälp SHA256 av klassen. Hash-värdet visas sedan för konsolen.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

string messageString = "This is the original message!";

//Convert the string into an array of bytes.
byte[] messageBytes = Encoding.UTF8.GetBytes(messageString);

//Create the hash value from the array of bytes.
byte[] hashValue = SHA256.HashData(messageBytes);

//Display the hash value to the console.
Console.WriteLine(Convert.ToHexString(hashValue));
Imports System.Security.Cryptography
Imports System.Text

Module Program
    Sub Main()
        Dim messageString As String = "This is the original message!"

        'Convert the string into an array of bytes.
        Dim messageBytes As Byte() = Encoding.UTF8.GetBytes(messageString)

        'Create the hash value from the array of bytes.
        Dim hashValue As Byte() = SHA256.HashData(messageBytes)

        'Display the hash value to the console. 
        Console.WriteLine(Convert.ToHexString(hashValue))
    End Sub
End Module

Den här koden visar följande sträng i konsolen:

67A1790DCA55B8803AD024EE28F616A284DF5DD7B8BA5F68B4B252A5E925AF79

Verifiera en hash

Data kan jämföras med ett hash-värde för att fastställa dess integritet. Vanligtvis hashas data vid en viss tidpunkt och hash-värdet skyddas på något sätt. Vid ett senare tillfälle kan data hashas igen och jämföras med det skyddade värdet. Om hash-värdena matchar har data inte ändrats. Om värdena inte matchar har data skadats. För att det här systemet ska fungera måste den skyddade hashen krypteras eller hållas hemlig från alla ej betrodda parter.

I följande exempel jämförs det tidigare hashvärdet för en sträng med ett nytt hash-värde.

using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

//This hash value is produced from "This is the original message!"
//using SHA256.
byte[] sentHashValue = Convert.FromHexString("67A1790DCA55B8803AD024EE28F616A284DF5DD7B8BA5F68B4B252A5E925AF79");

//This is the string that corresponds to the previous hash value.
string messageString = "This is the original message!";

//Convert the string into an array of bytes.
byte[] messageBytes = Encoding.UTF8.GetBytes(messageString);

//Create the hash value from the array of bytes.
byte[] compareHashValue = SHA256.HashData(messageBytes);

//Compare the values of the two byte arrays.
bool same = sentHashValue.SequenceEqual(compareHashValue);

//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.");
}
Imports System.Linq
Imports System.Security.Cryptography
Imports System.Text

Module Module1
    Sub Main()
        'This hash value is produced from "This is the original message!" 
        'using SHA256.  
        Dim sentHashValue As Byte() = Convert.FromHexString("67A1790DCA55B8803AD024EE28F616A284DF5DD7B8BA5F68B4B252A5E925AF79")

        'This is the string that corresponds to the previous hash value.
        Dim messageString As String = "This is the original message!"

        'Convert the string into an array of bytes.
        Dim messageBytes As Byte() = Encoding.UTF8.GetBytes(messageString)

        'Create the hash value from the array of bytes.
        Dim compareHashValue As Byte() = SHA256.HashData(messageBytes)

        'Compare the values of the two byte arrays.
        Dim same As Boolean = sentHashValue.SequenceEqual(compareHashValue)

        '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

Se även