ProblemYou want to ensure that the contents of a file have not changed, perhaps after transmitting that file over the Internet. SolutionSample code folder: Chapter 12\GenerateChecksum Generate a checksum for the file. A checksum is a short value or string that is built using the contents of the file. Calculating a checksum on identical content will yield identical results, but different input produces different and varying checksums. A good checksum-generating algorithm is very sensitive to even the smallest change in the source data (a file, in this case). DiscussionCreate a new Windows Forms application, and add two TextBox controls named FileToCheck and HexChecksum and a Button control named GenerateChecksum to the form. Set the HexChecksum.ReadOnly property to TRue. Add some informational labels and arrange the controls to look like Figure 12-14. Figure 12-14. Controls for the file checksum sampleAdd the following source code to the form's class template. We've also included some needed Imports statements: Imports System.Text Imports System.Security.Cryptography Public Class Form1 Private Sub GenerateChecksum_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles GenerateChecksum.Click ' ----- The hash value is ready, but I like things in ' plain text when possible. Let's convert it to a ' long hex string. Dim checksum As Byte( ) Dim counter As Integer Dim result As String ' ----- Generate the checksum for the file. Try checksum = GenerateFileChecksum(FileToCheck.Text) Catch ex As Exception MsgBox("An error occurred while trying to " & _ "calculate the checksum:" & _ vbCrLf & vbCrLf & ex.Message) Exit Sub End Try ' ----- Prepare the checksum for display. If (checksum Is Nothing) Then result = "No checksum result." Else ' ----- Convert the checksum into something readable. result = "" For counter = 0 To checksum.Length - 1 result &= String.Format("{0:X2}", _ checksum(counter)) Next counter End If ' ----- Show the result to the user. HexChecksum.Text = result End Sub Public Function GenerateFileChecksum( _ ByVal filePath As String) As Byte( ) ' ----- Use the HMACSHA1 hashing function to generate ' a checksum for a file. Dim hashingFunction As HMACSHA1 Dim hasingBase( ) As Byte Dim hashValue( ) As Byte Dim inStream As IO.Stream ' ----- Make sure the file exists. If (My.Computer. FileSystem.FileExists(filePath) _ = False) Then Throw New IO.FileNotFoundException Return Nothing End If ' ----- Prepare the hashing key. You have to use ' the same hashing key every time, or you ' will get different results. hasingBase = (New UnicodeEncoding).GetBytes("Cookbook") ' ----- Create the hashing component using the Managed ' SHA-1 function. hashingFunction = New HMACSHA1(hasingBase, True) ' ----- Open the file as a stream. inStream = New IO. FileStream(filePath, _ IO.FileMode.Open, IO.FileAccess.Read) ' ----- Calculate the checksum value. hashValue = hashingFunction.ComputeHash(inStream) ' ----- Finished with the file. inStream.Close( ) ' ----- Return the checksum as a byte array. Return hashValue End Function End Class To use the program, type in a file path, and click the Generate button. The resulting 40-hex-digit checksum will appear in the HexChecksum field. Figure 12-15 shows the results of a checksum calculation. Figure 12-15. A checksum generated for an executable fileChecksums are especially useful when you want to know if two files, or two sets of data, contain identical content. They are typically generated using a hashing algorithm, a processing method that takes some original content and generates a summary value representing the full content. Hashing algorithms process the input data in blocks. As a hash is calculated for each block, the next block is brought in and applied to or overlaid on the existing hash. This constant merging of the data makes the algorithms very sensitive to any changes in the source content. The .NET Framework includes several hashing algorithms and encryption features in the System.Security.Cryptography namespace. This recipe's code uses the HMACSHA1 class (Hash-based Message Authentication Code, or HMAC, via the SHA-1 hash function) in that namespace to generate the hash. Hash functions such as the SHA-1 function were developed by private organizations and government security agencies to help protect sensitive content. Several similar hash functions and related encryption algorithms are included in System.Security.Cryptography for your use. |