附加文件java时更新校验和(MD5,SHA1)

时间:2018-06-06 02:22:42

标签: java file checksum message-digest

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

  1. 我已将文件A上传到服务器,我已经拥有包含MD5哈希值的MD5文件。
  2. 我想在文件A中添加一个新的数据块(byte []),我必须更新Md5文件的新哈希值。
  3. 是否可以在不读取整个文件A的情况下更新新文件的MD5哈希值以创建文件哈希(因为如果文件A太大而且需要花费太多时间)。

3 个答案:

答案 0 :(得分:3)

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

这称为Length Extension Attack,是使用Merkle-Damgard construction的所有哈希的加密弱点,https://crypto.stackexchange.com/questions/17733/sha1-multipart-calculation包括MD5 SHA1和SHA-2系列,但不包括SHA-3系列。这不是一个真正的编程问题,更适合于crypto.SX,其中已经有很多问题,例如https://crypto.stackexchange.com/questions/3978/understanding-the-length-extension-attackhttps://imgur.com/2aOgCKB

但是,如果您保存哈希的正常内部状态,那么在数据结束前的最后一个完整阻止,并恢复并恢复更新'从那里添加(不受限制的)新数据,因为我相信其他答案或多或少的意图,你可以计算新的哈希(如果你想重复这个过程,可以计算新保存的状态)。 如果以及如何访问此状态,以及它是如何表示的,取决于您使用的实现。您标记了Java,尽管您的实际Q没有提及它;使用加密Java提供(JCA)将非常困难,因为JCA故意隐藏了一系列简化的抽象外观类背后的所有支持的算法的细节。 OTOH如果你自己(重新)编码这些哈希值,访问内部状态可能非常容易。如果你使用BouncyCastle'轻量级'实施可能并不是很难,但可能会有改变实施的风险,但我必须仔细研究。存储和检索它可能是也可能不是问题。

答案 1 :(得分:2)

据维基百科关于MD5SHA1的文章我可以看到,这个应该是。您必须将旧散列拆分回内部状态变量(应该只是一些位移),然后继续加速新散列。免责声明:我自己没有尝试过,只需阅读有关算法的wikipages。

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

答案 2 :(得分:0)

我认为你必须再次阅读整个文件。

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

看一下MD5计算的内部结构 - 我认为Javascript中有一些说明了一般原则,如果你找不到Java。即便写得很难看(我想这也是重点)。