Использование цифровых подписей для проверки целостности данных в Linux
Введение
Один из самых важных вопросов в современном мире - это вопрос достоверности полученных данных. Например, пользователь А отправляет данные D пользователю B по электронной почте. Как пользователь B может быть уверен, что полученные данные совпадают с данными, отправленными пользователем A? Один из возможных способов решения этой проблемы - использование цифровой подписи (DS). К DS применяются следующие требования:
-
Содержание подписи должно зависеть от подписанного сообщения;
-
В подписи должна использоваться уникальная информация отправителя;
-
Создать подпись должно быть легко;
-
Подделать подпись с помощью вычислений должно быть невозможно;
-
Подпись должна быть маленькой.
В этой статье рассматривается пример реализации DS для проверки целостности двоичного файла в Linux (64-битный ELF). Мы будем использовать прямой DS, когда общаются только отправитель и получатель (без третьей стороны / арбитра). Для этого нам понадобятся закрытый ключ шифрования и открытый ключ (сертификат). Отправитель создает оба ключа. Пользователь A подписывает исполняемый файл и передает сертификат пользователю B с помощью безопасных средств доставки. После этого пользователь A отправляет подписанный файл пользователю B. Пользователь B запускает полученный файл; если двоичный файл поврежден, пользователь B получит сообщение о том, что проверка DS не удалась. Для реализации этого решения нам понадобится программа для подписи двоичных файлов и код, проверяющий DS.
Пример реализации DS
Реализация DS включает следующие шаги:
-
Создание исходного двоичного файла MD5;
-
Создание двух ключей:закрытого и открытого (сертификат).
-
Подпись двоичного файла (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).
Интернет вещей
- Использование синергии для связанной компании
- Как подготовиться к использованию ИИ с помощью Интернета вещей
- Цифровые двойники могут быть интеллектуальным преимуществом для Интернета вещей в производственном секторе…
- Обслуживание в цифровом мире
- Готова ли ваша система к IoT?
- Цифровое страхование:5 цифровых тенденций, формирующих отрасль страхования
- Western Digital представляет новые продукты 3D NAND для IIoT
- Western Digital представляет новые продукты 3D NAND для IIoT
- Преимущества использования облачных вычислений для хранения данных IoT
- Технологии Индустрии 4.0:советы по разработке цифровой стратегии