TLS-подобное шифрование по Bluetooth на iOS?
============================================

Так что это может быть особый случай, но я надеюсь, что кто-то может помочь мне здесь.

Мне нужно поговорить с периферийным устройством через Bluetooth. Устройство, для которого мы также контролируем прошивку. Теперь проблема в том, что нам нужно убедиться, что никто не сможет подслушать, так как информация, которая будет отправлена, будет конфиденциальной. Это означает, что нам нужно зашифрованное сообщение.

Из того, что я вижу, является то, что Bluetooth LE 4.2 поддерживает шифрование, НО мы должны быть в состоянии поддерживать более старые iPhone, чем 6s. Это означает: нет BLE 4.2 и нет встроенного шифрования.

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

Последние несколько дней я потратил на поиски решений и способов их решения. Тем не менее, это, кажется, очень специфический случай, с которым не сталкивались многие люди. Все библиотеки, которые я смог найти, используют сокеты. И все, что я мог найти о сокетах для iOS, это IP-сеть, а не Bluetooth.

У кого-нибудь есть опыт работы с этим видом связи Bluetooth? Или какие-то другие предложения? Может быть, какое-то очевидное решение, которое я пропускаю?

Спасибо :)

Вся основа в TLS основывается на доверии, то есть сертификатах, центрах сертификации и цепочках сертификации, а также проверке подлинности всех отправленных и полученных данных. Можно сказать, что вся безопасность зависит от аутентификации. Само шифрование довольно простое. Один вопрос, на который вы должны ответить:

Должна ли быть возможность подключения к периферийным устройствам, которые имитируют ваш протокол, то есть к периферийным устройствам, НЕ произведенным вами? Если нет, в вашем помещении у вас должен быть какой-то (уникальный) секрет в каждом периферийном устройстве, например, закрытый ключ. Соответствующий открытый ключ может быть подписан вашим собственным центром сертификации. Открытый ключ CA может быть включен в ваше приложение для смартфона (поэтому вам нужен только один ключ в вашем приложении, а не один для всех периферийных устройств). Таким образом, вы можете проверить, что периферийное устройство, к которому вы подключаетесь, изготовлено вашей компанией. Этот открытый ключ также должен быть идентификатор периферийного устройства. Если у вас нет пары секретного / открытого ключа внутри периферийного устройства, и вы не можете выполнить сравнение паролей и не имеете общего симметричного ключа, насколько я знаю, невозможно избежать атак «человек посередине».

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

Имея это в виду, у вас есть три основных варианта:

Попробуйте модифицировать какое-либо существующее программное обеспечение сервера TLS, например mbedtls, для отправки всех пакетов через BLE, а не через сокеты. У меня есть ощущение, что это может быть нетривиально, потому что кажется, что оно основано на концепции блокирования сокетов.Просто прочитайте спецификацию TLS на<https://tools.ietf.org/html/rfc5246> и внедрить минимальный сервер TLS с только необходимыми функциями. На самом деле это не так сложно, как может показаться в первую очередь, если вы выполняете только минимальную реализацию и используете существующие строительные блоки, такие как код синтаксического анализа сертификатов RSA, AES, SHA-2, ECDHE, X.509 (вы можете найти их здесь:<https://tls.mbed.org/source-code>).Извлеките важные части в TLS и создайте упрощенный протокол без всех параметров согласования (поскольку они могут быть жестко заданы). Например, вам не нужно отправлять и иметь возможность анализировать все виды сообщений (например, ClientHello), обрабатывать фрагментацию и т. Д. Просто отправляйте случайные значения, сертификаты, подписанные данные, зашифрованные данные напрямую.