Есть ли способ выполнить сопряжение без соединения с помощью связи BLE GATT на Android/iOS?

Рад встрече.

В настоящее время я пытаюсь подключиться к устройству BLE, которое будет сопряжено с JustWorks.

Целевое устройство BLE не имеет монитора или клавиатуры для подтверждения или ввода PIN-кода, поэтому единственный способ шифрования между соединениями GATT — использовать JustWorks.

На данный момент особенностью этого BLE-устройства является то, что оно отбрасывает ключ, обмененный в одном соединении, без сохранения (бондинга). Причина этого в том, что это устройство BLE не может постоянно хранить ключ из-за нехватки памяти. Дизайнер, вероятно, подумал, что лучше отказаться от ключа, поскольку многие устройства Android/iOS будут запрашивать сопряжение.

По этой причине я хотел бы также зашифровать (связать) с JusWorks на стороне приложения, но не сохранять (связывать) ключ. Можно ли это обработать и на уровне кода на стороне приложения?

На данный момент мой код Android реализует следующий код.

GattManager.java

// GATT communication start processing
public void startConnection(GattPayload gattPayload) {
    // (omission)  Check Permissions
    String deviceAddress = gattPayload.getDeviceAddress();
       this.gattPayload = gattPayload;
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    try {
       BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(gattPayload.getDeviceAddress());
       bluetoothGatt = bluetoothDevice.connectGatt(context, false, gattCallback);
       registerPairingResultReceiver(context);
    } catch (IllegalArgumentException exception) {
       //(omission)
    }
}


// GATT communication callback
BluetoothGattCallback gattCallback = new BluetoothGattCallback() {

    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
       super.onConnectionStateChange(gatt, status, newState);
       // (omission) Check Permissions

       if (newState == BluetoothProfile.STATE_CONNECTED) {
          BluetoothDevice device = gatt.getDevice();
          boolean result = device.createBond();
          if (!result){
             //Paired or error
             gatt.discoverServices();
          }

       } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
          disconnect();
       }
    }

    // (omission)
};

PairingResultReceiver.java

public class PairingResultReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);

            switch (state) {
                case BluetoothDevice.BOND_BONDED:
                    // Processing when pairing is successful
                    MyApplication.gattManager.serviceDiscover();
                    break;
                case BluetoothDevice.BOND_NONE:
                    // Processing when pairing fails or is canceled
                    break;
                case BluetoothDevice.BOND_BONDING:
                    // Processing during pairing process
                    break;
            }
        }
    }
}

Я кратко объясню процесс. Сначала я подключаюсь с помощью метода connectGatt(), а затем вызываю метод createBond() после успешного завершения соединения. Затем приемник вещания получает информацию о том, что пользователь разрешил сопряжение, и переходит к следующему процессу GATT. Если пользователь отклоняет сопряжение, процесс переходит к отключению. Хотя язык разработки и способ получения информации о том, возможно ли сопряжение на iOS, разные, хотелось бы иметь аналогичную спецификацию.

После обработки метода createBond() на экране устройства Android отображается локальное уведомление с надписью «Вы хотите выполнить сопряжение с этим устройством? Да/Нет». Если пользователь (я) нажимает ДА, сопряжение завершается, и последующие процессы проходят без проблем. Затем я подтвердил соединение, отобразив список сопряжений из приложения настроек устройства Android, и увидел, что отображается имя целевого устройства. Это означает, что сопряжение и соединение выполняются только с помощью этого кода.

Моя просьба — использовать только пару без привязки в JustWorks. Причина в том, что существует вероятность того, что с этим продуктом будут сопряжены сотни устройств BLE. Если подключены сотни устройств, пользователю, очевидно, будет сложно вручную удалять и управлять информацией о соединении каждый раз. Однако если выполняется только метод createBond(), спаривание и связывание обрабатываются автоматически, и я не знаю, как избежать связывания и использовать только спаривание.

На основании вышеизложенного хотелось бы задать вопрос.

[Q1] Разве Android (или iOS) не поддерживает сопряжение без соединения?

[Q2] Если нет, то почему?

[Q3] Расскажите, пожалуйста, о рекомендуемой схеме безопасной связи GATT с использованием шифрования для этого требования.

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

Если содержание вопроса не соответствует категории, не могли бы вы порекомендовать мне контактное лицо?

0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если сопряжение вызывает у вас столько проблем, рассматривали ли вы вместо этого возможность общения в незашифрованном виде? Обратите внимание, что вам не обязательно выполнять сопряжение для связи через BLE. В любом случае Just Works не является надежным методом, поскольку он не защищен от MITM-атак. Если вам действительно необходимо шифрование, вы можете добавить в приложение свой собственный уровень безопасности, используя Диффи-Хеллмана в качестве обмена ключами, чтобы получить тот же уровень безопасности.

Если вы все еще хотите использовать стандартное сопряжение BLE, то библиотеки iOS и Android практически не предлагают API-интерфейсы для настройки сопряжения и безопасности, поэтому вам придется выполнить настройку с другой стороны.

В стандарте BLE есть функция, позволяющая установить «флаг соединения» пакета ответа на соединение в протоколе диспетчера безопасности на 0. В этом случае не должно выполняться соединение, а только соединение, поэтому никакие ключи не должны храниться. Если вы сделаете это, вам также следует установить нули для всех ключевых битов (IRK, CSRK, LTK) в том же пакете. Если Android и iOS соответствуют спецификации BLE, в этом случае в списке связей не должно появиться ни одной записи об устройстве. Примечание. Обязательно включите LE Secure Connections, поскольку соединение Legacy Just Works можно легко расшифровать с помощью анализатора BLE.

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