7.10. Проверка контрольной суммы файла

[+]7.10.1. cksum(1)
[+]7.10.2. md5(1)
[+]7.10.3. sha1(1)
[+]7.10.4. openssl(1)
[+]7.10.5. Примеры

Описание:  Кандидат должен быть знаком с началами теории вычисления конторльной суммы и почему вообще важно её вычислять. Кандидат должен уметь вычислить контрольную сумму файла, проверить контрольную сумму.

Практика: md5(1), openssl(1), sha1(1), cksum(1).

Комментарий

Различные утилиты для подсчёта контрольных сумм служат для того, чтобы пользователь мог убедиться в аутентичности файла, которым он располагает. Так, например, устанавливая программу sudo(1) из исходного кода, или из заранее скомпилированного бинарника, полезно убедиться, что то что вы скачали действительно то, что вы хотели скачать. Для этого надо подсчитать контрольную сумму файла. Теоретически можно представить, что злоумышленник смог изменить файл таким образом, что его размер и контрольная сумма при этом не изменились, т.е. найти коллизию (коллизия, это когда два файла имеют одну контрольную сумму), но представить себе при этом, что он сумел сохранить функциональность программы крайне трудно. В особенности, если вы проверите две разные контрольные суммы двумя разными алгоритмами.

7.10.1. cksum(1)

Наличие этой программы требуется стандартом POSIX. У данной программы есть необязательный аргумент -o, при помощи которого можно задать различные «исторические» (читай устаревшие) алгоритмы подсчёта контрольной суммы.

В настоящее время программа cksum(1) вычисляет контрольную сумму (CRC) по стандарту ISO/IEC 8802-3:1989. Алгоритм описан в справочной странице man(1).

Команда cksum(1) выводит два числа: контрольную сумму и число байт.

7.10.2. md5(1)

Программа для подсчёта hash-суммы по одноимённому алгоритму. Данный алгоритм используется по умолчанию при работе с паролями. Полезные аргументы: -q не выводить ничего, кроме самой суммы (полезно в скриптах) и -r выводить в начале сумму и только потом имя файла. Это облегчает визуальную проверку, если надо сравнить два файла — суммы будут написаны строго друг под другом.

Длина суммы — 128 бит.

Идея хеширования состоит в том, что мы имеем некоторую очень резко меняющуюся и необратимую функцию, таким образом, даже от очень похожих строк получаются катастрофически разные результаты, а по хеш сумме невозможно восстановить оригинальную информацию. Это делает данный механизм пригодным для хранения шифрованных паролей.

Алгоритм хеширования MD5 до сих пор не взломан, хотя существует способ находить коллизии — когда несколько вхождений дают один результат. Но для того, чтобы найти коллизию, надо знать оригинал, таким образом, неясно как это могло бы скомпрометировать данный метод.

7.10.3. sha1(1)

Идея аналогична md5(1), однако использован иной алгоритм и суммы получаются более длинные (160 бит).

Команда sha1(1) есть не во всех BSD. В её отсутствии можно пользоваться командой openssl(1), которая позволяет посчитать контрольную сумму различными алгоритмами (в том числе MD5 и SHA1).

7.10.4. openssl(1)

Программа openssl(1) предназначена для создания ключей RSA, DH, DSA, создания сертификатов X.509, CSR, CRL, подсчёта контрольных сумм различными алгоритмами, шифрования и дешифрования, проверки SSL/TLS, обработки шифрованной почты.

Запустив программу без параметров вы войдёте в интерактивный режим, в которм можно применять команды list-standard-commands, list-message-digest-commands, list-cipher-commands. А можно передать эти команды в качестве аргуметна openssl(1). Так или иначе, вы получите список команд поддерживаемых openssl(1). Команды эти также перечислены и в странице man(1) по openssl(1) с кратким описанием какая команда для чего служит.

Чтобы получить справку по каждой команде openssl(1) существует отдельная страница man(1). Так, для того, чтобы получить справку по команде openssl dgst надо выполнить команду man dgst. Аргумента, который бы выводил справочную информацию по опциям команды нет. Поэтому, как это ни глупо, я знаю только один способ вызвать список аргументов в интерактивном режиме работы с openssl(1) — передать ей неверный аргумент, например -help:

$ openssl dgst -help
unknown option '-help'
options are
-c              to output the digest with separating colons
-d              to output debug info
-hex            output as hex dump
-binary         output in binary form
-sign   file    sign digest using private key in file
-verify file    verify a signature using public key in file
-prverify file  verify a signature using private key in file
-keyform arg    key file format (PEM or ENGINE)
-signature file signature to verify
-binary         output in binary form
-engine e       use engine e, possibly a hardware device.
-md5 to use the md5 message digest algorithm (default)
-md4 to use the md4 message digest algorithm
-md2 to use the md2 message digest algorithm
-sha1 to use the sha1 message digest algorithm
-sha to use the sha message digest algorithm
-mdc2 to use the mdc2 message digest algorithm
-ripemd160 to use the ripemd160 message digest algorithm
        

Увы, на официальном сайте OpenSSL — http://www.openssl.org/docs/ документация помечена как незаконченная. Фактически там есть только страницы man(1) и очень скудные howto.

7.10.5. Примеры

Ниже приведены примеры подсчёта контрольных сумм файла ядра:

$ cksum /boot/kernel/kernel
3008568191 5910343 /boot/kernel/kernel 1
$ md5 /boot/kernel/kernel
MD5 (/boot/kernel/kernel) = c56259ae98a151be7e00a278a3aa41ba
$ md5 -r /boot/kernel/kernel
c56259ae98a151be7e00a278a3aa41ba /boot/kernel/kernel
$ md5 -q /boot/kernel/kernel
c56259ae98a151be7e00a278a3aa41ba
$ openssl dgst -md5 /boot/kernel/kernel
MD5(/boot/kernel/kernel)= c56259ae98a151be7e00a278a3aa41ba
$ openssl dgst -sha1 /boot/kernel/kernel
SHA1(/boot/kernel/kernel)= 02df35b5dc3af65ce515531c549507ea34ce5c1b
$ openssl list-message-digest-commands
md2
md4
md5
mdc2
rmd160
sha
sha1
        
1 Команда cksum(1) выводит два числа: контрольную сумму и число байт.

Один из способов применения программ md5(1) и её аналогов, может состоять в примитивном сравнительном тесте производительности ЭВМ. Идея состоит в сравнении времени подсчёта хеш-суммы от некоторого фрагмента устройства /dev/zero.

$ time head -c 100000000 /dev/zero | md5 > /dev/null

real    0m2.309s
user    0m1.685s
sys     0m0.375s
        

Сравнивая эти величины полученные на разны машинах, можно грубо, с оговорками, судить об их производительности.

Другой пример: проверка правильно ли записался на iso образ CD:

$ burncd -f /dev/acd0 data livecd-i686-installer-2006.0.iso fixate
next writeable LBA 0
writing from file livecd-i686-installer-2006.0.iso size 713270 KB
written this track 713270 KB (100%) total 713270 KB
fixating CD, please wait..
$ md5 -r livecd-i686-installer-2006.0.iso
5ceb2ed4041bad12b9e4feceede86b6f livecd-i686-installer-2006.0.iso
$ dd if=/dev/acd0 bs=2048 2> /dev/null | md5
5ceb2ed4041bad12b9e4feceede86b6f
        

Совпадение хеш-сумм свидетельствует об идентичности записанного диска своему образу.