Какие части файла SHA256 использует для вычисления хэша

Я работаю над передачей файлов по сети. Существует нулевая терпимость к потере данных во время передачи. Меня попросили вычислить значения SHA256 для исходного и скопированного файлов, чтобы убедиться, что содержимое одинаково. До сих пор я проводил сравнения, основанные на копировании и вставке файла и разрешении Windows переименовывать файл с добавлением -copy к имени файла. Я также попытался переименовать файл после переименования выше, а также удалить расширение файла. Пока все они производят один и тот же хэш. Я также закодировал изменение атрибутов файла (только что изменил lastWrittenTime и fileCreationTime), и это, похоже, не влияет на хэш.

Checksum result of copying and pasting a file(explorer appends "-copy to name):

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7

Checksum result of renaming the -copy in explorer:

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7

Checksum result of changing file extension:

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7

Какие части файла используются при создании хеша?

Хорошо, нулевая терпимость — это слишком, если хэш не совпадает, файл придется отправить повторно.


person user2943131    schedule 31.10.2013    source источник
comment
...содержимое файла?   -  person dav_i    schedule 01.11.2013
comment
Опубликуйте код того, как вы вычисляете хэш.   -  person paparazzo    schedule 01.11.2013
comment
байты 25, 48, 69 и 257945489   -  person SJuan76    schedule 01.11.2013
comment
@ SJuan76: Спасибо за это. смешной   -  person user2943131    schedule 01.11.2013
comment
Какой код вы используете для проверки, пожалуйста   -  person AMH    schedule 31.10.2017


Ответы (2)


Все содержимое двоичного файла передается через алгоритм хеширования. Метаданные файла (такие как имя, дата и т. д.) роли не играют.

person spender    schedule 31.10.2013

Во-первых, общая рекомендация: не делайте этого. Используйте rsync или что-то подобное для массовой передачи файлов. За плечами Rsync годы оптимизации и отладки, бесчисленное количество опций для контроля того, как (и происходит ли) копирование, и он доступен в Windows. Не тратьте время на создание того, что уже построено.

Но если вы должны…

Алгоритмы хеширования обычно заботятся о байтах, а не о файлах. Применяя SHA256 к файлу, вы просто читаете байты и передаете их алгоритму.

Если вы хотите хешировать пути, разрешения и т. д., вы должны делать это на уровне каталога, потому что эти вещи составляют «содержимое» каталога. Не существует стандартного представления каталогов на уровне байтов, поэтому вам придется создать его самостоятельно. Обычно достаточно чего-то похожего на список каталогов в отсортированном порядке. И убедитесь, что каждая запись содержит хэш соответствующей вещи, будь то файл или другой каталог. Таким образом, хэш каталога однозначно определяет не только имя и атрибуты каждого дочернего элемента, но и, рекурсивно, все содержимое подкаталога.

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

Наконец, небольшое замечание: нулевой терпимости не существует. Забудьте, будут ли коллизии SHA256 происходить в течение жизни Вселенной. Гамма-луч может перевернуть бит, говорящий: «Эти два файла не совпадают!» Такие перевороты случаются крайне редко, но чаще, чем вы думаете. В шумной квантовой вселенной нам не следует говорить об абсолютах.

person Marcelo Cantos    schedule 31.10.2013
comment
Ближе всего вы, вероятно, получите стандартное представление каталога, если сам каталог находится в zip-файле. - person cHao; 01.11.2013
comment
@cHao: это излишне и не работает рекурсивно. Простого текстового списка, включающего хэш каждого дочернего элемента, достаточно, чтобы гарантировать уникальность. Но +1 за комментарий в любом случае, потому что он напомнил мне о дочерней хеш-точке. - person Marcelo Cantos; 01.11.2013
comment
@MarceloCantos: оцените детали, нулевой допуск - это слишком, но если они не совпадают, мне придется повторно отправить файл. - person user2943131; 01.11.2013