![image](https://habrastorage.org/files/408/ea7/79a/408ea779ab2a443c93e61c1166a27615.png)
BLE под микроскопом. Часть 4
Несколько слов о whitelist-е.
Так сложилось, что я на долгое время отошел от темы BLE. Но вот вернулся:-) Сегодня я хочу затронуть тему whitelist. Для чего это нужно? Если мы хотим что бы с нашим гаджетом работали только определенные телефоны, а другие не могли, тогда whitelist — это то что нам нужно.
Для того, что бы начать обсуждать эту тему придется вернуться немного назад. Для того, что бы устройства начали обмен данными, необходимо пройти процедуру присоединения. О ней я писал в предыдущих статьях. И здесь очень важно не путать понятия присоединения и спаривания. В случае присоединения, после разрыва связи, мы забываем о том с кем мы общались. В случае спаривания — мы помним о партнере. Так, к примеру, мы связываем свой телефон с bluetooth наушниками. Такие устройства теперь называются связанными (bound). Теперь при сканировании эфира, подключение к связанному прибору будет происходить без участия человека.
Зачем я обо всем этом говорю. Дело в том, что whitelist формируется из списка связанных устройств. Это первое что надо запомнить. Во-вторых, надо понимать как формируется связывание устройств. Существует два способа. Первое — по МАС-адресу, второй с использованием ключей. Почему всё так сложно? Дело в том, что сначала предполагалось связывание только по MAC-адресу. Но, при передаче пакетов через эфир, он всем виден. Из-за этого, просканировав эфир и, используя специальные программы, злоумышленник может легко подменить MAC-адрес на своем телефоне. В итоге, даже при использовании whitelist-a, он может получить доступ к вашему устройству. Что бы этого не произошло, используется ещё один метод связывания устройств — с помощью irk-ключей (Identity Resolving Key). В отличии от MAC-адреса длина ключа составляет 16 байт, и при стандартном обмене данными, в эфире они не видны. Обмен ими происходит в надежном месте, исключающем прослушивание. Кроме того, в спецификации BLE4.2 описана ещё одна особенность. Вот она дословно:
6.1 PRIVATE ADDRESS GENERATION INTERVAL
A private address shall be generated using the Resolvable Private Address Generation (see Section 1.3.2.2).The Link Layer shall set a timer determined by the Host. A new private addressshall be generated when the timer expires. If the Link Layer is reset, a new private address shall be generated and the timer started with any value in the allowed range.
Note: If the private address is generated frequently, connection establishmenttimes may be affected. It is recommended to set the timer to 15 minutes.
Если кратко, то BLE устройство может выставлять в эфир не свой публичный адрес, а частный приватный адрес, который рекомендуется менять каждые 15 минут. Поэтому запоминать их не имеет смысла. Запоминать же нужно только публичный и случайный статический адрес. В отладчике это выглядит следующим образом:
![](https://habrastorage.org/webt/v-/_l/ja/v-_lja1szt81lazwkr94ywhmclm.png)
Здесь стоит заметить, что значение счетчика addr_count на снимке слева равно 0x01, а счетчик irk_count на снимке справа равно 0x02. Дело в том, что я привязал к устройству два телефона с андроидом 4.4 (bluetooth 4.0) и андроидом 8.1 (bluetooth 4.1). Т.е. первый связывается по MAC-адресу, а второй использует уже irk-ключи. Притом телефон с андроидом 8.1 я привязал два раза. Мой девайс это не распознал и увидел их как два разных телефона.
На сайте есть неплохая статья, которая расшифровывает аббревиатуры и дает общий обзор технологии BLE. Кроме того, хочу заметить, что в тексте могут быть неточности, т.к. этой темой я занимаюсь не так много, как бы хотелось. Поэтому конструктивные замечания принимаются и приветствуются.
Печерских Владимир