На практике да, идентичный криптографический хеш означает, что файлы одинаковы, если файлы не были созданы злоумышленником или другим злонамеренным объектом. Шансы случайных столкновений с любой хорошо спроектированной криптографической хеш-функцией настолько малы, что на практике они незначительны и в отсутствии активного злоумышленника.
В целом, однако, нет, мы не можем сказать, что два произвольных файла с одинаковым хешем однозначно означают, что они идентичны.
Способ работы криптографической хеш-функции состоит в том, чтобы получить вход произвольной длины и вывести значение фиксированной длины, вычисленное из входных данных. У некоторых хеш-функций есть несколько выходных длин на выбор, но выход все еще в некоторой степени является значением фиксированной длины. Это значение будет иметь длину до нескольких десятков байт; алгоритмы хеширования с самым длинным выходным значением, обычно используемым на сегодняшний день, имеют 512-битный выход, а 512-битный выход составляет 64 байта.
Если вход в хэш-функцию длиннее, чем выход хэш-функции, необходимо удалить некоторую точность воспроизведения, чтобы вход соответствовал выходу. Следовательно, должно существовать несколько входов с длинами, превышающими длину вывода, которые генерируют один и тот же вывод.
Давайте возьмем текущую рабочую лошадку, SHA-256, в качестве примера. Он выводит хэш 256 бит или 32 байта. Если у вас есть два файла, каждый из которых имеет длину ровно 32 байта, но разные, они должны (при условии отсутствия ошибок в алгоритме) хешировать разные значения, независимо от содержимого файлов; в математических терминах, хэш - функция отображения 2 256 входного пространства А на выходном пространстве 2 256, которое должно быть можно обойтись без столкновений. Однако, если у вас есть два файла, каждый из которых имеет длину 33 байта, должна существовать некоторая комбинация входных данных, которые дают одинаковое 32-байтовое выходное хэш-значение для обоих файлов, потому что теперь мы отображаем пространство ввода 2 264 на 2 256 выходное пространство; здесь мы можем легко увидеть, что в среднем должно быть 2 8 входов для каждого отдельного выхода. Продолжайте в том же духе, и с 64-байтовыми файлами должно быть 2 256 входов для каждого отдельного выхода!
Криптографические хеш-функции разработаны таким образом, что в вычислительном отношении сложно составить вход, который дает конкретный вывод, или составить два входа, которые дают одинаковый вывод. Это известно как сопротивление атаки прообразом или сопротивление столкновению. Это не невозможно найти эти столкновения; он просто должен быть очень, очень, очень, очень сложным. (Особый случай столкновительной атаки - это атака на день рождения.)
Некоторые алгоритмы лучше других противостоят атакующим. MD5 в настоящее время считается полностью сломанным в наши дни, но, в последний раз, я смотрел, он все еще демонстрировал довольно хорошее сопротивление первому прообразу . SHA-1 также эффективно разрушается; атаки с прообразом были продемонстрированы, но требуют особых условий, хотя нет никаких оснований полагать, что так будет до бесконечности; как говорится, атаки всегда становятся лучше, они никогда не становятся хуже. SHA-256/384/512 в настоящее время считается безопасным для большинства целей. Однако, если вам просто интересно узнать , совпадают ли два допустимых файла, не созданных злонамеренно, то любого из них должно быть достаточно, поскольку пространство ввода уже достаточно ограничено, чтобы вас больше всего интересовали случайные столкновения. , Если у вас есть основания полагать, что файлы были созданы злонамеренно, то вам по крайней мере необходимо использовать криптографическую хеш-функцию, которая в настоящее время считается безопасной и которая устанавливает нижнюю планку в SHA-256.
Первым прообразом является поиск входных данных, которые дают конкретное выходное хеш-значение; второй прообраз - найти один вход, который дает тот же выход, что и другой, указанный вход; Столкновение состоит в том, чтобы найти два входа, которые дают один и тот же результат, независимо от того, что это такое, а иногда и без учета того, что это за входы.
При этом важно помнить, что файлы могут иметь очень разные представления данных и при этом отображать их абсолютно одинаково. Таким образом, они могут казаться одинаковыми, даже если их криптографические хеши не совпадают, но если хэши совпадают, то, скорее всего, они будут выглядеть одинаково.