使用哈希代码确保数据完整性
哈希值是用于唯一标识数据的固定长度的数字值。 哈希值以小得多的数字值表示大量数据,因此与数字签名配合使用。 对哈希值进行签名比对较大的值进行签名更为高效。 对于验证通过不安全通道发送的数据的完整性,哈希值也很有用。 当被发送出去确定数据是否已更改时,将接收数据的哈希值与数据的哈希值相比较。
本主题介绍如何通过使用 System.Security.Cryptography 命名空间中的类生成和验证哈希代码。
生成哈希
哈希类可以对字节数组或流对象进行哈希处理。 以下示例使用 SHA-256 哈希算法为字符串创建哈希值。 该示例使用 Encoding.UTF8 将字符串转换为通过使用 SHA256 类进行哈希处理的字节数组。 然后向控制台显示哈希值。
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
此代码将向控制台显示以下字符串:
67A1790DCA55B8803AD024EE28F616A284DF5DD7B8BA5F68B4B252A5E925AF79
验证哈希
可将数据与哈希值进行比较,以确定其完整性。 通常,在某个特定时间对数据进行哈希运算,并以某种方式保护哈希值。 稍后,可以再次对数据进行哈希运算,并与受保护的值进行比较。 如果哈希值匹配,则数据未更改。 如果值不匹配,则数据已损坏。 要使此系统发挥作用,必须对受保护的哈希加密或对所有的不受信任方保密。
以下示例将字符串旧的哈希值与新的哈希值进行比较。
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