蓝牙安全管理(SM:Security Manager)规范详解

总述

配对(Pairing)分为三个阶段,前两个阶段是必须的,而第三阶段是可选的,三个阶段如下:

阶段1:配对功能交换(Pairing Feature Exchange)

阶段2(LE传统配对 LE legacy pairing):短期密钥(STK:Short Term Key)生成

阶段2(LE安全连接 LE Secure Connections,也叫LESC):长期密钥(LTK:Long Term Key)生成

阶段3:分发特定密钥的传输(Transport Specific Key Distribution)

可以看到阶段2分为两种:一种是LE传统配对,或者叫做LE遗留配对,它为了兼容低功耗蓝牙以前的配对而存在。另一种是蓝牙4.2新引入的LE安全连接,它安全性会更高。

这三个阶段的流程如下图所示:

上述流程可以很清晰的看出来每个阶段做的事:

阶段1两个设备交换身份验证要求和IO(Input Output输入输出)能力,随后阶段2会根据这些能力决定使用以下哪种协议生成密钥:

1.Just Works

2.Numeric Comparison (仅在LESC中可用)

3.Passkey Entry

4.Out Of Band (OOB)

从阶段1交换的信息中还会确定是使用LE传统配对还是LESC。 阶段3只有在以下三种情况时才可选:

1.阶段2选择了LE传统配对,生成了STK

2.阶段2选择了LESC,生成了LTK

3.使用BR/EDR配对,生成了共享链路密钥

注意:阶段1和阶段2可以在加密链路上执行,也可以在不加密链路上执行!

阶段1:配对功能交换

阶段1的配对功能交换主要用于交换一下信息:

1.输入输出能力(IO capabilities)

2.oob认证数据是否可用(OOB authentication data availability)

3.认证要求(authentication requirements)

4.密钥大小要求(key size requirements)

5.要被传输的分发密钥(包括自己和对方的)

其中1、2、3被用作选择阶段2使用哪种密钥生成方法的条件。5则决定了阶段3会分发哪些密钥。选择LE传统配对的密钥生成方法的话,一定会生成两个密钥:TK(Temporary Key,临时密钥)和STK(Short Term Key,短期密钥)。TK用于配对过程中加密,这个过程中会再生成STK。而STK用于配对后的加密连接。

选择LESC的密钥生成方法的话则一定会生成LTK(Long Term Key,长期密钥),用于配对后以及再次连接时加密连接。

实际空中交互的数据包如下:

输入输出能力

输入能力被分为三种:

1.No input:没有输入能力

2.Yes/No:有输入是或者否的能力,比如两个按键,一个是“是”,一个是“否”,或者更简单只有一个按键,按下就是“是”,超过一定时间没按下就认为是“否”。

3.Keyboard:设备可以输入数字0~9和确认。还应该有上述Yes/No的能力。

注意:能力3包含了能力2。

输出能力被分为两种:

1.No output:设备没有显示或者交流6位10进制数字的能力

2.Numeric output:设备具有显示或者交流6位10进制数字的能力

根据输入输出组合,IO能力分为以下六种:

注意,因为没有一个算法可以给输入是Yes/No,输出是No output所使用,所以这种类型也是 NoInputNoOutput  。

实际空中交互的数据包中,数值定义如下:

带外认证数据 

LE传统配对中,两个配对的设备都必须有对方的oob数据,才会选择oob方式。

LESC配对中,两个配对的设备只要其中一个有对方的oob数据,就选择oob方式。

实际空中数据包数值如下:

认证要求

空中报文包含如下参数:

Bonding_Flags:是否绑定标志

MITM:是否启用中间人保护标志

SC:是否支持安全连接标志

Keypress:是否启用密钥输入标志,只在Passkey Entry协议中有效

CT2:是否支持h7函数标志

密钥大小要求

