Рад встрече.
В настоящее время я пытаюсь подключиться к устройству 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 с использованием шифрования для этого требования.
Я не могу найти никакого связанного с этим контента, может кто-нибудь знает? Кроме того, если есть какие-либо статьи, отвечающие на этот вопрос, я был бы признателен, если бы вы мне сообщили.
Если содержание вопроса не соответствует категории, не могли бы вы порекомендовать мне контактное лицо?
Если сопряжение вызывает у вас столько проблем, рассматривали ли вы вместо этого возможность общения в незашифрованном виде? Обратите внимание, что вам не обязательно выполнять сопряжение для связи через BLE. В любом случае Just Works не является надежным методом, поскольку он не защищен от MITM-атак. Если вам действительно необходимо шифрование, вы можете добавить в приложение свой собственный уровень безопасности, используя Диффи-Хеллмана в качестве обмена ключами, чтобы получить тот же уровень безопасности.
Если вы все еще хотите использовать стандартное сопряжение BLE, то библиотеки iOS и Android практически не предлагают API-интерфейсы для настройки сопряжения и безопасности, поэтому вам придется выполнить настройку с другой стороны.
В стандарте BLE есть функция, позволяющая установить «флаг соединения» пакета ответа на соединение в протоколе диспетчера безопасности на 0. В этом случае не должно выполняться соединение, а только соединение, поэтому никакие ключи не должны храниться. Если вы сделаете это, вам также следует установить нули для всех ключевых битов (IRK, CSRK, LTK) в том же пакете. Если Android и iOS соответствуют спецификации BLE, в этом случае в списке связей не должно появиться ни одной записи об устройстве. Примечание. Обязательно включите LE Secure Connections, поскольку соединение Legacy Just Works можно легко расшифровать с помощью анализатора BLE.