Если вы заинтересованы только в обнаружении коррупции, то вы можете использовать *sum
утилиту, например sha256sum
.
В каталоге для защиты выполните следующее. Обратите внимание на использование find ... -print0
и xargs -0
для размещения путей с пробелами или другими специальными символами.
find . -type f -print0 \ | xargs -0 sha256sum \ > manifest.sum
Затем используйте следующее для проверки содержимого файла.
sha256sum -c manifest.sum
В выводе будут перечислены файлы с OK
или FAILED
, и возвращаемое значение будет 0
(ноль), если все файлы проверены нормально, или ненулевое значение, если были ошибки.
Этот процесс проверит все файлы в текущем каталоге и оставит их manifest.sum
позади.
В идеале вы должны генерировать manifest.sum
в источнике (например: во время сборки) и распространять его вместе с файлами - только с помощью проверки ( sha256sum -c
) на целевом устройстве.
Поскольку вы упомянули, что это процесс обновления прошивки, я бы порекомендовал вам посмотреть дальше, чем просто проверять данные на наличие повреждений.
Во многих случаях полезно убедиться, что применяемое обновление является подлинным и предоставлено предполагаемым источником ... Если вы разрешите применить какое-либо обновление к системе, то откроете его для случайного (и потенциально повреждения), а также вредоносные обновления.
Чтобы решить эту проблему, вы должны изучить криптографическую подпись обновления.
- Вы можете избежать подписи только
manifest.sum
вышеизложенного (меньше затрат на обработку). Подписывая контрольные суммы, вы можете проверить содержимое каждого файла ... при условии, что, конечно, дайджест безопасен ... ( MD5 не будет хорошим выбором) - Однако может быть лучше распространять архив, который подписан (и, возможно, зашифрован) полностью и проверен до того, как он будет извлечен.
Поскольку выходные данные *sum
утилит представляют собой текст ASCII, вы можете использовать gpg --clearsign
для подписи данные:
find . -type f -print0 \ | xargs -0 sha256sum \ | gpg --clearsign --default-key 7826F053 \ > manifest.asc
На цели вы можете проверить подпись:
gpg --verify manifest.asc
Затем, если и только если подпись действительна и имеет ожидаемое происхождение (вы должны будете использовать это --status-fd
для проверки), вы можете перейти к проверке содержимого файла:
gpg --decrypt manifest.asc \ | sha256sum -c -
Обратите внимание, что он *sum
должен быть в « конце » конвейера, чтобы убедиться, что вы видите код возврата ... в качестве альтернативы вы можете использоватьset -o pipefail
Я упомянул использование --status-fd
выше ... это мешает в оболочке, так что вы, вероятно, захотите написать приложение, чтобы справиться с этим более разумно ... Что-то вроде этого будет " работать " (т.е. доказывать свою точку зрения).
Отпечаток ключа, используемого для подписания манифеста: A5C929D6A230C02067720F1DB2B38B43C2ABEB33
.
gpg --status-fd 3 --verify manifest.asc 3>&1 1>/dev/null \ | grep -Eq '^\[GNUPG:\] VALIDSIG A5C929D6A230C02067720F1DB2B38B43C2ABEB33 '