每个设备都有两个参数:最大密钥长度和最小密钥长度。它们的范围都在7~16个字节以内。发起设备和响应设备的最大密钥长度中较小的那个作为协商出来的密钥长度。协商得到的密钥长度不能小于自己支持的最小密钥长度,否则应该发送"Encryption Key Size"作为配对失败的错误码。

如果密钥小于16字节,优先屏蔽高位。

分发密钥

有以下密钥可以选择分发:

IRK(Identity Resolving Key)身份解析密钥

CSRK(Connection Signature Resolving Key)连接签名解析密钥

LTK长期密钥

EDIV(Encrypted Diversifier)加密分流器

Rand随机值

阶段2:LE传统配对

前面已经说过,阶段1的参数会影响阶段2如何选择密钥生成协议,在LE传统配对中关系如下:

上图总结一下就是:

只有当两个设备的oob flag都置位时,才选择使用oob配对。否则就看MITM置位没有,如果都没有置位,那就选择Just Works,否则就根据IO能力判断使用哪种。根据IO能力判断的方法如下:

 从上图可以看出来需要综合发起设备和响应设备的IO能力确定最终选择的协议。

LE传统配对支持3种协议:

Just Works、Passkey Entry、OOB

LE传统配对--Just Works

该方式在配对过程中没有机密性可言,只要存在窃听者或中间人就可能让后续加密失效。选择该方式时,TK固定为0。

LE传统配对--Passkey Entry

对于此方式来说,最少需要一方能输入10进制数字,另一方能显示6位10进制数字,这样可以一方显示,另一方把显示的数字输入进去。或者两方都可以输入数字,此时两方都输入相同的数字。当然最好是两方都既可以显示也可以输入。如果两方都只能显示,在LE传统配对中是不行的。

如果输入的6位10进制数字是 019655 ,则实际TK=0x00000000000000000000000000004Cc7

注意,密钥输入协议提供对MITM攻击的保护,但是0~999999的数字,中间人任选一个,都有0.000001的概率猜对。

LE传统配对--OOB

oob长度为16位,所以理论上能提供比Passkey Entry更高的安全性。但是前提是带外传输的数据不能被中间人截取,所以安全性完全取决于oob的方式。

oob协议中,TK的值就是oob的那16个字节。

阶段2:LESC配对

和LE传统配对不同,它选择密钥生成方式的方法如下:

可以看到最明显的区别是,只要任意一方有oob,就可以使用oob。

LESC配对--公钥交换

LE安全配对的第一步是交换公钥。两个设备都先选择一个随机数作为私钥SKa、SKb,然后用算法生成对应的公钥PKa、PKb。然后发起设备和响应设备交换公钥,然后各自用自己的私钥和对方的公钥生成密钥DHKey,注意两边生成的DHKey相等。如下图所示:

这一步假如有人中间截获了PKa和PKb,无法求出DHKey。 

LESC配对--Just Work 和 Numeric Comparison

Just Work的关联模型和Numeric Comparison(数字比较)共用一个。整体流程如下:

首先在第一步两边交换了公钥,所以设备A和设备B都有PKb和PKa了,然后两个设备都再各自选择一个随机数分别是Na和Nb。响应设备通过函数f4以及参数PKb、PKa、Nb计算出Cb,然后把Cb发给设备A,然后两个设备再交换Na、Nb。同时设备A检查Cb是否正确,如果不正确,则配对终止,否则设备A计算Va,并显示在显示屏上。与此同时,设备B在发送完Nb后就可以计算Vb并显示了,这时候就需要人参与了,如果两个设备上显示的数字相同,则在两个设备上点击确认,继续下面的流程。Just Works因为没有显示,所以不会执行7a、7b,也没有Va,Vb需要显示,自然也不需要人参与判断是否继续配对。

假如存在中间人拦截并篡改数据,有0.999999的概率导致配对双方显示不同数字,从而配对失败。

LESC配对--Passkey Entry

其实看得懂上一节的图,这一节的图大同小异。首先人参与输入数字,在设备A和B上分别输入相同的数字,或者一方显示,另一方输入,两个设备得到两个相等的数字ra=rb。然后实现以下过程:

