【问题标题】:md5 hash for file without File Attributes没有文件属性的文件的 md5 哈希
【发布时间】:2011-02-13 10:26:23
【问题描述】:

使用以下代码计算文件的 MD5 哈希:

 Private _MD5Hash As String
 Dim _BinaryData As Byte() = New Byte(FileUpload1.PostedFile.InputStream.Length) {}
 FileUpload1.PostedFile.InputStream.Read(_BinaryData, 0, _BinaryData.Length)

 Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
 Dim md5hash() As Byte
 md5hash = md5.ComputeHash(Me._BinaryData)
 Me._MD5Hash = ByteArrayToString(md5hash)

  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

根据文件的创建日期和修改日期,我们得到不同的哈希值。我们将哈希和二进制文件存储在 SQL DB 中。当我们上传相同的文件实例时,这可以正常工作。但是,当我们在文件系统上从数据库中保存文件的新实例(以今天的日期作为创建/修改日期)然后检查新哈希与存储在数据库中的 MD5 时,它们不匹配,因此失败重复检查。

我们如何检查不包括文件属性的文件哈希?还是这里有其他问题?

【问题讨论】:

  • 可能文档内部存储了修改日期——它是什么类型的文件?
  • Me._BinaryData 在哪里初始化?它的设置是什么?
  • 它们是 .docx、.pdf、.ppt 类型的文件。没什么太花哨的。
  • 在上面更新以包含文件的 byte()

标签: .net sql-server-2005 hash md5


【解决方案1】:

我怀疑 Me._BinaryData 正在初始化的不仅仅是文件的内容...

最终,哈希可以改变的唯一方法是字节数组发生变化。

当您从数据库中持久化/恢复文件时,另一种可能性是字符集/编码差异。

【讨论】:

    【解决方案2】:

    答案是数组声明的老 VB 问题。大小是 UpperBound 而不是长度。

    Dim _BinaryData As Byte() = New Byte(FileUpload1.PostedFile.InputStream.Length) {}
    

    应该是:

    Dim _BinaryData As Byte() = New Byte(FileUpload1.PostedFile.InputStream.Length - 1 ) {}
    

    每个文件的末尾都有一个额外的空字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2021-06-19
      相关资源
      最近更新 更多