NXP QN9080 BLE 安全机制之白名单

概述

想要 BLE 从机设备做到“只允许指定设备扫描连接”,可以通过隐私机制、白名单、或定向广播来实现,本篇我们主要来讲解白名单的概念和作用、以及区别。
白名单(White List)是 BLE 协议中最简单、直白的一种安全机制。所谓的白名单,就是一组蓝牙地址。广播设备可以使用白名单来过滤某些设备的扫描请求或者连接请求。通过白名单,可以只允许特定的蓝牙设备(白名单中列出的)扫描(Scan)、连接(Connect)我们的设备,也可以只扫描、连接特定的蓝牙设备(白名单中列出的)。

 

环境搭建

2.1 SDK 下载

本文基于 NXP QN9080 IC,SDK 可在 NXP 官网 https://mcuxpresso.nxp.com/ 中下载。

2.2 硬件

本文基于 NXP QN9080 DK 板进行开发,DK 板如图一所示:


图一

2.3 开发软件

SDK 支持 IAR、Keil、MCUXpresso IDE 三种开发软件,本文以 MCUXpresso IDE 为开发环境作为介绍。

 

结合代码分析

3.1 SDK 配置

先从 MCUXpresso IDE 中下载 QN9080 最新版本的 SDK (SDK_2.2.5),如图二所示。SDK 下载方式可从本博主之前的博文中了解,在此不多讲解。首先我们打开蓝牙例程qn908xcdk_wireless_examples_bluetooth_hid_device_freertos,该例程可在蓝牙模式下实现鼠标画框功能。如果需要与电脑进行配对,需要开启配对的宏,在 app_preinclude.h 中可将 gAppUsePairing_d 宏设置为 1,通常我们会把绑定的宏 gAppUseBonding_d 也打开。


图二

白名单其实就是一个对端蓝牙地址列表,在 NXP QN9080 芯片上,可以通过相应的 API 写入到 LL 层。在 qn_ble_config.h 中我们可以查看到白名单的最大设备数目宏为 CFG_BLE_WHITELIST_MAX = 26,由于芯片硬件设计原因,固定了白名单最大为 26 个。


图三

3.2 白名单与绑定概念区别

假设某公司员工 Tony 买了一个联想 M600 鼠标,第一件事是将鼠标和电脑进行配对绑定(Pairring & Bonding),目的是将鼠标和电脑关联起来,将电脑添加进鼠标的白名单(White List),以后白名单以外的电脑都无法与鼠标设备建立连接,白名单相当于一个过滤器(Filter)。白名单列表是在广播或扫描时作为对应过滤策略用的,简单说,如果做为从机,在开始广播策略时,只有白名单里的设备才可以与其连接。作为主机时,开启扫描过滤策略,则只有扫描到白名单里的设备才会进行连接。

绑定真正来说属于通用访问规范的讨论范畴,然而,此刻也不妨考虑一下它的操作。绑定指的无非是将密钥及相关身份信息保存到安全数据库当中。如果设备不保存这些值,他们虽能匹配,但却不能绑定。只要当中某一个设备不保存,例重新连接后,只有一个设备拥有 LTK,因此加密的启动将会失败。为了避免这种情况,两个设备在最初配对时就会交换绑定信息,从而能够清楚地知道对方是否保留了该绑定信息。如果对方设备不保存信息,那么一旦启动加密的尝试失败,主机将试图再次配对。绑定设备,是在使能配对绑定功能后,成功绑定设备时将BLE设备将对方的地址,连接密钥交存储在 FLASH 里,在下次连接的时候,就不用再进行配对过程,直接使用存储的密钥对 LL 层进行加密,数据通信。因此,这两者之间是没有什么关系的。

3.3 白名单使用说明

在 NXP QN9080 的蓝牙 HID 例程中,上电初始化时,会把绑定过的设备写入到白名单,这只是为了实现一个功能:在上电的时候先执行过滤性广播。即优先让绑定过的设备与自己进行连接,如果超过一定时间,没有被白名单里的设备连接,则认为附近没有白名单里的设备,则进行无过滤性广播,即任何设备都能与其进行连接。在 HID 设备的例子中,当初始化 BLE 堆栈时,BleConnManager_GapCommonConfig 将在 BleApp_Config 中被调用。 绑定信息将由Gap_GetBondedDevicesIdentityInformation 从 FLASH 中读取,并写入白名单寄存器。 此外,新绑定的设备配对成功后也会被注册到白名单中。

在 app_config.c 中,可以对默认广播参数进行修改,这个值能在运行时更改,与 Profile 文件要求保持一致。红框中的参数为广播过滤 Policy 值, SDK 默认值是接受所有的连接和扫描请求,我们可以根据需求进行修改,可设置四种方式,以上为一种,其余为:接受所有的连接请求,但只扫描来自白名单中的设备的请求。接受所有的扫描请求,但只连接白名单中的设备的请求。只有在白名单的从设备的连接和扫描请求才接受。


图四


图五

这与广播方式无关,只有开始了广播 Policy 才会用到白名单,这可以实现一定的隐私性。
在 app_preinclude.h 中有最大绑定设备数量的宏,默认设置为 16 台。


图六

假设绑定最大设备数量设为 16 台,那么如果出现第 17 台新设备去配对绑定,此时,这第 17 台电脑对于鼠标设备来说,是一台新设备,应该不能保存成功配对信息。在代码中有相应的判断条件,一旦设备超过 16 台,是不能满足条件的,无法进行到下一步的配对绑定操作。


图七

上面的注释中,说明了绑定移除操作不会有事件触发,移除操作是同步进行的,由应用程序负责管理哪些设备被移除了,也就是说,执行移除操作后,需要由客户自己管理绑定列表空间里哪些是正在使用的,需要用户自己标记,超过 16 台,绑定操作不会自动从第一台重新开始,在写入前就判断是否超过了 16 台,写入第 17 台当然不会成功。在 gap_interface..h 中,有进行白名单和绑定设备管理的 API 函数可用,用户能够自行对这些函数进行调用分配。

假设客户的需求是需要支持 32 台配对绑定设备,QN9080 会把配对绑定的信息存储到 FLASH 当中,这个只限于 RAM 和 FLASH 大小,是能够满足需求的。但是如果客户还要支持所有绑定设备都写入到白名单,那只能最多到 26 个。

需要注意的是,修改最大绑定设备数量的宏需要考虑 FLASH 大小,需要满足下面图中的大小条件关系,来确保 FLASH 和 RAM 足够,存储的设备绑定信息仅基于 nvmIndex 进行管理。该指数可以在绑定成功后 gBondCreatedEvent_c 事件中获得,也可以随时 Gap_CheckIfBonded。


图八

 

总结

通过上面的讲解,相信大家对与白名单的安全机制有了更加清晰的了解,白名单和绑定的概念和作用时常容易弄混,在进行产品开发的同时,我们也要对蓝牙协议进行更深的学习和理解。欢迎大家多多关注我的博文~

 

参考资料

【1】低功耗蓝牙开发权威指南.pdf

【2】Core_v5.2.pdf

【3】QN908x user manual_Rev. 1.1.pdf

【4】QN908x.pdf

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论