//因为ra/rb最大为999999,20位,所以每次取一位需要取20次
for(int i=0;i<20;++i)
{
    /*设备A上实现:*/
    //每次循环都会重新生成Na/Nb
    Na = rand();
    //每次计算取ra/rb的一位参与计算
    Ca = f4(PKa,PKb,Na,ra&(1<<i));
    /*设备B上实现:*/
    Nb = rand();
    Cb = f4(PKa,PKb,Nb,ra&(1<<i));
    /*都生成后,设备A/B互换Ca和Cb*/
}

每次生成的Ca和Cb都会互相发送给对方,让对方检查,如果失败就直接退出配对。

LESC配对--OOB

上图流程为:

设备A和设备B分别选择一个随机数ra和rb,然后用函数f4计算出Ca和Cb。通过带外的方式(比如串口)交换两个设备的地址A、B和ra、rb、Ca、Cb。双方拿到对方的数据后检测,如果成功,再各自选取一个随机数Na、Nb交换。

LESC配对--长期密钥推导

文章推荐:

低功耗蓝牙配对绑定解读和实践

【精选】BLE安全之SM剖析(2)_ble just work_物联网布道师的博客-CSDN博客

BLE安全机制从入门到放弃 | Jayden's Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126096.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python大数据笔记_day04_Hadoop】

分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…

为什么推荐从Linux开始了解IT技术

IT是什么&#xff0c;是干什么的呢&#xff1f; 说起物联网&#xff0c;云计算&#xff0c;大数据&#xff0c;或许大家听过。但是&#xff0c;你知道&#xff0c;像云计算的底层基座是什么呢&#xff1f;就是我们现在说的Linux操作系统。而云计算就是跑在Linux操作系统上的一个…

商越科技:渗透测试保障平台安全,推动线上采购高效运转

商越科技是数字化采购解决方案提供商&#xff0c;在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台&#xff0c;帮助企业实现采购数字化以及智能化转型&#xff0c;提高工作效率、降低采购成本。 打造数字…

自建网盘平台搭建(源码+教程)

为什么要自己搭建网盘&#xff0c;现在许多大厂的网盘&#xff0c;文件都添加了许多限制&#xff0c;有好多文件会遭到和谐&#xff0c;而且大部分网盘也都会限速&#xff0c;不开通VIP是很难用的&#xff01;这是一套可以运营的网盘&#xff0c;代码无加密可以进行二次开发。下…

【java】【MyBatisPlus】【四】【完】MyBatisPlus一些实战总结(枚举、翻页、sql、组合条件、自增主键、逻辑删除)

