机器之间的MD5哈希不同

时间:2013-04-19 15:30:01

标签: .net vb.net md5

我发生了一个奇怪的情况。我使用以下代码为小文件创建MD5哈希。通过比较服务器端的哈希值和客户端的哈希值,我可以测试它是否已经更改,以便我可以下载任何更新的副本。

Public Function MD5Hash(mFileInfo As FileInfo) As String

    Dim returnString As String = ""
    Try
        Dim f As FileStream = New FileStream(mFileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
        Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider()
        md5.ComputeHash(f)
        returnString = GenerateHash(System.Text.Encoding.UTF8.GetString(md5.Hash))
        f.Close()
    Catch
        'File doesn't exist
    End Try

    Return returnString

End Function


Public Shared Function GenerateHash(ByVal SourceText As String) As String

    'Create an encoding object to ensure the encoding standard for the source text
    Dim Ue As New UnicodeEncoding()
    'Retrieve a byte array based on the source text
    Dim ByteSourceText() As Byte = Ue.GetBytes(SourceText)
    'Instantiate an MD5 Provider object
    Dim Md5 As New MD5CryptoServiceProvider()
    'Compute the hash value from the source
    Dim ByteHash() As Byte = Md5.ComputeHash(ByteSourceText)
    'And convert it to String format for return

    Return Convert.ToBase64String(ByteHash)

End Function

问题在于,在服务器端,我得到一个哈希,在客户端,我得到一个不同的哈希,即使文件是相同的。客户端始终使用.NET2.0的WinXP 32位,服务器是带有.NET4.0的Win2008 64位

我尝试在服务器上压缩文件并在客户端上解压缩以确保文件在下载过程中没有被修改但仍然会出现相同的哈希不匹配。

1 个答案:

答案 0 :(得分:6)

GenerateHash(System.Text.Encoding.UTF8.GetString(md5.Hash)) 

此代码尝试将散列解析为UTF8编码的字符串 由于绝大多数哈希值都不是有效的UTF8,因此无效。

相反,您可以将字节编码为字符串格式,例如base 64。