Обновление контрольной суммы (MD5, SHA1) при добавлении файлов Java - PullRequest
0 голосов
/ 06 июня 2018

Можно ли обновить контрольную сумму (MD5, SHA1), когда у нас есть значение Hash при добавлении файла.

  1. У меня есть файл A, уже загруженный на сервер, и у меня уже есть файл MD5, который содержитХеш-значение MD5.
  2. Я хочу добавить новый блок данных (байт []) в файл A, и мне необходимо обновить новое хеш-значение для файла Md5.

Isможно обновить значение хеш-функции MD5 для нового файла, не считывая весь файл A, чтобы создать хэш-файл (поскольку файл A слишком велик и занимает слишком много времени).

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Насколько я вижу из статей Википедии о MD5 или SHA1 , это должно быть возможным.Вы должны разделить старый хеш обратно на внутренние переменные состояния (должно быть просто битовое смещение), а затем просто продолжить вычисление нового хэша.Отказ от ответственности: я сам не пробовал, просто прочитал вики-страницы об алгоритмах.

В любом случае: MD5 и SHA1 сломаны .Пожалуйста, используйте более новые хэши sha2 или sha3.

0 голосов
/ 06 июня 2018

Если и только если вы можете выбрать новый блок данных, состоящий из одного байта 0x80, определенного количества байтов 0x00 в зависимости от размера файла A и 4 байтов, содержащих битовую длину файла A, после чего следуетлюбые другие данные, которые вам нравятся, ДА.

Это называется Атака на расширение длины и является криптографической слабостью всех хэшей, использующих конструкцию Меркле-Дамгарда , которая включает MD5 SHA1 и семейство SHA-2, но не семейство SHA-3.Это на самом деле не вопрос программирования и больше подходит для crypto.SX, где уже есть немало вопросов, таких как https://crypto.stackexchange.com/questions/17733/sha1-multipart-calculation и https://crypto.stackexchange.com/questions/3978/understanding-the-length-extension-attack

Однако, если вы сохранить обычно внутреннее состояние хеша с последнего полного блока перед концом данных, восстановить его и возобновить «обновление», добавляя (неограниченные) новые данные, так как я считаю, что другие ответы более или менее предназначеныВы можете вычислить новый хеш (и новое сохраненное состояние, если хотите повторить этот процесс). Если и как получить доступ к этому состоянию и как именно оно должно быть представлено, зависит от используемой вами реализации. Вы пометили Java, хотя ваш фактический Q не упоминает об этом;Выполнение этого с использованием крипто-Java предоставляет (JCA) было бы очень сложно, потому что JCA намеренно скрывает детали всех поддерживаемых алгоритмов за серией упрощенных абстрагированных классов фасадов.OTOH, если вы (пере) кодируете эти хеши самостоятельно, доступ к внутреннему состоянию может быть довольно простым.И если вы используете «легковесные» реализации BouncyCastle, то, вероятно, не очень сложно, хотя, возможно, есть риск, что они изменят реализацию, но мне придется посмотреть подробнее.Хранение и извлечение может быть или не быть проблемой.

0 голосов
/ 06 июня 2018

Я думаю, вам нужно снова прочитать весь файл.

MD5 работает (IIRC), поддерживая набор внутренних «регистров», которые меняются по мере того, как алгоритм потребляет каждый байт.Таким образом, единственный способ продолжить предыдущее вычисление MD5 было бы, если бы вы каким-то образом сохранили состояние этих «регистров» в предыдущей конечной точке.

Посмотрите на внутреннюю часть вычисления MD5 - IПодумайте, есть некоторые в Javascript, которые иллюстрируют общий принцип, если вы не можете найти Java.Даже хорошо написано, это отчасти некрасиво (я думаю, в этом суть).

...