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

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

Введение

Один из самых важных вопросов в современном мире - это вопрос достоверности полученных данных. Например, пользователь А отправляет данные D пользователю B по электронной почте. Как пользователь B может быть уверен, что полученные данные совпадают с данными, отправленными пользователем A? Один из возможных способов решения этой проблемы - использование цифровой подписи (DS). К DS применяются следующие требования:

В этой статье рассматривается пример реализации DS для проверки целостности двоичного файла в Linux (64-битный ELF). Мы будем использовать прямой DS, когда общаются только отправитель и получатель (без третьей стороны / арбитра). Для этого нам понадобятся закрытый ключ шифрования и открытый ключ (сертификат). Отправитель создает оба ключа. Пользователь A подписывает исполняемый файл и передает сертификат пользователю B с помощью безопасных средств доставки. После этого пользователь A отправляет подписанный файл пользователю B. Пользователь B запускает полученный файл; если двоичный файл поврежден, пользователь B получит сообщение о том, что проверка DS не удалась. Для реализации этого решения нам понадобится программа для подписи двоичных файлов и код, проверяющий DS.

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

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

  1. Создание исходного двоичного файла MD5;

  2. Создание двух ключей:закрытого и открытого (сертификат).

  3. Подпись двоичного файла (ELF):
    1 MD5 двоичного файла зашифрован с помощью закрытого ключа;
    3.2 ​​Зашифрованный MD5 записывается в новый .sig раздел двоичного файла;
    3.3 Сертификат сохраняется в папке ~ / .ssh.

Все это можно реализовать с помощью утилит Linux openssl, objcopy и md5sum. Ниже вы можете найти пример скрипта sign_elf.sh, который подписывает двоичные файлы ELF. (Примечание:исходный текст без номеров строк включен в конце этой статьи.)

 001 #! / bin / bash002 003 KEY_DIR ="$ HOME / .ssh" 004 PRIVATE_KEY ="$ KEY_DIR / priv.key" 005 CERTIFICATE ="$ KEY_DIR / pub.crt" 006 SUBJECT ="/ C =RU / ST =Нижний Новгород / L =Нижний Новгород / O =Аурига / OU =DEV / CN =www.auriga.com "007 008 if [" $ # "=" 0 "]; then009 echo "Использование:sign_elfs.sh ..." 010 выход 1; 011 fi012 013 if [! -d "$ KEY_DIR"]; then014 # Элемент управления войдет сюда, если $ DIRECTORY не существует. 015 mkdir "$ KEY_DIR" 016 fi017 018 # Создать закрытый ключ и сертификат019 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$ PRIVATE_KEY" -out " $ CERTIFICATE "-дней 365 -subj" $ SUBJECT "020 021 для ELF_BIN в $ @; do022 ELF_BASE_NAME ="$ {ELF_BIN ## * /}" 023 # ELF_BIN_OLD ="$ ELF_BIN.old" 024 ELF_BIN_SIGNATURE ="$ ELF_BASE_NAME.sha256" 025 ELF_BIN_MD5 ="$ ELF_BASE26 if"! -f "$ ELF_BIN"] || ["x $ ELF_BIN" ="x"]; then028 echo "Ошибка:нет такого файла $ ELF_BIN" 029 exit 1030 fi031 032 # Удалить .sig section033 objcopy --remove-section =.sig "$ ELF_BIN" 034 035 # Добавить 512-байтовый раздел, заполненный нулями036 rm -f dummy.txt037 touch dummy.txt038 truncate --size =512 dummy.txt039 objcopy --add-section .sig =dummy.txt --set-section-flags .sig =noload, readonly "$ ELF_BIN" 040 041 # Создать MD5 hash042 md5sum "$ ELF_BIN" | awk '{print $ 1}'> "$ KEY_DIR / $ ELF_BIN_MD5" 043 044 # Зашифровать хеш MD5 с помощью закрытого ключа 045 openssl dgst -sha256 -sign "$ PRIVATE_KEY" -out "$ KEY_DIR / $ ELF_BIN_SIGNATURE" "$ KEY_DIR5 046 047 # Проверить зашифрованный хэш MD5 с помощью certificate048 openssl dgst -sha256 -verify <(openssl x509 -in "$ CERTIFICATE" -pubkey -noout) -signature "$ KEY_DIR / $ ELF_BIN_SIGNATURE" "$ KEY_DIR / $ ELF_BIN зашифрованный хэш MD5 в двоичный файл ELF в .sig section051 echo "Добавить раздел .sig" 052 objcopy --update-section .sig ="$ KEY_DIR / $ ELF_BIN_SIGNATURE" --set-section-flags .sig =noload, только для чтения "$ ELF_BIN "" $ ELF_BIN "053 054 # Распечатать .sig section055 echo" Проверить .sig раздел "056 objdump -sj .sig" $ ELF_BIN "057 done058 059 rm -f dummy.txt060 061 ls -ls ~ / .ssh 


