追加文件时更新校验和(MD5、SHA1)java

Update checksum (MD5, SHA1) when append files java

当我们附加文件时有哈希值时,是否可以更新校验和(MD5,SHA1)。

  1. 我已经将文件 A 上传到服务器并且我已经有了包含 MD5 哈希值的 MD5 文件。
  2. 我想将一个新的数据块 (byte[]) 附加到文件 A,我必须更新 Md5 文件的新哈希值。

是否可以更新新文件的 MD5 哈希值而不读取整个文件 A 来创建文件哈希(因为万一文件 A 太大并且需要太多时间)。

我想你必须再读一遍整个文件。

MD5 通过维护一堆内部 'registers' 来工作 (IIRC),这些内部 'registers' 随着算法消耗每个字节而变化。因此,从之前的 MD5 计算继续的唯一方法是,如果您以某种方式在之前的终点存储了那些 'registers' 的状态。

看看 MD5 计算的内部结构 - 如果您找不到 Java 脚本,我认为 Java 脚本中有一些说明了一般原理。即使写得很好也有点难看(我想这就是重点)。

据我从有关 MD5 or SHA1 的维基百科文章中所见,应该 是可能的。您必须将旧哈希拆分回内部状态变量(应该只是一些位移),然后继续计算新哈希。免责声明:我没有自己尝试,只是阅读有关算法的维基页面。

无论如何:MD5 和 SHA1 已损坏。请使用较新的 sha2 或 sha3 哈希值。

当且仅当您可以选择新数据块由一个0x80字节、一定数量的0x00字节(取决于文件A的大小)和4个包含文件A的位长度的字节组成,然后是您喜欢的任何其他数据,是的。

这叫做Length Extension Attack and is a cryptographic weakness of all hashes using the Merkle-Damgard construction, which includes MD5 SHA1 and the SHA-2 family, but not the SHA-3 family. This is not really a programming question and is more suitable on crypto.SX where there are already quite a few questions about it, such as https://crypto.stackexchange.com/questions/17733/sha1-multipart-calculation and https://crypto.stackexchange.com/questions/3978/understanding-the-length-extension-attack

但是,如果您保存散列的正常内部状态 截至数据结束前的最后一个完整块,并恢复它并从那里恢复'updating' 添加(不受限制的)新数据,因为我相信其他答案或多或少是有意的,您可以计算新的哈希值(如果您想重复此过程,还可以计算新的保存状态)。 是否以及如何访问此状态,以及它需要如何表示,取决于您使用的实现。您标记了 Java 虽然您的实际 Q 没有提到它;使用加密 Java 提供的 (JCA) 执行此操作将非常困难,因为 JCA 有意隐藏 所有 支持的算法的细节,这些算法隐藏在一系列简化、抽象的外观 类. OTOH 如果您自己(重新)编码这些哈希值,访问内部状态可能会非常容易。而且,如果您使用 BouncyCastle 'lightweight' 实现,可能不是很难,尽管可能有更改实现的风险,但我必须仔细查看。存储和检索它可能是也可能不是问题。