Bluetooth-соединение без подтверждения пользователя

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

6 ответов

Решение

Это нужно именно поэтому createInsecureRfcommSocketToServiceRecord() был добавлен в BluetoothDevice начиная с Android 2.3.3 (API Level 10) ( SDK Docs)... до этого не было поддержки SDK для этого. Он был разработан, чтобы позволить Android подключаться к устройствам без пользовательских интерфейсов для ввода ПИН-кода (например, встроенного устройства), но он также удобен для настройки соединения между двумя устройствами без ввода пользовательского ПИН-кода.

Следственный метод listenUsingInsecureRfcommWithServiceRecord() в BluetoothAdapter используется для принятия этих типов соединений. Это не нарушение безопасности, потому что методы должны использоваться как пара. Вы не можете использовать это, чтобы просто попытаться выполнить сопряжение с любым старым устройством Bluetooth.

Вы также можете осуществлять связь на короткие расстояния по NFC, но это оборудование менее заметно на устройствах Android. Определенно выберите один, и не пытайтесь создать решение, которое использует оба.

Надеюсь, это поможет!

PS Есть также способы сделать это на многих устройствах до 2.3, используя отражение, потому что код действительно существует... но я не обязательно рекомендую это для массовых распределенных приложений. Смотрите этот Stackru.

Ну, это действительно должно быть разбито на 2 части:

  1. Можно ли выполнить сопряжение двух устройств Bluetooth, не пройдя процедуру установления связи Bluetooth? Нет, ты не можешь. Это запечатлено в протоколе, поэтому нет никакого способа обойти это.
  2. Можете ли вы выполнить рукопожатие без пользовательского интерфейса? Да, вы можете: это просто код.

Я не уверен, как вы делаете это в Windows Land, но в * nix Land есть функции, спрятанные в стеке Bluez, которые позволяют получать уведомления о появлении нового устройства и отправлять ему код сопряжения (ясно, что эти функции: это то, что использует пользовательский интерфейс). Учитывая достаточное количество времени и опыта, я уверен, что вы могли бы придумать, как написать собственную версию приложения настроек Bluetooth, которая каким-то образом:

  • Обнаружено новое устройство прибыл
  • Посмотрел MAC-адрес name/bluetooth и проверил внутреннюю базу данных на наличие кода сопряжения.
  • Отправил код сопряжения и завершил операцию

Все без необходимости всплывать пользовательский интерфейс.

Если ты пойдёшь и напишешь код, я ЛЮБЛЮ, чтобы взять его в свои руки.

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

1) Каждому приложению и самому устройству могут быть заданы режимы аутентификации "необходимость / не необходимость", поэтому часто не было необходимости в сопряжении. Например, большинство серверов OBEX (OPP) вообще не требуют никакой аутентификации, поэтому нет необходимости в сопряжении / соединении.

Предположительно, ответ "Wireless Designs" освещал этот случай.

2) Затем, если устройство / приложение потребовало сопряжения:

2.1) До v2.1 для сопряжения тогда два устройства должны были иметь соответствующие парольные фразы /PIN-коды. Так что это либо требовало участия пользователя (для ввода ПИН-кода), либо знаний в программном обеспечении, чтобы узнать ПИН-код: либо определено в приложении if pin callback send pin="1234"или смарт в ОС, такой как BlueZ и Win7 (см. слайд 20 на моем Bluetooth в Windows 7 doc), которая имеет такую ​​логику: if(remotedevice=headset) then expectedPin ="0000", Не знаю, что делает Android

2.2) В версии 2.1 было добавлено безопасное простое соединение (SSP). Что меняет сопряжение на:

if (either is pre-v2.1) then
   Legacy
else if (Out-Of-Band channel) then
   OutOfBand
else if (neither have "Man-in-the-Middle Protection Required") then
   (i.e. both have "Man-in-the-Middle Protection _Not_ Required")
   Just-Works
else
   Depending on the two devices' "IO Capabilities", either NumericComparison or Passkey.
   Passkey is used when one device has KeyboardOnly -- and the peer device _isn't_ NoInputNoOutput.
endif

Из руководства пользователя 32feet.NET BluetoothWin32Authentication, см. Также разделы SSP в [ 1]

Таким образом, для того, чтобы спаривание было беспроблемным, нужно либо JustWorks, либо Out-of-Band, например, ваше предложение NFC.

Надеюсь, это поможет...

Да, это возможно в теории, как определено в спецификации. Однако пока нет практической реализации, которая позволила бы это.

См. Техническую спецификацию передачи обслуживания форума NFC http://www.nfc-forum.org/specs/spec_list/

Цитирование из спецификации, касающейся безопасности: "Протокол передачи обслуживания требует передачи данных доступа к сети и учетных данных (данных конфигурации несущей), чтобы позволить одному устройству подключиться к беспроводной сети, предоставленной другим устройством. Из-за непосредственной близости, необходимой для связи между Устройства и метки NFC, подслушивание данных конфигурации несущей является трудным, но не невозможным без признания законным владельцем устройств. Передача данных конфигурации несущей на устройства, которые могут быть установлены в непосредственной близости, считается законной в рамках данной спецификации.".

Версия BT 2.0 или ниже - Вы должны быть в состоянии выполнить сопряжение / соединение, используя стандартный PIN-код, введенный программно, например, 1234 или 0000. Это не очень безопасно, но многие устройства BT делают это.

BT версии 2.1 или выше - Режим 4 Безопасная простая пара может быть использована модель "просто работает". Он использует эллиптическое шифрование (что бы это ни было) и является очень безопасным, но он открыт для атак Man In the Middle. По сравнению со старым подходом с пин-кодом "0000" он впереди световых лет. Это не требует ввода данных пользователем.

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

Если вы спрашиваете, можете ли вы соединить два устройства без одобрения сопряжения пользователем НИКОГДА, нет, это невозможно, это функция безопасности. Если вы подключены через Bluetooth, нет необходимости обмениваться данными через NFC, просто обменивайтесь данными по каналу Bluetooth.

Я не думаю, что вы можете обойти безопасность Bluetooth, передавая пакет аутентификации по NFC, но я могу ошибаться.

Другие вопросы по тегам