Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial Internet of Things >> Интернет вещей

Использование цифровых подписей для проверки целостности бинарных файлов в Linux

Введение

Использование цифровых подписей для проверки целостности бинарных файлов в Linux

В мире, где данные могут быть перехвачены или изменены, уверенность в подлинности полученных файлов первостепенна. Например, если Пользователь А отправляет бинарный файл Пользователю Б по email, как Б может быть уверен, что файл не был подделан? Цифровые подписи (ЦП) дают надёжное решение, привязывая данные к уникальным учётным данным отправителя.

Эта статья демонстрирует практическую реализацию ЦП для проверки целостности 64-битных ELF-бинарников в Linux. Подход использует схему прямой подписи (без третьего पक्षного арбитра) и опирается на приватный ключ для подписания и публичный сертификат для верификации.

Пример реализации ЦП

Реализация подписи включает следующие шаги:

  1. Генерация MD5-хеша исходного бинарника.
  2. Создание приватного ключа и самоподписанного публичного сертификата.
  3. Подписание бинарника:
    • Шифрование MD5-хеша приватным ключом.
    • Хранение зашифрованного хеша в новой секции .sig ELF-файла.
    • Сохранение сертификата в ~/.ssh для последующей верификации.

Весь процесс можно автоматизировать скриптом с использованием openssl, objcopy и md5sum. Ниже пример скрипта sign_elf.sh, автоматизирующего подписание ELF-бинарников. (Исходный код без номеров строк приведён в конце статьи.)

#!/bin/bash
KEY_DIR="$HOME/.ssh"
PRIVATE_KEY="$KEY_DIR/priv.key"
CERTIFICATE="$KEY_DIR/pub.crt"
SUBJECT="/C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com"
if [ "$#" = "0" ]; then
 echo "Usage: sign_elfs.sh [ELF files]"
 exit 1
fi
[ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR"
# Генерация приватного ключа и сертификата
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
for ELF_BIN in "$@"; do
 ELF_BASE_NAME="${ELF_BIN##*/}"
 ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256"
 ELF_BIN_MD5="$ELF_BASE_NAME.md5"
 if [ ! -f "$ELF_BIN" ]; then
 echo "Error: no such file $ELF_BIN"
 exit 103
 fi
 # Удаление существующей секции .sig
 objcopy --remove-section=.sig "$ELF_BIN"
 # Добавление 512-байтовой нулевой секции .sig
 rm -f dummy.txt
 touch dummy.txt
 truncate --size=512 dummy.txt
 objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN"
 # Вычисление MD5-хеша бинарника (с секцией .sig)
 md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
 # Подписание MD5-хеша приватным ключом
 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
 # Верификация подписи сразу (опционально)
 openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
 # Встраивание зашифрованного хеша в секцию .sig
 objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
 # Отображение содержимого секции .sig для инспекции
 objdump -sj .sig "$ELF_BIN"
done
rm -f dummy.txt
ls -ls ~/.ssh

Использование цифровых подписей для проверки целостности бинарных файлов в Linux
Рисунок 1. Процесс подписания ELF-бинарника. (Источник: Auriga)

Детальный разбор скрипта

Строка 19 — Генерация сертификата

openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"

После этого шага ~/.ssh/priv.key хранит приватный ключ, а ~/.ssh/pub.crt — сертификат. Приватный ключ шифрует данные; сертификат содержит публичный ключ для верификации.

Цикл по ELF-файлам (Строка 21)

Каждый бинарник, указанный в командной строке, обрабатывается последовательно. Скрипт гарантирует, что любая предварительная секция .sig удалена перед повторным подписанием.

Управление секциями (Строки 33–40)

Вычисление хеша (Строка 42)

md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"

MD5 вычисляется над бинарником, включая плейсхолдер секцию .sig, и сохраняется в binary_name.md5.

Подписание хеша (Строка 45)

openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"

MD5-хеш шифруется приватным ключом, производя файл подписи (например, binary_name.sha256).

Верификация (опционально) (Строка 48)

openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"

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

Встраивание подписи (Строка 52)

objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"

Зашифрованный хеш заменяет плейсхолдер, завершая подписанный ELF-бинарник.

Запуск скрипта на наборе ELF-файлов даст подписанные бинарники, которые можно безопасно распространять. Получатель может проверить целостность, извлекая секцию .sig, дешифруя её публичным сертификатом и сравнивая полученный хеш со свежевычисленным хешем полученного файла.

Интернет вещей

  1. Драйвинг IoT синергий: как Connectivity CoC Bosch формирует коннектед будущее
  2. Подготовка производственных операций к ИИ с помощью IoT
  3. Цифровые двойники: раскрытие интеллектуального Edge IoT в производстве — Часть 2
  4. Предиктивное обслуживание: использование Индустрии 4.0 для бесперебойного производства
  5. Готово ли ваше производство к IoT? Практическое руководство
  6. Цифровое страхование: 5 трендов, революционизирующих покупку и управление полисом
  7. Western Digital запускает надежное 64-слойное 3D NAND хранилище для Промышленного ИоТ и Edge Computing
  8. Western Digital запускает надежное 64-слойное 3D NAND хранилище для Промышленного ИоТ
  9. Почему облачные вычисления необходимы для хранения IoT-данных
  10. Использование Индустрии 4.0: проверенные стратегии построения цифровой дорожной карты