user416527
user416527

Reputation:

build/check hash value for file

I'm having hard time with this one. Can someone either point me in the right direction for checking/building hash codes for an uploaded file or else tell me what I'm doing wrong with the code below?

getFileSHA256(softwareUpload.PostedFile) 'Line that calls the function includes a reference to an uploaded file

Private Function getFileSHA256(ByVal theFile As Web.HttpPostedFile) As String
    Dim SHA256CSP As New SHA256Managed()
    Dim byteHash() As Byte = SHA256CSP.ComputeHash(theFile.InputStream)
    Return ByteArrayToString(byteHash)
End Function

Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
    Dim sb As New System.Text.StringBuilder(arrInput.Length * 2)
    For i As Integer = 0 To arrInput.Length - 1
        sb.Append(arrInput(i).ToString("X2"))
    Next
    Return sb.ToString().ToLower
End Function

I should add that the function works, but the return does not match other programs' sha256 values.

EDIT ------

There are two other functions that I'm using in my code. SHA1 gets the same kind of results as the SHA256; the results do not match trusted sources.

However, the MD5 works as expected.

Private Function getFileSHA1(ByVal theFile As Web.HttpPostedFile) As String
    Dim SHA1CSP As New SHA1CryptoServiceProvider()
    Dim byteHash() As Byte = SHA1CSP.ComputeHash(theFile.InputStream)
    Return ByteArrayToString(byteHash)
End Function

Private Function getFileMd5(ByVal theFile As Web.HttpPostedFile) As String
    Dim Md5CSP As New System.Security.Cryptography.MD5CryptoServiceProvider
    Dim byteHash() As Byte = Md5CSP.ComputeHash(theFile.InputStream)
    Return ByteArrayToString(byteHash)
End Function

I plan to consolidate these functions once I know they are working as expected.

The only difference between these is that MD5 is using "MD5CryptoServiceProvider" and it works as expected. SHA1 is also using "SHA1CryptoServiceProvider" but it does not match trusted sources.

Upvotes: 3

Views: 5364

Answers (1)

Victor Zakharov
Victor Zakharov

Reputation: 26454

I did some testing here, it appears that for text files SHA256Managed works perfectly.

My code is below, I used your implementation of ByteArrayToString:

Sub Main()
  Dim s As New SHA256Managed
  Dim fileBytes() As Byte = IO.File.ReadAllBytes("s:\sha256.txt")
  Dim hash() As Byte = s.ComputeHash(fileBytes)

  Dim referenceHash As String = "18ffd9682c5535a2b2798ca51b13e9490df326f185a83fe6e059f8ff47d92105"
  Dim calculatedHash As String = ByteArrayToString(hash)
  MsgBox(calculatedHash = referenceHash) 'outputs True
End Sub

Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
  Dim sb As New System.Text.StringBuilder(arrInput.Length * 2)
  For i As Integer = 0 To arrInput.Length - 1
    sb.Append(arrInput(i).ToString("X2"))
  Next
  Return sb.ToString().ToLower
End Function

For testing purposes, I created a file called sha256.txt under S: with the following contents:

my test file

(no trailing spaces or newline)

I got the reference hash value from here, by feeding same data.

Also check this and this - the fact you get non-match could be related to platform and/or implementation of your trusted source, or needing an extra conversion step.

Upvotes: 2

Related Questions