Лучший способ зашифровать данные и предотвратить повторные атаки по HTTP - PullRequest
0 голосов
/ 04 февраля 2020

Я работаю над шлюзом IoT, который будет собирать данные с устройств IoT. IoT-устройство - это ограниченное устройство, которое не может использовать HTTPS. Он периодически отправляет небольшое количество данных - от датчиков, с некоторой дополнительной информацией, такой как время, идентификатор сообщения, идентификатор устройства и т. Д. c.

. Сейчас мы получили реализацию шлюза как REST API в * 1007. * открыт для всех. Таким образом, он принимает запросы как JSON с любого устройства, не гарантируя, что данные, поступающие с нашего устройства, не повреждены и не скомпрометированы.

Без возможности защитить данные с помощью HTTPS, что является наилучшим способом разработки интерфейса между шлюз и устройство?

Ответы [ 4 ]

2 голосов
/ 04 февраля 2020

Без возможности защитить данные с помощью HTTPS, каков наилучший способ разработки интерфейса между шлюзом и устройством?

Вы по-прежнему можете использовать шифрование / аутентификацию симметрии c для обеспечить целостность и конфиденциальность, что должно быть выполнимо даже для бюджетных устройств

. В качестве вдохновения вы можете получить лут в JWE с общим ключом .

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

Независимо от этого - при отсутствии tls / https ypu нужно позаботиться о многих вещах, таких как защита общий ключ, обновите, если отозвано, et c

0 голосов
/ 22 февраля 2020

Учитывая тип инструментов, о которых вы упомянули, имеющих доступ (HTTP / JSON), я предлагаю взглянуть на JOSE, который является стандартным способом подписывания и шифрования данных такого типа. В частности, вас заинтересуют JWE , JWS и JWT . Кривая обучения для JOSE, к сожалению, несколько крутая, а документы довольно скудные, но она достаточно эффективна и реализована на различных платформах и избавит вас от головной боли при изобретении ваших собственных протоколов (что довольно сложно сделать правильно ). Мне очень повезло с созданием пользовательских систем вокруг JOSE.

Есть несколько ключевых вопросов, которые вам нужно задать:

  • Вам нужна взаимная аутентификация или только аутентификация? устройства? Если устройство только пишет и никогда не читает, то вам, скорее всего, потребуется только аутентифицировать устройство, а не сервер.

  • Можете ли вы принять на себя риск, связанный с тем, что один общий секретный ключ будет встроен в устройства? Проблема с одним общим секретом заключается в том, что если какое-либо устройство подвергается обратному проектированию, вся защита теряется до тех пор, пока вы не отключите все устройства с этим ключом.

  • Можете ли вы принять стоимость изготовления секрет для каждого устройства? В зависимости от вашего производственного процесса генерация уникального секрета для каждого устройства может быть затруднена.

  • Можете ли вы принять требования к месту на устройстве и требованиям к обработке сертификата клиента? Если нет, можете ли вы принять логистику ведения серверной базы данных ключей каждого устройства? (Если вы не можете исключить ни то, ни другое, вам придется go с одним общим секретом для всей системы.)

Мне кажется, что вы говорите об устройстве это может обработать сложность клиентского сертификата, но не полный стек HTTPS. Если вы также можете справиться со сложностью создания сертификата во время производства или ваши клиенты готовы зарегистрировать свои устройства, то я рекомендую следующее:

  • Во время изготовления или регистрации создайте сертификат и подписание запроса. Отправьте его на сервер для подписи и установите подписанный X.509 на устройстве. (Генерация CSR на устройстве также возможна, но многим маленьким устройствам не хватает энтропии для генерации приличного случайного числа. В любом случае возможны компромиссы.)

  • Создание сертификата для сервера и установите его ключ publi c на всех устройствах.

  • Если предположить, что объем отправляемых данных невелик, я бы связал их все в JWT (веб-токен). ), зашифрован на публичный ключ c сервера и подписан закрытым ключом клиента. Обычно JWT используются для обмена аутентификационной информацией, но на самом деле это просто стандартный контейнер для отправки подписанных и зашифрованных JSON данных, поэтому они действительно могут быть любыми.

  • In Чтобы предотвратить повторные атаки, сервер должен отслеживать сообщения, которые он видел раньше. Есть два основных подхода, которые мне нравятся, в зависимости от вашей ситуации:

    • Сделайте jti (JWT ID) комбинацией метки времени и случайного значения (в этом случае серверу просто нужно сохранить кэш последних JTI и отклонить слишком старые временные метки)

    • Сделать jti комбинацией идентификатора устройства и монотонно увеличивающегося идентификатора сообщения. Затем сервер должен отслеживать идентификатор последнего увиденного сообщения для каждого устройства и отклонять любые идентификаторы, меньшие или равные этому.

Если вам не нужно шифрование, посмотрите на JWS, который просто подписывает данные. Ни один из этих методов не требует шифрования, и это немного проще, если вы уберете эту часть (например, вам не нужен сертификат сервера). Вы по-прежнему можете запретить повторы и разрешить подключение только доверенным клиентам. Кто-то может перепроектировать ваше устройство и получить сертификат клиента. Преимущество клиентского сертификата заключается в том, что если вы обнаружите злоупотребление, вы можете просто запретить этот один сертификат. С общим секретом вы не сможете этого сделать.

Основным преимуществом всего этого является то, что JOSE основан на JSON, который вы уже понимаете и знаете, как анализировать и работать. с. Но он также достаточно компактен для строкового протокола. Он также чрезвычайно гибок с точки зрения алгоритмов, что значительно упрощает его реализацию на небольшом оборудовании. Вы можете создать все то же самое вручную, используя открытые / закрытые ключи, но JOSE уже продумал многие хитрые проблемы безопасности.

Если бы это было лучше задокументировано ....

0 голосов
/ 22 февраля 2020

Насколько ограничено ваше устройство на самом деле? Существуют небольшие реализации TLS, которые не требуют компромисса в отношении безопасности, такие как wolfSSL .

Размеры посадочных мест (размер скомпилированного двоичного файла) для диапазона wolfSSL составляют от 20 до 100 КБ в зависимости от параметров сборки и используемого компилятора.
Что касается использования памяти во время выполнения, то обычно wolfSSL потребляет от 1 до 36 КБ. за сеанс SSL / TLS.

В любом случае, я бы не советовал вам пытаться реализовать собственный набор шифров, если вы ДЕЙСТВИТЕЛЬНО не знаете, что делаете.

0 голосов
/ 04 февраля 2020

Если устройство не может выполнить https (с любым набором наборов шифров), вам, вероятно, придется пойти на серьезные компромиссы и не иметь некоторые аспекты безопасного соединения. Немного упрощенно, но https - это практически полный набор того, как это можно сделать, нет ничего «ненужного». Вам может не понадобиться все, но это полностью зависит от вашего варианта использования и модели угрозы. Перед реализацией этого вы должны иметь полное представление о том, что именно обеспечивает https и как, чтобы вы могли использовать соответствующие части. Также обратите внимание, что это совсем не просто реализовать, пользовательская реализация, скорее всего, будет уязвимой.

...