BPSoftware.com
Home   Utilities   Purchase   FAQ   Support   Contact        
Shareware Utilities
 APrintDirect
 AIconExtract
 AFile Attribute Manager
Freeware Utilities
 AddrMon
 AFileSync
 ASysIcon
 B&P Table Utilities
 BPACLer
 BPSNMPMon
 BPSNMPUtil
 CharCount
 Delphi® Components
 MacAddr
Miscellaneous
 BPSoftware Blog
 Purchase Shareware
 Support

 Subscribe!

Monday, December 18, 2006
More Hash - Part I

Yesterday I discussed using the System.Security.Cryptography Namespace to compute the hash value of files. Hash values of files can be used to quickly compare two files to see if they are identical. Due to the irreversible nature of Hash values, they are useful in password situations. For example, if you have an application that requires authentication you can compute the hash of a user's password and store that information. When it comes time to authenticate the user you can compare the hash value of the entered password with the stored hash value. This eliminates the storage of the actual password value, which could lead to well, problems. I had put together an application that compares the hash values of two files or strings to determine if the data is identical. This application can also be used to generate hash values. This application used the MD5, SHA1, SHA256, SHA384 and SHA512 classes. The hash values are displayed in Hexadecimal notation. If you're interested in just the application it can be downloaded here. Here is the VB.NET source. I will post the Delphi source later.

Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Public Class frmMain
Enum HashType
MD5
SHA1
SHA256
SHA384
SHA512
End Enum

Private Sub GroupCompare_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles radFiles.CheckedChanged, radStrings.CheckedChanged
ClearForm()
Select Case CType(sender, Control).Tag
Case "Files"
lblValue1.Text = "File 1:"
lblValue2.Text = "File 2:"
txtValue1.ReadOnly = True
txtValue2.ReadOnly = True
btnValue1.Visible = True
btnValue2.Visible = True
Case "Strings"
lblValue1.Text = "String 1:"
lblValue2.Text = "String 2:"
txtValue1.ReadOnly = False
txtValue2.ReadOnly = False
btnValue1.Visible = False
btnValue2.Visible = False
End Select
End Sub

Private Sub txt_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles txtValue1.TextChanged, txtValue2.TextChanged, _
txtResults1.TextChanged, txtResults2.TextChanged

ToolTip1.SetToolTip(CType(sender, Control), CType(sender, Control).Text)

End Sub

Private Sub btnFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValue1.Click, btnValue2.Click
If ofdFiles.ShowDialog Then
Select Case CType(sender, Button).Tag
Case 0
txtValue1.Text = ofdFiles.FileName
Case 1
txtValue2.Text = ofdFiles.FileName
End Select
End If
End Sub

Private Sub ClearForm()
txtValue1.Text = ""
txtValue2.Text = ""
txtResults1.Text = ""
txtResults2.Text = ""
End Sub

Private Sub btnCompare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCompare.Click
Dim myCursor As Cursor
Dim hasht As hashtype

myCursor = Cursor
Cursor = Cursors.WaitCursor
Try
If
radMD5.Checked Then
hasht = hashtype.MD5
End If
If
radSHA1.Checked Then
hasht = hashtype.SHA1
End If
If
radSHA256.Checked Then
hasht = hashtype.SHA256
End If
If
radSHA384.Checked Then
hasht = hashtype.SHA384
End If
If
radSHA512.Checked Then
hasht = hashtype.SHA512
End If

If radFiles.Checked Then
txtResults1.Text = GetFileHash(txtValue1.Text, hasht)
txtResults2.Text = GetFileHash(txtValue2.Text, hasht)
ElseIf radStrings.Checked Then
txtResults1.Text = GetStringHash(txtValue1.Text, hasht)
txtResults2.Text = GetStringHash(txtValue2.Text, hasht)
End If

If (String.Compare(txtResults1.Text, txtResults2.Text) = 0) Then
picResult.Image = ImageList1.Images(1)
Else
picResult.Image = ImageList1.Images(0)
End If
Catch ex As Exception
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
Cursor = myCursor
End Try
End Sub

Private Function GetFileHash(ByVal filename As String, ByVal hasht As hashtype) As String
Dim oFileStream As System.IO.FileStream
Dim lBytes As Long

Try
If
filename <> "" Then
Dim instance As New FileInfo(filename)
oFileStream = instance.OpenRead()
lBytes = oFileStream.Length
Dim filecontents(lBytes) As Byte
oFileStream.Read(filecontents, 0, lBytes)
oFileStream.Close()

Return GetHash(filecontents, hasht)
Else
Return
""
End If
Catch ex As Exception
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error)
Return ""
End Try

End Function

Private Function GetStringHash(ByVal input As String, ByVal hasht As hashtype) As String

Return GetHash(Encoding.Default.GetBytes(input), hasht)

End Function

Public Function GetHash(ByRef contents As Byte(), ByVal hasht As hashtype) As String
Dim result() As Byte

Select Case hasht
Case hashtype.MD5
Dim MD5 As MD5 = MD5.Create
result = MD5.ComputeHash(contents)
Case hashtype.SHA1
Dim sha1M As New SHA1Managed
result = sha1M.ComputeHash(contents)
Case hashtype.SHA256
Dim sha256M As New SHA256Managed
result = sha256M.ComputeHash(contents)
Case hashtype.SHA384
Dim sha384M As New SHA384Managed
result = sha384M.ComputeHash(contents)
Case hashtype.SHA512
Dim sha512M As New SHA512Managed
result = sha512M.ComputeHash(contents)
End Select

Return GetByteString(result)
End Function

Public Function GetByteString(ByVal data As Byte())
Dim sBuilder As New StringBuilder()
Dim i As Integer

For i = 0 To data.Length - 1
sBuilder.Append(data(i).ToString("x2"))
Next i
Return sBuilder.ToString()
End Function
End Class

Labels: , ,

posted by Brad Prendergast at 3:19:00 PM
Comments:
I'd like to compare two records coming from two table. Suppose I need to check 1000 records do you think I can use hash? I need to concatenate the fields (coverted in string) to calculate hash?
posted by Blogger BLIta Tuesday, December 19, 2006 3:18:00 AM  
Links to this post:

Create a Link

Recent Posts
 Is it a Hash Brown?
 Virtualization is cool
 TShellExecuteInfo
 That Special Folder
 Live Writer Test
 A RT_BITMAP told me so
 Tray it a bit easier
 Classic ASP and a Form
 Ye Old TFileEdit
 TypInfo is cool!

 Subscribe!


Labels



Archives
 October 2005
 November 2005
 December 2005
 January 2006
 February 2006
 March 2006
 April 2006
 May 2006
 June 2006
 July 2006
 August 2006
 September 2006
 December 2006
 January 2007
 February 2007
 March 2007
 September 2007
 October 2007
 November 2007
 July 2008
 November 2008
Powered by Blogger