目录 一、枚举 1、数据库type字段是Integer 类型枚举 2、创建一个该字段的枚举类 TypeEnum 3、修改实体类 4、配置文件新增mybatis-plus的配置 5、检验&#xff1a; 5.1 查询显示 5.3 库里验证 二、自增主键不是id字段处理 三、逻辑删除字段不是delete字段处理 1、实…

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子 文章目录 [动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结 LCR 091. 粉刷房子 题目解析 (1) 一排房子&#xff0c;共有n个 (2) 染…

在任何机器人上实施 ROS 导航堆栈的指南

文章目录 路径规划参考 路径规划 路径规划是导航的最终目标。这允许用户向机器人给出目标姿势&#xff0c;并让它在给定的环境中自主地从当前位置导航到目标位置。这是我们迄今为止所做的一切&#xff08;地图绘制和本地化&#xff09;的汇集点。ROS 导航堆栈已经为我们完成了…

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…

Docker两个容器互相请求接口

BEGIN 环境&#xff1a;Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络&#xff0c;包括其ID、名称、驱动以及作用范围 在 Docker 中&#xff0c;容器通过 Docker 网络进行相互通信&#xff1b;在 Docker 中有…

第二十七章 解读Transformer_车道线检测中的Transformer(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 SE简单实现 class SELayer(nn.Module):d…

Invalid bound statement (not found)

说明&#xff1a;记录一次Mapper.xml调用数据库存储过程的错误&#xff1b; 报错信息&#xff1a;Invalid bound statement (not found)&#xff0c;Mapper的全限定类名 场景&#xff1a;我仔仔细细核对过了方法名&#xff0c;参数&#xff0c;都没有问题&#xff0c;使用插件…

基于 HarmonyOS 的 HTTPS 请求过程开发示例(ArkTS)

介绍 本篇 Codelab 基于网络模块以及 Webview 实现一次 HTTPS 请求&#xff0c;并对其过程进行抓包分析。效果如图所示&#xff1a; 相关概念 ● Webview&#xff1a;提供 Web 控制能力&#xff0c;Web 组件提供网页显示能力。 ● HTTP数据请求&#xff1a;网络管理模块&am…

开发知识点-Django

Django 1 了解简介2 Django项目结构3 url 地址 和视图函数4 路由配置5 请求及响应6 GET请求和POST请求查询字符串 7 Django设计模式及模板层8 模板层-变量和标签9 模板层-过滤器和继承继承 重写 10 url反向解析11 静态文件12 Django 应用及分布式路由创建之后 注册 一下 13 模型…

力扣每日一题 ---- 2905. 找出满足差值条件的下标 II

这道题带有绝对值差的题&#xff0c;一看就是双指针的题&#xff0c;并且还带有两个限制&#xff0c;那么我们的做法就是 固定一个条件&#xff0c;维护一个条件 本题还用到了一个贪心思路&#xff0c;会介绍到 那我们怎么固定一个条件&#xff0c;维护一个条件&#xff1f; …

基于ssm的大学生社团管理系统

基于ssm的大学生社团管理系统 摘要 基于SSM的大学生社团管理系统是一个全面、高效的社团管理平台&#xff0c;旨在帮助大学生和社团管理员更方便、更快捷地进行社团活动的组织和管理。该系统基于Spring、SpringMVC和MyBatis&#xff08;简称SSM&#xff09;开发&#xff0c;这三…

CentOS Linux 系统镜像

CentOS Linux具有以下特点&#xff1a; 稳定性&#xff1a;CentOS Linux旨在提供一个稳定、可靠的服务器环境&#xff0c;适合用于关键业务应用和生产环境。高效性&#xff1a;CentOS Linux经过优化和调整&#xff0c;可以充分发挥硬件的性能&#xff0c;提高系统的整体效率。…

selenium自动化测试入门 —— 键盘鼠标事件ActionChains

在使用 Selenium WebDriver 做自动化测试的时候&#xff0c;会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作&#xff1b;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中&#xff0c;有一个专门的类来负责实现这些测试场…

DevChat:提升编程效率的AI编程助手

一、DevChat是什么&#xff1f; DevChat是一个集成了多种主流大模型的AI编程工具&#xff0c;专注于提升程序员的编程效率。它整合了ChatGPT、Codex等热门AI大模型&#xff0c;支持自然语言编程、代码编写、代码生成、代码补全等功能。DevChat最大的优势是一站式服务&#xff…

掌握未来技术趋势:深度学习与量子计算的融合

掌握未来技术趋势&#xff1a;深度学习与量子计算的融合 摘要&#xff1a;本博客将探讨深度学习与量子计算融合的未来趋势&#xff0c;分析这两大技术领域结合带来的潜力和挑战。通过具体案例和技术细节&#xff0c;我们将一睹这两大技术在人工智能、药物研发和金融科技等领域…

【HarmonyOS】HarmonyOS Test测试用例中一些断言API的使用

【关键词】 单元测试框架、HarmonyOS Test、assertThrowError、assertFail、assertEqual 【测试代码及测试结果展示】 这里以新建API9工程自动生成的ohosTest来编写单元测试代码。 1、 测试代码&#xff1a; import { describe, it, expect } from ohos/hypium import abil…