关于算法:合并MD5哈希值 您所在的位置:网站首页 哈希值与md5值的关系 关于算法:合并MD5哈希值

关于算法:合并MD5哈希值

2023-07-19 09:02| 来源: 网络整理| 查看: 265

在大文件上计算单个MD5校验和时,通常使用哪种技术将各种MD5值组合为单个值? 您是否将它们加在一起? 我对将要执行此操作的任何特定语言,库或API都不感兴趣; 我只是对它背后的技术感兴趣。 有人可以解释如何完成吗?

在伪代码中给出以下算法:

1234MD5Digest X for each file segment F    MD5Digest Y = CalculateMD5(F)    Combine(X,Y)

但是Combine到底会做什么? 它将两个MD5摘要加在一起吗?

相关讨论 你为什么想这么做? 为了计算太大而无法容纳在内存中的文件的MD5值 MD5仅具有128位状态,可在计算期间跟踪512位文件块。 谁在乎文件的大小? @CarlNorum问题出在哈希实现可能保持状态但无法访问状态的接口上。 考虑pgcrypto中的digest函数,该函数仅对数据块起作用,而又不能馈入其他数据,这仅仅是因为状态在单个调用中被覆盖了。 因此了解单个哈希是否可以组合是有用的。 postgresql.org/docs/9.1/static/pgcrypto.html一些用户这样做... postgresql-archive.org/

In order to calculate MD5 values for files which are too large to fit in memory

考虑到这一点,您不想"组合"两个MD5哈希值。使用任何MD5实施,您都有一个对象保持当前校验和状态。因此,您可以随时提取MD5校验和,这在对共享同一开始的两个文件进行哈希处理时非常方便。对于大文件,您只需要继续输入数据-如果一次或成块对文件进行哈希处理就不会有任何区别,因为会记住状态。在两种情况下,您将获得相同的哈希值。

MD5是一种迭代算法。您无需计算大量的小型MD5,然后以某种方式组合它们。您只需要读取文件的一小块并将它们添加到摘要中,就可以了,因此您不必一次将整个文件存储在内存中。这是一个Java实现。

12345678FileInputStream f = new FileInputStream(new File("bigFile.txt")); MessageDigest digest = MessageDigest.getInstance("md5"); byte[] buffer = new byte[8192]; int len = 0; while (-1 != (len = f.read(buffer))) {    digest.update(buffer,0,len); } byte[] md5hash = digest.digest();

等等。您拥有整个文件的MD5,而没有一次将整个文件存储在内存中。

值得注意的是,如果由于某种原因您确实希望继续使用文件各部分的MD5哈希值(这有时对对通过低带宽连接传输的大文件进行临时检查很有用),则可以通过克隆获得它们随时消化摘要对象,就像这样

1byte[] interimHash = ((MessageDigest)digest.clone()).digest();

这不会影响实际的摘要对象,因此您可以继续使用整个MD5哈希值。

还值得注意的是,MD5是用于加密目的的过时哈希(例如,从不受信任的来源验证文件的真实性),并且在大多数情况下都应该用更好的东西(例如SHA-1)代替。对于非加密目的,例如验证两个可信源之间的文件完整性,MD5仍然足够。

相关讨论 我有一个需要汇总MD5的用例。我并行读取多个文件,并希望为整个集合设置一个校验和(假设文件名按字母顺序排列)。

这个问题没有多大意义,因为MD5算法采用任何长度的输入。像样的库应该具有函数,因此您不必一次添加整个消息,因为消息被分解为按顺序哈希的块,正在处理的块仅取决于前一个的结果哈希环。

维基百科文章中的伪代码应概述算法的工作原理。

openSSL库允许您将数据块添加到正在进行的哈希(sha1 / md5)中,然后在完成所有数据的添加后,调用Final方法,它将输出最终的哈希。

您无需在每个单独的块上计算md5,然后将其添加,而是将数据从openssl库添加到正在进行的哈希方法中。然后,这将为您提供所有单个数据块的md5哈希,而对输入数据大小没有限制。

http://www.openssl.org/docs/crypto/md5.html#

一个Python 2.7示例来解决AndiDog的问题。文件123.txt具有多行。

123456789101112131415161718192021>>> import hashlib >>> md5_A, md5_B, md5_C = hashlib.md5(), hashlib.md5(), hashlib.md5() >>> with open('123.txt', 'r') as f_r: ...     md5_A.update(f_r.read()) # read whole contents ... >>> with open('123.txt', 'r') as f_r: ...     for line in f_r: # read file line by line ...         md5_B.update(line) ... >>> with open('123.txt', 'r') as f_r: ...     while True: # read file chunk by chunk ...         chunk = f_r.read(10) ...         if not chunk: break ...         md5_C.update(chunk) ... >>> md5_A.hexdigest() '5976ddfa19bc2e1669ac3bd836101f58' >>> md5_B.hexdigest() '5976ddfa19bc2e1669ac3bd836101f58' >>> md5_C.hexdigest() '5976ddfa19bc2e1669ac3bd836101f58'

对于无法容纳在内存中的大文件,可以逐行或逐块读取。当diff命令失败时,此MD5的一种用法是比较两个大文件。

这是组合哈希的C#方法。让我们使用扩展方法来简化用户代码。

123456789101112public static class MD5Append {     public static int Append(this MD5 md5, byte[] data)     {         return md5.TransformBlock(data, 0, data.Length, data, 0);     }     public static void AppendFinal(this MD5 md5, byte[] data)     {         md5.TransformFinalBlock(data, 0, data.Length);     } }

用法:

12345678910111213141516   using (var md5 = MD5CryptoServiceProvider.Create("MD5"))         {             md5.Initialize();             var abcBytes = Encoding.Unicode.GetBytes("abc");             md5.Append(abcBytes);             md5.AppendFinal(abcBytes);             var h1 = md5.Hash;             md5.Initialize(); // mandatory             var h2= md5.ComputeHash(Encoding.Unicode.GetBytes("abcabc"));             Console.WriteLine(Convert.ToBase64String(h1));             Console.WriteLine(Convert.ToBase64String(h2));         }

h1和h2相同。而已。

大多数摘要计算实现允许您以较小的块为它们提供数据。您不能以使结果等于整个输入的MD5的方式组合多个MD5摘要。 MD5做一些填充,并在最后阶段使用处理的字节数,这使得原始引擎状态无法从最终摘要值中恢复。

相关讨论 因此,以下是一个很好的例子,说明如何不实现多个MD5组合?该用户只是将一个大型文件的各个块的多个散列连接在一起。 postgresql-archive.org/ @Thorsten:适当的方法是将固定大小的块的哈希和连接起来,然后再次对连接的字符串进行哈希处理以获得单个哈希值。如果对整个文件进行散列,则得到的散列总和与您得到的不同。这意味着如果您需要将串联与未通过这种方式计算的那部分进行比较,则串联是无用的,但是如果您定义自己的协议,则可以决定定义某个块大小并始终以这种方式计算哈希。哈希的质量并不比原始哈希函数差。 edonkey p2p文件共享使用了像这样的哈希。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有