这篇文章的英文原版可以从下面链接找到,因为其比较有用,所以我把它翻译成中文来方便中国客户阅读。感谢原作者Balazs Adamffy.
https://www.silabs.com/community/wireless/bluetooth/knowledge-base.entry.html/2016/06/13/bluetooth_smart_secu-BpM6
简介
这篇文章将会介绍在Simplicity Studio 4以及Bluetooth SDK v2.7.0下, 如何使用低功耗蓝牙(BLE)的安全相关特性,其包括配对、绑定、加密和授权。
首先,我们给出一些关于BLE安全性的一些基础信息,然后突出介绍附件的例程里的重要的代码片段。示例程序实现了一个加密传输,其特征值只能在配对和绑定完成才能被读出。
软硬件信息:
Bluetooth SDK版本 – 2.7.0
开发板 – EFR32BG13开发板,brd4104a Rev A00
BLE安全性特征
最常见的无线通讯的威胁如下:
BLE定义了5种安全特性来对抗上述威胁:
上述特征实现在BLE协议栈的不同层,参下图:
配对&绑定
配对
BLE使用Secure Simple Pairing(SSP)配对模型:
绑定
隐私
注意:随机地址尚未在Blue Gecko的协议中实现。
加密
注意:广播数据不支持加密
蓝牙4.2新加入的安全特性
示例程序
此示例程序的软硬件基础在上面已经提到,同时只需要做很少的改动,它便可以用于其他开发板,如BGM111/BGM113等。
示例程序实现了一个服务及一个特征值,其被另外设备读的前提是双方配对并绑定, 以下是完成这一任务的具体步骤:
1. 建立SoC-Empty工程,并指定其工程名称选择编译器(GCC或IAR)
2. 打开工程中的.isc文件,加入一个服务和一个特征值
Security的服务和一个叫My Secret的特征值。 因为authenticated_read属性被设为“true”,所以其只有在加密连接中才能被读出。
注意:不要忘记修改完之后,点击右上角的“Generate”按钮。
3. 使能VCOM获得串口打印
#define HAL_VCOM_ENABLE (1)
... #include "retargetserial.h" #include "stdio.h" ... void main(void) { // Initialize device initMcu(); // Initialize board initBoard(); // Initialize application initApp(); // Initialize stack gecko_init(&config); RETARGET_SerialInit(); while (1) { ...
完成如上修改后,即可使用printf()函数来获得串口打印数据了。
4. 配置、使能配对和绑定
flag参数的bit 0:
flag参数的bit 1:
flag参数的bit 2:
flag参数的bit 3:
flag的4 - 7位保留,应设为0
capabilities 参数指示设备支持的输入输出类型,不同的capabilities 参数会导致不同的配对方法。
系统启动后,调用函数gecko_cmd_sm_configure
当使用sm_io_capability_displayonly或sm_io_capability_displayyesno作为io capabilities时,PIN码会显示在UART控制台,你需要在手机或平板端输入这个PIN码。
当使用sm_io_capability_keyboardonly或sm_io_capability_keyboarddisplay作为io capabilities时,PIN码会显示在手机或平板端,你需要在设备的UART控制台输入这个PIN码。
不要使用sm_io_capability_noinputnooutput,因为MITM保护不能在此模式下工作,配对和绑定将会失败。
... case gecko_evt_system_boot_id: printf("Boot\r\n"); /* Set the pairing configuration */ gecko_cmd_sm_configure(0x0F, sm_io_capability_displayonly); /* Enable bonding */ gecko_cmd_sm_set_bondable_mode(1); ...
5. 加入配对绑定相关的事件处理
代码如下
... case gecko_evt_sm_confirm_bonding_id: gecko_cmd_sm_bonding_confirm(evt->data.evt_sm_confirm_bonding.connection, 1); printf("Bonding confirmed\r\n"); break; case gecko_evt_sm_bonded_id: printf("Bondind completed\r\n"); break; case gecko_evt_sm_bonding_failed_id: printf("Bondind failed, reason = 0x%04x\r\n", evt->data.evt_sm_bonding_failed.reason); break; case gecko_evt_sm_passkey_display_id: printf("Passkey = %06d\r\n", evt->data.evt_sm_passkey_display.passkey); break; ...
测试此例程
下载Blue Gecko app:
iOS用户可以通过App Store,安卓用户可以通过Google Play获得。同时可以通过Silicon Labs的官方网站获得。安卓用户点击此处,iOS用户点击此处。
完成如下步骤:
7.如果一切正常,你可以通过APP读取GATT的特征值,并在串口终端得到Bonding completed信息。删除手机端绑定再次 连接可以进行重复测试
低功耗蓝牙安全性 - Simplicity Studio例程
这篇文章的英文原版可以从下面链接找到,因为其比较有用,所以我把它翻译成中文来方便中国客户阅读。感谢原作者Balazs Adamffy.
https://www.silabs.com/community/wireless/bluetooth/knowledge-base.entry.html/2016/06/13/bluetooth_smart_secu-BpM6
简介
这篇文章将会介绍在Simplicity Studio 4以及Bluetooth SDK v2.7.0下, 如何使用低功耗蓝牙(BLE)的安全相关特性,其包括配对、绑定、加密和授权。
首先,我们给出一些关于BLE安全性的一些基础信息,然后突出介绍附件的例程里的重要的代码片段。示例程序实现了一个加密传输,其特征值只能在配对和绑定完成才能被读出。
软硬件信息:
Bluetooth SDK版本 – 2.7.0
开发板 – EFR32BG13开发板,brd4104a Rev A00
BLE安全性特征
最常见的无线通讯的威胁如下:
BLE定义了5种安全特性来对抗上述威胁:
上述特征实现在BLE协议栈的不同层,参下图:
配对&绑定
配对
BLE使用Secure Simple Pairing(SSP)配对模型:
绑定
隐私
注意:随机地址尚未在Blue Gecko的协议中实现。
加密
注意:广播数据不支持加密
蓝牙4.2新加入的安全特性
示例程序
此示例程序的软硬件基础在上面已经提到,同时只需要做很少的改动,它便可以用于其他开发板,如BGM111/BGM113等。
示例程序实现了一个服务及一个特征值,其被另外设备读的前提是双方配对并绑定, 以下是完成这一任务的具体步骤:
1. 建立SoC-Empty工程,并指定其工程名称选择编译器(GCC或IAR)
2. 打开工程中的.isc文件,加入一个服务和一个特征值
Security的服务和一个叫My Secret的特征值。 因为authenticated_read属性被设为“true”,所以其只有在加密连接中才能被读出。
注意:不要忘记修改完之后,点击右上角的“Generate”按钮。
3. 使能VCOM获得串口打印
完成如上修改后,即可使用printf()函数来获得串口打印数据了。
4. 配置、使能配对和绑定
flag参数的bit 0:
flag参数的bit 1:
flag参数的bit 2:
flag参数的bit 3:
flag的4 - 7位保留,应设为0
capabilities 参数指示设备支持的输入输出类型,不同的capabilities 参数会导致不同的配对方法。
系统启动后,调用函数gecko_cmd_sm_configure
当使用sm_io_capability_displayonly或sm_io_capability_displayyesno作为io capabilities时,PIN码会显示在UART控制台,你需要在手机或平板端输入这个PIN码。
当使用sm_io_capability_keyboardonly或sm_io_capability_keyboarddisplay作为io capabilities时,PIN码会显示在手机或平板端,你需要在设备的UART控制台输入这个PIN码。
不要使用sm_io_capability_noinputnooutput,因为MITM保护不能在此模式下工作,配对和绑定将会失败。
5. 加入配对绑定相关的事件处理
代码如下
测试此例程
下载Blue Gecko app:
iOS用户可以通过App Store,安卓用户可以通过Google Play获得。同时可以通过Silicon Labs的官方网站获得。安卓用户点击此处,iOS用户点击此处。
完成如下步骤:
7.如果一切正常,你可以通过APP读取GATT的特征值,并在串口终端得到Bonding completed信息。删除手机端绑定再次 连接可以进行重复测试