Сравнить два файла md5
Я хочу сказать, содержат ли два файла tarball одинаковые файлы с точки зрения имени файла и содержимого файла, не включая метаданные, такие как дата, пользователь, группа.
Однако есть некоторые ограничения: во-первых, я не могу контролировать, включены ли метаданные при создании файла tar, на самом деле файл tar всегда содержит метаданные, поэтому прямое различие двух файлов tar не работает. Во-вторых, поскольку некоторые tar-файлы настолько велики, что я не могу позволить себе распаковать их во временный каталог и различать содержащиеся файлы один за другим. (Я знаю, могу ли я распаковать file1.tar в file1 /, я могу сравнить их, вызвав tar -dvf file2.tar в файле /. Но обычно я не могу позволить себе распаковать даже один из них)
Есть идеи, как сравнить два файла tar? Было бы лучше, если бы это можно было сделать в сценариях SHELL. В качестве альтернативы, есть ли способ получить контрольную сумму каждого субфайла, не распаковывая архив?
tarsum - это почти то, что вам нужно. Возьмите его вывод, прогоните его через sort, чтобы получить одинаковый порядок для каждого, а затем сравните два с помощью diff. Это должно дать вам базовую реализацию, и было бы достаточно легко перенести эти шаги в основную программу, изменив код Python для выполнения всей работы.
Попробуйте также pkgdiff, чтобы визуализировать различия между пакетами (обнаруживает добавленные / удаленные / переименованные файлы и измененное содержимое, существует с нулевым код, если не изменился):
Вы контролируете создание этих файлов tar?
Если это так, лучшим приемом было бы создать контрольную сумму MD5 и сохранить ее в файле внутри самого архива. Затем, когда вы хотите сравнить два файла, вы просто извлекаете эти файлы контрольной суммы и сравниваете их.
Если вы можете позволить себе извлечь только один файл tar , вы можете использовать параметр --diff в tar , чтобы найти различия с содержимым других tar файл.
Еще один грубый трюк , если вас устраивает просто сравнение имен файлов и их размеров .
Помните, это не гарантирует, что другие файлы будут такими же!
Выполнить tar tvf , чтобы вывести список содержимого каждого файла и сохранить выходные данные в двух разных файлах. затем вырежьте все, кроме столбцов имени файла и размера. Желательно также отсортировать два файла. Затем просто выполните сравнение файлов между двумя списками.
Просто помните, что последняя схема на самом деле не вычисляет контрольную сумму.
Пример tar и вывода (в этом примере все файлы имеют нулевой размер).
Команда для создания отсортированного списка имен / размеров
Вы можете взять два таких отсортированных списка и сравнить их.
Вы также можете использовать столбцы даты и времени, если это вам подходит.
РЕДАКТИРОВАТЬ: см. Комментарий @ StéphaneGourichon
Я понимаю, что это запоздалый ответ, но я наткнулся на эту тему, пытаясь добиться того же. Реализованное мной решение выводит tar на стандартный вывод и передает его любому выбранному вами хешу:
Обратите внимание, что порядок аргументов важен; особенно O , какие сигналы использовать stdout.
Вот мой вариант, он тоже проверяет разрешение unix:
Работает, только если имена файлов короче 200 символов.
Вам нужен tardiff? Это «простой сценарий Perl», который «сравнивает содержимое двух архивов и сообщает обо всех обнаруженных между ними различиях».
Также существует diffoscope, который является более общим и позволяет сравнивать вещи рекурсивно (включая различные форматы).
Если вы не извлекаете архивы и не нуждаетесь в различиях, попробуйте diff -q :
diff -q 1.tar 2.tar
Этот тихий результат будет «1.tar 2.tar Different» или ничего, если нет различий.
У меня есть аналогичный вопрос, и я решаю его с помощью python, вот код. ps: хотя этот код используется для сравнения содержимого двух zipball, но он похож на tarball, надеюсь, я могу вам помочь
Я предлагаю gtarsum , который я написал на Go, а это значит, что он будет быть автономным исполняемым файлом (не требуется Python или другая среда выполнения).
Он прочитает tar-файл и:
- отсортировать список файлов по алфавиту,
- вычислить SHA256 для каждого содержимого файла,
- объединить эти хэши в одну гигантскую строку
- вычислить SHA256 этой строки
Результатом является «глобальный хеш» для tar-файла на основе списка файлов и их содержимого.
Он может сравнивать несколько файлов tar и возвращать 0, если они идентичны, и 1, если они не совпадают.
Существует инструмент под названием archdiff. По сути, это Perl-скрипт, который может просматривать архивы.
Доброго времени суток!
Существует множество программ сравнения двух файлов.
Но какой алгоритм используется для сравнения двух хеш-функций md5.
В hashlib (Python3) такого метода нет.
Update: нужно найти 2 максимально похожих хеша.
Оценить 2 комментария
Марат: Сначала разберись, что такое md5-хеш, а то туфту какую-то спрашиваешь. Похожесть файловых хешей никакого отношения к похожести файлов не имеет.
Спасибо за ответ. Здесь моя вина. Мне нужно было сравнить несколько хешей и вывести 2 максимально похожих.
Спасибо за ответ. Здесь моя вина. Мне нужно было сравнить несколько хешей и вывести 2 максимально похожих.
По идее и при правильном MD5, результат вычисления хеша должен максимально соответствовать закону нормального распределения.
Другими словами, MD5 хеши от двух файлов с различием в один бит должны соответствовать друг другу, как произвольная выборка двух значений белого шума.
Иными словами - два хеша от двух разных файлов соответствуют друг другу, как два произвольно взятых значения.
Еще проще - хеши MD5 сравнивать бесполезно!
Вы, наверное, имеете в виду результаты хэш функций, а не сами функции? Тогда ответ прост: побайтное сравнение результатов если там хэш в сыром виде (то есть memcmp). Или посимвольное, если хэш строкой (то есть strcmp).
Спасибо за ответ. Здесь моя вина. Мне нужно было сравнить несколько хешей и вывести 2 максимально похожих.
Марат: а что такое похожесть файлов? Мой внутренний телепат предполагает, что вы хотите найти похожие изображения. Если это так, что хэш-функции тут ни при чем.
Привет. Я хочу показать вам небольшой фокус. Для начала вам потребуется скачать архив с двумя файлами. Оба имеют одинаковый размер и одну и ту же md5 сумму. Проверьте никакого обмана нет. Md5 хеш обоих равен ecea96a6fea9a1744adcc9802ab7590d. Теперь запустите программу good.exe и вы увидите на экране следующее.
Попробуйте запустить программу evil.exe.
Что-то пошло не так? Хотите попробовать сами?
О хешах и колллизиях
На самом деле ничего нового во всем этом нет. В действительности данный эффект достигается за счет методов быстрого поиска коллизий для хеш функции разработанных еще в 2004-2006 годах. Если кто не знает, коллизия это два разных набора данных, имеющих одно и тоже хеш-значение. Так вот, в 2004 году группа китайских исследователей разработала алгоритм, основанный на дифференциальном криптоанализе, позволяющий за относительно небольшое время находить два различных случайных блока данных, размером по 128 байт каждый, имеющих одну и ту же md5 сумму. И хотя алгоритм этот в свое время произвел эффект взорвавшейся бомбы быстродействие его оставляло желать лучшего. Но уже в 2006 году чешский криптограф Властимил Клима предложил для поиска коллизий новый метод, позволяющий найти разную пару случайных 128 байтных блоков с одной md5 суммой на персональном компьютере меньше чем за минуту.
Таким образом, с помощью данной методики можно сконструировать два файла с одинаковой md5 суммой, но имеющих различные 128 байт в середине.
M0, M1, . Mi-1, Mi, Mi+1, Mi+2, . Mn,
M0, M1, . Mi-1, Ni, Ni+1, Mi+2, . Mn.
Обратите внимание что хеши обоих этих файлов совпадут, т.к. различающиеся блоки Mi, Mi+1 и
Ni, Ni+1 вернут в качестве si+2 одно и тоже значение, т.к. f(f(s, Mi), Mi+1) = f(f(s, Ni), Ni+1), а поскольку все последующие данные идентичны то последующие значения функции сжатия для обоих файлов будут совпадать.
Что это нам дает
Теперь перейдем от вещей абстрактных и отдаленных к вопросу практическому. Предположим, что у нас есть исполняемый файл M0, M1, X, X, …, Mn. Но его основе мы можем создать два разных файла M0, M1, N1, N1, …, Mn и M0, M1, N2, N1,…, Mn(просто меняем блоки X на N1 и N2). Если блоки N1 и N2 – это коллизии то хеш-сумма этих файлов будет совпадать.
Теперь представим, что этот исполняемый файл имеет следующую структуру:
if (X == X) then < good_program >else < evil_program >
Вот собственно и весь секрет данного фокуса.
Как сделать самостоятельно
int good()
int a;
std::cout std::cin>>a;
return 0;
>
int bed()
int a;
for ( int i=0; i std::cout >
std::cin>>a;
return 0;
>
int _tmain( int argc, _TCHAR* argv[])
//строки s и s2 содержат только блоки с коллизиями без лишних элементов
string s=str1;
string s2=str2;
s.erase(0,56);
s.erase(128,8);
s2.erase(0,64);
if (s==s2) return good();
> else return bed();
>
return 0;
>
* This source code was highlighted with Source Code Highlighter .
Особое внимание прошу обратить на переменные str1 и str2. Они служат для того, чтобы их можно было быстро найти в hex-редакторе и заменить нужными данными.
Функция main в зависимости от содержимого переменных s вызывает хорошую или плохую версию программы.
Шаг второй: После компиляции программы нужно будет немного поработать с hex-редактором для того чтобы найти в .exe файле наши строки str1 и str2. Скопируй полученный .exe файл. Пусть копия будет называется «обрезанная версия». Откройте копию в hex-редакторе и найди в ней строки str1 и str2. Удалите все данные идущие после первых 64 байт первой из строк. Последние строки полученного файла будут выглядеть вот таким образом: . Сохраните данный файл.
Шаг третий: Созданный на втором шаге файл будет служить так называемым префиксом для поиска коллизий. Чтобы найти коллизию с заданным префиксом нужно скачать отсюда программу fastcoll(Спасибо ее автору Marc Stevens). Исходники лежат тут.
Запустите программу с параметром –p. В качестве префикса укажите «обрезанную версию». В результате работы программы будут созданы два файла «обрезанная версия_msg1» и «обрезанная версия_msg2».
Шаг четвертый: создайте еще одну копию вашей программы. Пусть оригинал будет называться good.exe, а копия evil.exe. Откройте файлы msg1 и msg2 в hex редакторе. Сперва замените блок в котором хранится str2 данными из блока str1. Пусть теперь в них будет одинаковая информация. После этого скопируйте из файла msg1 последние 128 байт и вставьте их в ваш good файл так как показано на рисунке.
Обратите внимание, отступы должны соответствовать следующим параметрам: первый блок вставляется прямо в том месте где заканчивается файл «обрезанная версия», второй блок располагается в 96 байтах от первого. Важно: блоки вставлять одни и те же. Это будет доброй версией нашей программы. Сохраняем файл good.exe и открываем файл evil.exe. Блоки в файл evil.exe нужно будет вставить в те же места, что и в good.exe, единственное отличие заключается в том, что первый блок мы берем из файла msg2, а второй из файла msg1. Это различие и обеспечит нам невыполнение условия программы if (s==s2) и соответственно запустит злую версию программы.
Шаг пятый: Profit! Сравниваем md5 суммы файлов, наслаждаемся полученным результатом.
Несколько вопросов:
1. Как реализовать сравнение файлов у пользователя, с файлами на сервере (по md5) - подобие утилиты обновлений
2. Можно ли сосчитать md5 с файла, который хранится на яндекс.народ ftp?
Сравнение md5-сумм с md5-суммами файлов!
Всем доброго времени суток! Помогите реализовать небольшое приложение - вообщем имеется папка.
Сравнение файлов по MD5
Доброго времени суток, я бы хотел узнать как реализовать сравнение файлов по MD5 в Visual Studio.
SSIS. Как реализовать сравнение файлов?
Всем привет. Есть такое задание: 1) Нужно проверить существование файла1 (.txt) через.
Рекурсивное переименование файлов, md5-хеш которых совпадает с md5-хешем, указанном в списке файлов
Есть файл из двух колонок md5-хеш и имя файла (краткое, с расширением, UTF-8). Есть каталог с.
Как реализовать сравнение файлов у пользователя, с файлами на сервере (по md5) - подобие утилиты обновлений
Первое что пришло в голову - скачать этот файл и проверить уже локально.
Второе что пришло в голову - если ты так задумал проверять новые версии на сайте, то это делается совсем не так.
Памирыч, Я в курсе.
Ты не понял! Я имею ввиду как вытянуть этот ключ из файла, ведь он уже есть у него, а ты говоришь чтобы при сравнении файлов мы всех их прокручивали через метод, да еще если и совпадет открывать файл
eJ_Studio, а что тут думать? Или ты про составление кода? Вот что я накумекал:
Вот мой способ. md5() хеш можно заменить на размер файла в байтах
P.S.
Памирыч, Сейчас буду пробовать
eJ_Studio, рекомендую ознакомиться с этой статьей
Считываем и проверяем md5() хеши всех папок и файлов, находящихся в корневой с игрой на сервере и у пользователя
у файлов на современных ОС в свойствах можно увидеть уже готовый мд5 ключ и еще какие то, вот я и думал как то их от туда вытягивать, но как не узнал.!
А мы что делаем?
Мы и узнали хэш файла.
Копия этого файла будет иметь точно такой же хэш, что свидетельствует о том, что файлы идентичны.
Если речь идет о каких-то компонентах, папках и их деревьях, то считай, что ты заработал лютый геморрой.
Я имел ввиду обновление какой-либо программы - на сайте всего лишь текст с номером версии, прога при запуске считывает, и если отличается от текущей - предлагает скачать (или скачивает)
А тут. скажу одно - если файлы большие и их немало, то скачивание всей игры каждый раз - это такой страшный костыль, что и не снилось.
Плюс - ты пока не знаешь, как не скачивая файл, узнать его хэш.
Узнавать размер файла - это грабли в темноте
Код старый, мог и не проверить.
Выход - если сервер твой, заводи там страничку с голимой инфой, как в примере с обновлением.
Памирыч, это все понятно. Но проверка версии я уже сделал. Мне бы сейчас автоматическую систему обновления
мы сами получаем с помощью функции. А нужно просто получить его, как некое свойство! Или ты думаешь что операции получения ключей файлов будет быстра?
А кто тебе сказал, что можно вот так взять и получить это свойство? И есть ли оно такое вообще?
То что ты там увидал в "крутых" виндах, и посчитал что это мана с небес - ты глубоко заблуждаешься, ты наводишь мышь на mp3-файл - и там в подсказке ты видишь исполнтеля, длительность и прочее.
Но что это, где-то в свойствах файла?
Если б так было, программисты бы не писали коды для получения mp3-тегов, а брали готовенькое свойство.
Так и тут - нету ничего готового, берем и пишем.
И не стоит забывать о том, что хэширование предназначено для паролей и строк, а для файлов оно не годится, особенно для больших.
Это то же самое, что забивать микроскопом гвозди.
Нет, ты об этом не писал.
Ты говорил о том, чтобы получать хэш не через функцию, а как готовое свойство.
О назначении MD5 ты нигде не заикнулся.
eJ_Studio, это форум не для
у файлов на современных ОС в свойствах можно увидеть уже готовый мд5 ключ и еще какие то, вот я и думал как то их от туда вытягивать, но как не узнал
нет таких свойств у файлов и папок. А то, что можно увидеть в некоторых экземплярах установленных осей, есть свистелки и перделки, которые добавляют закладки к стандартым окошкам свойств и вычисляют хеши на лету при открытии окна свойств.
проверка обновлений (или пусть назовем это получением списка устаревших файлов) прямым получением хеша с файлов на сервере (т.е. скачиванием файлов и последующим расчетом их хешей) - неприменима, т.к. трафик может быть огромным + время проверки линейно увеличивается при увеличении размеров файлов на сервере и при сужении канала.
скачивать файл с сервера для расчета его хеша так или иначе придется хоть в файл, хоть в массив байтов. Ведь именно из массива байтов вычисляется хеш файла.
Теперь такая картина: клиент весит 200метров и для проверки каждый раз соединяется с серваком и закачивает эти же 200метров. А по итогам проверки может оказаться, что реальной обновке подлежит библа весом в 500килобайт.
Таким разработчикам нужно ладошки к столу прибивать гвоздями, чтоб до клавиатуры не дотянулись.
Что можно сделать как альтернативу:
на сервере лежит список с информацией о файлах, которые обновились: номерами их версий(можно хеши написать), относительным (относительно корневой папки установленного клиента) их размещением в папке на машине клиентов, ссылкой для скачивания файла.
Причем информация выкладывается только для обновляемых файлов (с накоплением изменений, т.е. список может только расти)
Вот этот список следует скачать, по нему проверить свои файлы на соответствие, несовпадающие скачать.
Это о самой проверке. теперь по поводу автообновления.
Я бы сделал так - проверкой обновлений, скачиванием файлов и последующей заменой старых файлов на новые занимается отдельная утилита, стартующая одновременно с основной программой или вместо нее (и если обновлений не требуется, запускающая основную программу).
Итак, мы скачали файлы. Утилита заменяет файлы, при необходимости производит перерегистрацию файлов в реестре и прочее. после всего запускает уже обновленную основную программу.
Примерно так. Думаю, понятно, что код я не приведу - уж очень он большой будет., да и нет готового для копипаста - писать надо. Но алгоритм ясен.
Как узнать хеш файла в Windows поможет небольшая бесплатная программа HashTab, которая предназначена для проверки хеша, так называемую контрольную сумму файла.
Программа является расширением для Проводника Windows. HashTab позволит определить контрольную сумму (хеш или хэш) файла для проверки подлинности и целостности проверяемого файла.
Довольно часто пользователям попадаются файлы, в которых оригинальные файлы подменены ложными копиями. Такие копии могут содержать в себе вредоносные программы.
Как пользоваться HashTab
При установке программа HashTab интегрируется в окно свойств Проводника. После установки программы HashTab на ваш компьютер, вы можете проверять хэш-суммы файлов. Для этого кликните по какому-нибудь файлу правой кнопкой мыши.
В контекстном меню выберите пункт «Свойства». После открытия окна, в окне «Свойства» вы увидите новую вкладку «Хеш-суммы файлов».
При нажатии на вкладку «Хеш-суммы файлов» появляется окно со значениями контрольных сумм этого файла.
После нажатия на ссылку «Настройки», откроется окно настроек программы HashTab, где во кладке «Отображаемые хеш-суммы» можно выбрать соответствующие пункты алгоритмов проверки.
Для проверки файлов будет достаточно выбрать главные алгоритмы проверки: CRC32, MD5, SHA-1. После выбора алгоритмов проверки нажимаете на кнопку «OK».
Для сравнения хеш-сумм файлов нужно будет перетянуть файл в поле «Сравнение хеша». Если значения хэша файлов совпадают, то появится зеленый флажок.
Также можно проверить хеш другим способом. Для этого, нажимаете на кнопку «Сравнить файл…», а затем выбираете в окне Проводника файл для сравнения.
После этого нажимаете на кнопку «Открыть», а потом в открывшемся окне, вы увидите полученный результат сравнения контрольной суммы файла.
Кликнув правой кнопкой мыши по соответствующей контрольной сумме, вы можете скопировать эту сумму или все контрольные суммы, а также перейти к настройкам программы, если выберете в контекстном меню соответствующий пункт.
Можно также одновременно проверить два файла поодиночке и сравнить результат в двух окнах. На этом изображении видно, что контрольные суммы двух файлов совпадают.
Выводы статьи
Программа HashTab предназначена для того, чтобы проверять контрольные суммы (хэш) файла. Используя бесплатную программу HashTab, вы всегда будете знать, были ли внесены изменения в файл, или нет.
Для чего нужно проверять файлы на подлинность
Для того, чтобы предоставить пользователю возможность убедиться в подлинности файла, образа или программы, производители рядом со ссылками для скачивания файла приводят его хеш-суммы.
Вы наверняка встречали, когда скачивали файлы из интернета, что после характеристик и системных требований, часто есть пункт с контрольными суммами файла примерно такого вида.
Хеш — это определенный код соответствующий определенной данной единицы информации, уникальный просчитанный математически образ конкретного файла. При малейшем изменении файла сразу изменяется и хэш-сумма этого файла. С помощью такой проверки обеспечивается защита конкретного файла от изменения.
Контрольные суммы необходимо проверять, если вы скачиваете файлы не с официального сайта разработчика или другие важные файлы, например образ операционной системы. Сравнивая контрольные суммы образа или файла, вы сразу можете узнать был модифицирован этот файл или нет.
Если есть ошибка контрольной суммы, контрольная сумма не соответствует требуемой, то это значит, что файл был изменен (возможно, в него был внедрен вирус, или произведены какие-то другие действия).
Для проверки контрольной суммы (хэша) можно использовать бесплатную программу HashTab.
Читайте также: