【BLE】四.SMP安全配对详解

2024-09-02 07:20
文章标签 详解 安全 配对 ble smp

本文主要是介绍【BLE】四.SMP安全配对详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设备配对流程

在这里插入图片描述

SMP专业术语

  • Paring(配对):
    配对能力交换,设备认证,密钥生成,连接加密以及机密信息分发等
    过程

  • Bonding(绑定)
    配对中会生成一个长期密钥(LTK,long-term Key),双方把LTK存储在Flash,那么这两个设备再次重连就可跳过配对流程,且直接使用LTK对蓝牙连接进行加密;
    不存储LTK(不分发LTK),paring完成后连接也是加密的,但重连需再次进行paring流程,否则两者还是明文通信;
    在不引起误解的情况下,我们经常把paring当成paring和bonding两者的组合,因为只paring不bonding的应用情况非常少见,下文就不区分paring和bonding的区别。

  • SM(security manager):
    蓝牙协议栈的安全管理层,包括paring,bonding,以及SMP。

  • SMP(security manager protocol)
    安全管理协议,两个设备之间的蓝牙交互命令序列,对paring的空中包进行了严格时序规定

  • MITM(man in the middle):
    A和B通信过程中,C会插入进来以模拟A或者B,并且具备截获和篡改A和B之间所有通信报文的能力;若需要具备MITM保护能力,通过认证实现,分别为:OOB认证信息,passkey以及numeric comparison。

  • OOB(out of band,带外认证):
    不通过蓝牙射频本身来交互,而是-通过如人眼,NFC,UART等带外方式来交互配对信息。

  • Passkey(pin码):
    用户在键盘中输入的6位数字,以达到认证设备的目的。

  • Numeric comparison(数字比较):
    跟passkey一样,也是用来认证设备的6位数字,显示在显示器上。如下:
    在这里插入图片描述

  • IO capabilities(输入输出能力):
    是否有键盘,是否有显示器。

  • IRK(Identity Resolving Key,蓝牙设备地址解析密钥):
    可解析的随机地址,比如iPhone手机,由于其地址随着时间会变化IRK通过解析变化的地址的规律,从而确定这些地址是否来自同一个设备,即IRK可以用来识别蓝牙设备身份;
    IRK一般由设备出厂时按照一定要求自动生成

  • Identity Address(设备唯一地址):
    包括publicrandom staticprivate resolvablerandom unresolved共四类;
    设备不支持privacy,那么identity address就等于public或者random static设备地址;。如果设备支持privacy,即使用private resolvable蓝牙设备地址,在这种情况下,虽然其地址每隔一段时间会变化一次,但是identity address仍然保持不变,其取值还是等于内在的public或者random static设备地址。
    Identity Address和IRK都可以用来唯一标识一个蓝牙设备。

  • TK(Temporary Key,临时密钥)

  • STK(short term key,短期密钥)

  • LTK(long term key,长期密钥)

IO能力

在这里插入图片描述

配对方式

在这里插入图片描述

只要有一端支持OOB,即使用OOB验证配对;只有都不支持才执行中间人(MITM)设置,即看两端是否有其一是支持使用IO功能的,支持就使用IO功能验证配对,如下所示:

IO功能选择

例如手机端作为发起端,一般都是“Keyboard Only”与“KeyBoard Display”,如下所示:
在这里插入图片描述
其中的无认证:
在这里插入图片描述

示例工程:

在这里插入图片描述

SMP相关初始化

  • 初始化流程:
    在这里插入图片描述

  • 设置安全配置参数:
    在这里插入图片描述

  • 服务端GATT回调:
    在这里插入图片描述

  • 服务端GAP回调:
    在这里插入图片描述

  • 客户端GAP回调:
    在这里插入图片描述