Рисунок 1. Процесс подписания двоичного файла ELF. (Источник:Аурига)

Давайте подробно рассмотрим, что делает этот скрипт.

Строка 19:

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

req - запрос на создание сертификата

-nodes - создать закрытый открытый текстовый ключ

-x509 - вывод - самоподписанный сертификат

-sha256 - алгоритм шифрования

-newkey rsa:4096 - создать новый сертификат и закрытый ключ RSA, количество бит - 4096

-keyout $ PRIVATE_KEY - путь к файлу, в который записан приватный ключ

-out $ CERTIFICATE - путь к файлу, в который записан сертификат. 365 дней - количество дней для подтверждения сертификата

-subj $ SUBJECT - новый субъект сертификата (должен иметь формат / тип0 =значение0 / тип1 =значение1 / тип2 =…). В нашем случае это / C =RU / ST =Нижний Новгород / L =Нижний Новгород / O =Аурига / OU =DEV / CN =www.auriga.com, где
С - страна
ST - штат, регион, провинция
L - местонахождение
O - организация
OU - организационный отдел / подразделение
CN - основное название / название контейнера

Тема подробно описана в RFC-5280 (https://tools.ietf.org/html/rfc5280). После запуска этой команды будет сгенерирован закрытый ключ ~ / .ssh / priv.key и сертификат ~ / .ssh / pub.crt. Закрытый ключ будет использоваться для шифрования данных, а сертификат будет использоваться для дешифрования данных. Используя один закрытый ключ, можно сгенерировать несколько уникальных сертификатов для дешифрования данных, зашифрованных этим закрытым ключом.

Строка 21:

для ELF_BIN в $ @; делать

Начало цикла для всех двоичных файлов, добавленных в скрипт sign_elf.sh.

Строка 33:

objcopy –remove-section =.sig «$ ELF_BIN»

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

Строки 36+:

rm -f dummy.txt
touch dummy.txt
truncate –size =512 dummy.txt
objcopy –add-section .sig =dummy.txt –set -section-flags .sig =noload, только для чтения «$ ELF_BIN

Создайте текстовый файл размером 512 байт и добавьте его в наш двоичный файл, не загруженный во время выполнения .sig раздел только для чтения, который содержит данные из файла dummy.txt.

Строка 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, созданный строкой 42 с закрытым ключом. Аргументы:

dgst - этот параметр указывает, что мы хотим зашифровать (подписать) данные;

-sha256 - алгоритм шифрования;

-sign $ PRIVATE_KEY - зашифровать файл с помощью закрытого ключа $ PRIVATE_KEY;

-out $ KEY_DIR / $ ELF_BIN_SIGNATURE - зашифрованные данные сохраняются в файл $ KEY_DIR / $ ELF_BIN_SIGNATURE;

$ KEY_DIR / $ ELF_BIN_MD5 - текстовый файл, содержащий данные для шифрования.

Строка 48:

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

Проверка подписанного файла. Обращаясь к этой строке, можно понять, что для проверки DS нам нужны зашифрованные данные, сертификат, который поможет нам выполнить проверку и проверку данных. То есть, если

x - зашифрованные данные,
y - сертификат,
z - данные проверки,

затем

f (x, y) =z

Строка 52:

objcopy –update-section .sig =”$ KEY_DIR / $ ELF_BIN_SIGNATURE” –set-section-flags .sig =noload, только для чтения «$ ELF_BIN» «$ ELF_BIN»

Удалите старый .sig раздел и добавьте новый в файл $ ELF_BIN (binary_name). В качестве данных для нового .sig используются данные из подписанного файла $ KEY_DIR / $ ELF_BIN_SIGNATURE (~ / .ssh / binary_name.sha256).


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

  1. Использование синергии для связанной компании
  2. Как подготовиться к использованию ИИ с помощью Интернета вещей
  3. Цифровые двойники могут быть интеллектуальным преимуществом для Интернета вещей в производственном секторе…
  4. Обслуживание в цифровом мире
  5. Готова ли ваша система к IoT?
  6. Цифровое страхование:5 цифровых тенденций, формирующих отрасль страхования
  7. Western Digital представляет новые продукты 3D NAND для IIoT
  8. Western Digital представляет новые продукты 3D NAND для IIoT
  9. Преимущества использования облачных вычислений для хранения данных IoT
  10. Технологии Индустрии 4.0:советы по разработке цифровой стратегии