Как вычислить MD5 хеш файла
Программа md5sum предназначена для вычисления контрольной суммы MD5 файлов и строк. Также программа может сверять правильность MD5 хеша для указанного файла.
Для вычисления MD5 хеша файла выполните команду вида:
md5sum ФАЙЛ
Вы получите хеш файла за которым следует имя этого файла:
1e13e0919233605aba9b88706ad498aa ФАЙЛ
Чтобы вычислить MD5 хеш строки используйте команду вида (обратите внимание на опцию -n при echo — она обязательна, иначе хеш будет вычислен неверно, поскольку к строке будет добавлен невидимый символ newline):
echo -n 'СТРОКА' | md5sum
Пример вывода:
3f01ebc18e4cb2f471fc3964c098e7b3 -
Вместо имени файла показана чёрточка (-) это означает, что файл или строка получены по стандартному вводу.
Имя файла или чёрточка иногда не нужны — например, при использовании в скриптах. Рассмотрим, как можно использовать md5sum чтобы не выводилось имя файла.
У программы md5sum не предусмотрена опция для показа только хеша без файла, видимо, это связано с предназначением программы md5sum — вычислять хеш в формате, который пригоден для использования в этой же программе для последующей верификация целостности файла. Поэтому единственный выход — тем или иным образом обрезать данные.
1. Извлечение первого поля в awk
Следующая команда передаст рассчитанный хеш с именем файла в awk, которая отобразит только первое поле:
md5sum ФАЙЛ | awk '{ print $1 }'
2. Трюк с использованием массивов
Присвоим вычисленный хеш и имя файла массиву. В массивах Bash к первому элементу можно обратиться просто по имени без индекса [0], то есть в следующих командах $md5 содержит только 32 символа из вывода md5sum:
md5=($(md5sum ФАЙЛ)) echo $md5
Выведет только хеш:
1e13e0919233605aba9b88706ad498aa
3. Обрезка строки с cut
Команда cut может обрезать данные, разбив их на поля. Например, в следующей команде разделителем для команды cut указывается пробел (cut -d ' '), и следующая опция указывает, что нужно вывести только первое поле (-f 1):
md5sum ФАЙЛ | cut -d ' ' -f 1
Альтернативный вариант:
md5sum ФАЙЛ | cut -c 1-32
Первый пример можно использовать с кэшем любой длины, например, можно перейти от md5sum к sha256sum и команда по-прежнему будет применимой. Во втором варианте нужно каждый раз знать, сколько символов содержится в хеше.
Как проверить файл в md5sum, если имеется только MD5 хеш
Для сверки файла с MD5 хешем в md5sum, эта программа требует файл с md5 хешем в формате:
[md5-ХЕШ][ПРОБЕЛ][ПРОБЕЛ][ИМЯ-ФАЙЛА]
К примеру, если хеш сохранён в файл test.txt.md5, то проверка выполняется так:
md5sum -c test.txt.md5
Проверяемые файлы указывать нельзя, поскольку их имена берутся из файла test.txt.md5.
Возможна ситуация, что файл test.txt.md5 содержит только MD5 хеш (без пробелов и имени файла) — в этом случае проверка хеша завершится неудачей.
Итак:
- test.txt — файл, который нужно сверить по хешу
- test.txt.md5 — файл с хешем (без имени файла внутри)
Поскольку имя файла известно, мы можем просто напечатать содержимое файла с хешем, пару пробелов и затем имя файла и всё это передать в md5sum:
cat test.txt.md5 5a6d311c0d8f6d1dd03c1c129061d3b1 md5sum -c <(printf "%s test.txt\n" $(cat test.txt.md5)) test.txt: OK
Другая опция — добавить имя файла в файл с хешем:
sed -i 's/$/ test.txt/' test.txt.md5 md5sum -c test.txt.md5 test.txt: OK
Можно заново посчитать контрольную сумму MD5 для файла и сравнить её с хранимой в test.txt.md5:
cmp test.txt.md5 <(md5sum test.txt | cut -d\ -f1)
Вариант этой же команды:
md5sum test.txt | cut -d' ' -f1 | cmp test.txt.md5
md5sum очень медленный! Альтернатива md5sum
При вычислении одного хеша скорость md5sum не является значимой. Но рассмотрим пример, когда нужно использовать md5sum множество раз.
Следующая команда maskprocessor создаст файл 6.txt со строками от 000000 до 999999 — то есть всего 1 миллион строк:
maskprocessor ?d?d?d?d?d?d > 6.txt
Теперь вычислим хеш каждой из этой строки:
cat 6.txt | while read -r line ; do echo -n $line | md5sum | awk '{print $1}'; done > md5.txt
Вычисление миллиона хешей MD5 на современном компьютере займёт десятки минут.
Но эту же самую задачу (расчёт MD5 хеша для всех строк в диапазоне 000000…999999, можно решить в PHP:
<?php for ($i = 0; $i <= 999999; $i++) { echo md5 (str_pad( "$i", 6, "0", STR_PAD_LEFT )) . PHP_EOL; }
Сохраните приведённый выше код в файл md5-rb-gen.php, запустите следующим образом:
php md5-rb-gen.php
Чтобы сохранить полученные хеши в файл:
php md5-rb-gen.php > md5.txt
Проверим затраченное время:
time php md5-rb-gen.php
Вывод:
real 0m3,973s user 0m0,540s sys 0m1,381s
То есть на вычисление миллиона хешей понадобилось менее четырёх секунд.
Смотрите, кстати «Как запустить PHP скрипт без веб-сервера».
И также смотрите статью «Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши».
Связанные статьи:
- Инструкция по использованию команды dd (64.8%)
- Какие есть полезные инструменты с интерфейсом командной строки для системных администраторов Linux (50%)
- Анонимизация трафика утилит командной строки с ProxyChains (50%)
- Как удалить метаданные файла на Linux (35.3%)
- Bokken: проект с открытым исходным кодом для обратного инжиниринга (35.3%)
- Как вывести экран телефона на компьютер и управлять телефоном с компьютера на Linux (RANDOM - 14.8%)