在VB.NET中检查文件的MD5

时间:2011-10-28 14:05:31

标签: vb.net md5-file

当用户点击该按钮时,它会要求他选择一个特定的文件。它检查MD5哈希以了解这是否是正确的文件。

代码的问题是它给了我“错误的文件”消息,我完全确定该文件的MD5哈希是“3982908442F37245B305EDCF4D834494”

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click

        dim md5code as string

        OpenFileDialog1.ShowDialog()

        Dim md5 As MD5CryptoServiceProvider = New MD5CryptoServiceProvider
        Dim f As FileStream = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
        f = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
        md5.ComputeHash(f)
        Dim ObjFSO As Object = CreateObject("Scripting.FileSystemObject")
        Dim objFile = ObjFSO.GetFile(OpenFileDialog1.FileName)

        Dim hash As Byte() = md5.Hash
        Dim buff As StringBuilder = New StringBuilder
        Dim hashByte As Byte
        For Each hashByte In hash
            buff.Append(String.Format("{0:X1}", hashByte))
        Next

        md5code = buff.ToString()

        If md5code = "3982908442F37245B305EDCF4D834494" Then
            TextBox2.Text = OpenFileDialog1.FileName
        Else
            MessageBox.Show("Wrong File")
        End If
    End Sub

3 个答案:

答案 0 :(得分:1)

请参阅以下MS KB文章:

HashAlgorithm.ComputeHash Method (Stream)

How to compute and compare hash values by using Visual Basic .NET or Visual Basic 2005

基本上,您需要将MD5字符串的生成更改为任一文章中概述的内容。引用第二个:

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

您可以使用md5.Hash作为参数调用此方法,并将结果存储在md5code变量中:

md5Code = ByteArrayToString(md5.Hash)

答案 1 :(得分:0)

更改此内容:buff.Append(String.Format("{0:X1}", hashByte))

收件人:buff.Append(String.Format("{0:X2}", hashByte))

您可以在代码中删除它:

Dim ObjFSO As Object = CreateObject("Scripting.FileSystemObject")  
Dim objFile = ObjFSO.GetFile(OpenFileDialog1.FileName)

答案 2 :(得分:0)

粘贴以下代码进行设置:

Imports System.IO
Imports System.Security.Cryptography

Function md5(ByVal file_name As String)
    Dim hash = MD5.Create()
    Dim hashValue() As Byte
    Dim fileStream As FileStream = File.OpenRead(file_name)
    fileStream.Position = 0
    hashValue = hash.ComputeHash(fileStream)
    Dim hash_hex = PrintByteArray(hashValue)
    fileStream.Close()
    Return hash_hex
End Function

Public Function PrintByteArray(ByVal array() As Byte)
    Dim hex_value As String = ""
    Dim i As Integer
    For i = 0 To array.Length - 1
        hex_value += array(i).ToString("X2")
        Next i
        Return hex_value.ToLower
    End Function

如果要检索MD5哈希,只需使用md5(file_name)并将file_name替换为文件路径。

例如:

TextBox1.Text = md5("C:\Desktop\foo.txt")