Если вы заинтересованы только в обнаружении коррупции, вы можете использовать утилиту *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 '