安全配置参数的代码片段

  • GATTS:
    /* set the security iocap & auth_req & key size & init key response key parameters to the stack*///	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_NO_BOND;			//未启用绑定
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_BOND;				//启用绑定
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_MITM;			//开启MITM保护
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_ONLY;		//未启用绑定的安全连接
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_BOND;		//启用绑定后的安全连接esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_MITM;		//使用MITM保护和未启用连接的安全连接
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_MITM_BOND;	//安全连接,启用MITM保护和连接//  esp_ble_io_cap_t iocap = ESP_IO_CAP_NONE;           //NoInputNoOutputesp_ble_io_cap_t iocap = ESP_IO_CAP_KBDISP;			//Keyboard display
//	esp_ble_io_cap_t iocap = ESP_IO_CAP_IO;				//DisplayYesNo
//	esp_ble_io_cap_t iocap = ESP_IO_CAP_OUT;			//DisplayOnly
//	esp_ble_io_cap_t iocap = ESP_IO_CAP_IN;				//KeyboardOnlyuint8_t key_size = 16;      //the key size should be 7~16 bytesuint8_t init_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK;  //即LTKuint8_t rsp_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK;  //即IRK//set static passkeyuint32_t passkey = 123456;uint8_t auth_option = ESP_BLE_ONLY_ACCEPT_SPECIFIED_AUTH_DISABLE;
//	uint8_t auth_option = ESP_BLE_ONLY_ACCEPT_SPECIFIED_AUTH_ENABLE;			//必须绑定才能开启uint8_t oob_support = ESP_BLE_OOB_DISABLE;			//关闭OOB
//	uint8_t oob_support = ESP_BLE_OOB_ENABLE;			//开启OOBesp_ble_gap_set_security_param(ESP_BLE_SM_SET_STATIC_PASSKEY, &passkey, sizeof(uint32_t));esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &auth_req, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &iocap, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &key_size, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_ONLY_ACCEPT_SPECIFIED_SEC_AUTH, &auth_option, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_OOB_SUPPORT, &oob_support, sizeof(uint8_t));/* If your BLE device acts as a Slave, the init_key means you hope which types of key of the master should distribute to you,and the response key means which key you can distribute to the master;If your BLE device acts as a master, the response key means you hope which types of key of the slave should distribute to you,and the init key means which key you can distribute to the slave. */esp_ble_gap_set_security_param(ESP_BLE_SM_SET_INIT_KEY, &init_key, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_SET_RSP_KEY, &rsp_key, sizeof(uint8_t));
  • GATTC:
    /* set the security iocap & auth_req & key size & init key response key parameters to the stack*///	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_NO_BOND;			//未启用绑定
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_BOND;				//启用绑定
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_MITM;			//开启MITM保护
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_ONLY;		//未启用绑定的安全连接
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_BOND;		//启用绑定后的安全连接esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_MITM;		//使用MITM保护和未启用连接的安全连接
//	esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_MITM_BOND;	//安全连接,启用MITM保护和连接//  esp_ble_io_cap_t iocap = ESP_IO_CAP_NONE;           //NoInputNoOutputesp_ble_io_cap_t iocap = ESP_IO_CAP_KBDISP;			//Keyboard display
//	esp_ble_io_cap_t iocap = ESP_IO_CAP_IO;				//DisplayYesNo
//	esp_ble_io_cap_t iocap = ESP_IO_CAP_OUT;			//DisplayOnly
//	esp_ble_io_cap_t iocap = ESP_IO_CAP_IN;				//KeyboardOnlyuint8_t key_size = 16;      //the key size should be 7~16 bytesuint8_t init_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK;uint8_t rsp_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK;
//    uint8_t oob_support = ESP_BLE_OOB_DISABLE;		//关闭OOBuint8_t oob_support = ESP_BLE_OOB_ENABLE;			//开启OOBesp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &auth_req, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &iocap, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &key_size, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_OOB_SUPPORT, &oob_support, sizeof(uint8_t));/* If your BLE device act as a Slave, the init_key means you hope which types of key of the master should distribute to you,and the response key means which key you can distribute to the Master;If your BLE device act as a master, the response key means you hope which types of key of the slave should distribute to you,and the init key means which key you can distribute to the slave. */esp_ble_gap_set_security_param(ESP_BLE_SM_SET_INIT_KEY, &init_key, sizeof(uint8_t));esp_ble_gap_set_security_param(ESP_BLE_SM_SET_RSP_KEY, &rsp_key, sizeof(uint8_t));

这篇关于【BLE】四.SMP安全配对详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129355

相关文章

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字