Какие технологии помогут сделать безопасный канал передачи данных?

Добрый день. Хочу собрать два устройства на микроконтроллерах и организовать безопасный канал связи между ними. Скорость мало важна т.к. объемы данных малы: что-то вроде охранной сигнализации на машине и пульта к ней. Критерии такие:
  • Данные внутри канала должны быть зашифрованы (логично)
  • Соединение поддерживается лишь на время передачи данных
  • Устройства должны иметь возможность проверить, что общаются между собой, а не с другим устройством (что-то вроде SSL Pinning)
  • Система должна быть защищена от повторной отправки пакетов (если 3 сторона решит переслать один из пакетов устройств, то он не должен привести к повторному выполнению команды).
  • Выполняемые операции должны более-менее укладываться в ресурсы микроконтроллеров

Представляю себе это как некий обмен пакетами, содержащими помимо полезной нагрузки еще "отпечаток" уникального ключа устройства и счетчик пакетов в данном сеансе общения и номер сеанса (чтобы пакеты с одинаковой нагрузкой отличались всегда), однако скорее всего это уже изобрели до меня, а я не знаю что именно мне надо искать. Вопрос: в каком направлении мне надо копать, чтобы изучить имеющиеся технологии в этой сфере (то, что наиболее близко к моей теме)
  • Вопрос задан
  • 205 просмотров
Решения вопроса 1
athacker
@athacker
Для этого используется TLS. Это спец-протокол, который решает все вопросы, которые вы хотите решить. Там есть возможность шифрования, взаимной аутентификации как клиента, так и сервера и всё такое. Минусы -- вычислительно сложно. Т. е. на слабых микроконтроллерах процесс установления TLS-сессии может занимать время, плюс расход батарей. Плюсы -- уже есть готовые либы под множество платформ/архитектур, которые можно использовать, чтобы не изобретать велосипеды и не писать своё.

Гарантия от replay attack достигается тем, что для передачи команды сторонам нужно аутентифицироваться, т. е. это всегда двусторонний обмен. Технически сначала стороны обмениваются сертификатами, проверяют их, затем на основании алгоритма Диффи-Хэллмана формируют симметричный ключ шифрования, который будет использоваться для шифрования потока данных. В общем случае, в каждой сессии этот ключ будет разным. Есть механизмы кэширования и сохранения стейта, для ускорения установления TLS-сессии (допустим, на случай если клиент недавно уже подключался) -- это нужно, чтобы увеличить скорость согласования TLS-соединения), но это всё опционально и отключабельно.

Внутрь TLS можно засунуть что угодно -- кастомный бинарный протокол на базе TCP/IP или REST API на базе HTTP -- без разницы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
CityCat4
@CityCat4 Куратор тега Информационная безопасность
Внимание! Изменился адрес почты!
Соединение поддерживается лишь на время передачи данных

Неоптимально. Если стороны проходят жесткую аутентификацию, то она отнимает время и ресурсы. Проще сделать постоянное соединение, поддерживаемое пакетами типа пинга. А для периодического удостоверения, что стороны - все еще те, за кого себя выдают - периодически соединение рвать.
Система должна быть защищена от повторной отправки пакетов

Это работа прикладного уровня

А что касается остального - Вы говорите про IPSec, совершенно однозначно :) Не знаю, правда, как насчет ресурса микроконтроллера.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Банально:
Добавляйте подпись к запросу с временем и случайным набором символов.
На стороне устройства - запрещайте повторные запросы лет на 10.
Итог: даже зная что Вы отправили, нельзя это никак использовать.

Хотите зашифровать само "тело" запроса (чтобы не читали) - шифруйте любым способом (главное при этом - не используйте TOKEN сеанса для шифрования!).
Здесь подробно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы