Самопроверка целостности кода контрольной суммой, как реализовать?
Сразу поставлю плашку, что из меня довольно поверхностный программист, обычно таким не занимаюсь.
Суть вопроса в контрольной сумме.
При инициализации контроллера необходима проверка целостности кода по тз, как это работает не получается разобраться, сравнивая с эталонной суммой если все ок, то понятно. Но если текущая сумма не будет равна, что делать?
Где-то предлагают текущую сумму записать как эталонную и перезагрузить, но в чем тогда вообще смысл этой проверки. Как будто нужно сделать что-то чтобы откатить код к эталонной сумме, типа восстановиться, но как это реализовать не представляю.
Контрольная сумма нужна чтобы проверить целостность, обнаружить ошибку. Если надо не только обнаружить, но и исправить ошибки, то для этого есть коды исправляющие ошибки. Хэмминга, Рида-Соломона и прочие БЧХ.
Для правильного вопроса надо знать половину ответа
Для точного восстановления кода по контрольной сумме последняя должна быть размером с архив этого кода.
Как правило, если контрольная сумма не совпадает, то просто выдаётся ошибка и запуск оборудования останавливается. Так поступают, например, BIOS'ы компьютеров. Дальше нужно восстановить код из внешнего источника, это дело для сервисного техника, или внутреннего хранилища (если там всё в порядке), такое есть на материнских платах с двумя чипами BIOS.
Как более сложный вариант - проверять контрольную сумму каждой функции. Если повреждена критическая функция, то останавливать работу, если некритическая, то не вызывать её во время работы.
Если контрольная сумма не сошлась, то надо вывести сообщение об ошибке (если на данном этапе это вообще возможно) и остановить инициализацию. Потушить контроллер, повиснуть или перезагрузиться.
В лихие 90-е был такой антивирус типа ADinf кажется. Он работал под MS-DOS и он после
проверки каждого файла писал в свою базу контрольную сумму как результат проверки.
Есть позитивный результат и связь 1:1 контрольной суммы? Все хорошо! Кажется такие антивирусы называли ревизорами. И если файл по каким-то причинам менялся то Adinf соотвественно бил тревогу
и сообщал что длина или сумма отличается от оригинальной.
Сегодня все программные продукты разрабатываются в версионным контролем. Тоесть есть Github
или BitBucket где лежит оригинальный код. И есть репозитарии бинарей. Их много. Для Linux apt/rpm, есть у Java maven и есть у Python свой PIP
Все они - централизованы. Имеют в вебе ендпоинт и не очень сложно написать логику которая
просто сверяет актуальность бинаря и сооответсвующего в репо.
Я слушал интервью с Евгением Касперским. Он сказал что не сильно верит в антивирусы но
очень доверяет системам с ЭЦП и тотальному алгоритму проверки доверия. Тоесть допустим
ты доверяешь производителю ПО - соотв. ты должен чекать наличие сертификата у любого
бинарника перед запуском. Обычно чек сертификата это легче чем антивирус-контроль
и при хорошей инфраструктуре может быть очень быстрый.
В лихие 2000е я читал о разработках Филиппа Циммермана который создал свою систему
кругового доверия и назвал ее PGP. Сегодня она может называться по другому но суть в том
что нет главного арбитра а есть просто круг друзей которыеы могут что-то там подписывать
и соотвественно если вы доверяете друзьям то вы доверяете всему на что их подпись накладывается.
Система очень интересная. И заслуживает внимания.
d-stream, я не знаю как работает Крипто-ПРо. Но чтобы механизмы начали
работать - нужна безопасная среда. И если среда опасная (Windows 95 например)
то и для Крипто-Про будет скорее всего недостаточно каких-то гарантий.
Яркий пример. Есть Linux. Вроде-бы безопасный. А есть еще и SE-Linux
- почти тот-же линукс но чуть больше гарантий.