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

news2024/10/6 0:32:02

总述

配对(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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里巴巴国际站为什么凉了?数字一体化方案崛起!

随着全球化和数字化的浪潮不断涌现&#xff0c;跨境电商市场一直以惊人的速度增长。中国作为主要的出口和进口市场之一&#xff0c;成为跨境贸易的重要参与者。然而&#xff0c;近年来&#xff0c;阿里巴巴国际站似乎面临了一些挑战&#xff0c;同时数字一体化方案崭露头角&…

FallO’ween 活动:元宇宙中秋天与万圣节的邂逅

秋风徐徐&#xff0c;万圣节已经来临&#xff01;还有什么比沉浸在 FallOween 的世界更好的方式来庆祝这个“恐怖“的季节呢&#xff1f;这项全新的季节性活动将于 10 月 30 日推出&#xff0c;将秋季的迷人气息与万圣节的怪异魅力融为一体&#xff0c;为大家带来为期 30 天的冒…

初识Java 17-4 反射

本笔记参考自&#xff1a; 《On Java 中文版》 接口和类型信息 interface关键字的一个重要目标就是允许程序员隔离组件&#xff0c;减少耦合。但我们可以通过类型信息来绕过接口的隔离&#xff0c;这使得接口不一定能够保证解耦。 为了演示这一实现&#xff0c;我们需要先创建一…

LabVIEW调用库函数节点无法显示DLL中的函数

LabVIEW调用库函数节点无法显示DLL中的函数 正在使用调用库函数节点来调用一个DLL文件。可是&#xff0c;当浏览该DLL时&#xff0c;却无法在Function Name下拉菜单中选择任何函数。为什么所有的DLL函数都无法选中呢&#xff1f; 解答: 调用的DLL可能是通过.NET封装的&#x…

1.77亿美元,安世被迫出售晶圆大厂NWF | 百能云芯

11月9日消息&#xff0c;安世半导体&#xff08;Nexperia&#xff09;与纽交所上市公司威世&#xff08;Vishay&#xff09;签署协议&#xff0c;作价1.77亿美元出售英国Newport Wafer Fab&#xff08;以下简称NWF&#xff09;的母公司NEPTUNE 6 LIMITED&#xff08;以下简称“…

kubectl 资源管理命令-陈述式

目录 一、kubectl陈述式资源管理&#xff1a; 二、kubectl陈述式对象管理&#xff1a; 1.基础命令使用&#xff1a; 1.1 帮助手册&#xff1a; 1.2 查看版本信息&#xff1a; ​编辑 1.3 查看资源对象简写: 1.4 查看集群信息: 1.5 配置kubectl自动补全: 1.6 node节点查看日志…

使用Net2FTP轻松打造免费的Web文件管理器并公网远程访问

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

【LeetCode百道热题】1.两数之和

一&#xff0c;题目描述 给定一个整数数组nums和一个整数目标值target&#xff0c;请你在改数组中找出和为目标值target的那两个整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;但是&#xff0c;数组中同一个元素在答案里不能重复出现…

Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH

环境: Win10 专业版 自制小程序 问题描述: Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH 解决方案: 在执行本程序前需要以管理员身份运行!关闭杀毒软件,否则会失败,本方案只能在个人电脑测试体验, 只能用于学习测试体验 ,勿用与商业行为 1.先完全JH…

RFID电力资产全周期智能化管理应用解决方案

电力行业需求 国家电网提出了建设“泛在电力物联网”的计划&#xff0c;旨在利用现代信息技术和先进通信技术&#xff0c;实现电力系统各环节的万物互联&#xff0c;构建一个具备全面感知、高效处理和便捷灵活特征的智慧服务系统&#xff0c;其中&#xff0c;重点方向之一是围…

深眸科技聚焦3D机器视觉技术,从技术形态到应用前景实现详细分析

机器视觉技术的不断升级&#xff0c;使得对二维图像的处理逐渐扩展到了更复杂的三维领域&#xff0c;形成了3D机器视觉。3D机器视觉是机器视觉的重要应用领域之一&#xff0c;通过计算机能够在短时间内处理视觉传感器采集的图像信号&#xff0c;从而获得目标对象的三维信息。 …

2023云栖大会,Salesforce终敲开中国CRM市场

2015年被视为中国CRM SaaS元年&#xff0c;众多CRM SaaS创业公司和厂商在Salesforce的榜样作用下涌入了CRM SaaS赛道。在全球市场&#xff0c;Salesforce是CRM SaaS领域的领导厂商&#xff0c;连续多年占据了全球CRM SaaS第一大厂商地位。然而&#xff0c;Salesforce作为业务类…

22款奔驰GLS450升级HUD抬头显示简洁的展示

说起HUD抬头显示这个配置&#xff0c;最初是用在战斗机上的&#xff0c;它可以让战斗机驾驶员读取飞机的各种信息和状态&#xff0c;而无需移动头部&#xff0c;这样就能够有效的提高效率。但随着汽车技术的进步HUD这种配置也逐渐下放到民用车上。发展到今&#xff0c;车上的抬…

Day45 力扣动态规划 : 1143.最长公共子序列 |1035.不相交的线 | 53. 最大子序和

Day45 力扣动态规划 : 1143.最长公共子序列 &#xff5c;1035.不相交的线 &#xff5c; 53. 最大子序和 1143.最长公共子序列第一印象看完题解的思路实现中的困难感悟代码 1035.不相交的线第一印象感悟代码 53. 最大子序和第一印象dp递推公式初始化遍历顺序 实现中的困难感悟代…

面试分享 | 护网蓝队面试经验

关于蓝队面试经验 1.自我介绍能力 重要性 为什么将自我介绍能力放在第一位&#xff0c;实际上自我介绍才是面试中最重要的一点&#xff0c;因为护网面试并没有确定的题目&#xff0c;让面试官去提问 更多是的和面试官的一种 “交谈” &#xff0c;面试的难易程度也自然就取决…

C++ —— map 和 multimap

一、map 1.介绍 1. map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。 2. 在map中&#xff0c;键值key通常用于排序和惟一地标识元素&#xff0c;而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同&am…

二十、泛型(5)

本章概要 边界通配符 编译器有多聪明逆变无界通配符捕获转换 边界 边界&#xff08;bounds&#xff09;在本章的前面进行了简要介绍。边界允许我们对泛型使用的参数类型施加约束。尽管这可以强制执行有关应用了泛型类型的规则&#xff0c;但潜在的更重要的效果是我们可以在…

获取AAC音频的ADTS固定头部信息

文章目录 前言一、AAC音频中的ADTS二、解析ADTS信息1.标准文档中介绍2.解析3.采样率索引和值4.下载AAC标准文档 前言 调试嵌入式设备中播放aac音频的过程中&#xff0c;了解了aac音频格式&#xff0c;记录在此&#xff0c;防止遗忘。 一、AAC音频中的ADTS ADTS&#xff08;Audi…

代码随想录day2

目录 vscode 自定义代码模板Reference vscode 自定义代码模板 select User snippets from Settings on the bottom left corner. select a certain language for example: cpp create your own snippets 格式如下&#xff0c;防着写 第一行"cpp template",模板…

Kubernetes 中 RBAC、ServiceAccount 的区别和联系

Author&#xff1a;rab 目录 前言一、区别二、联系三、案例思考&#xff1f; 前言 首先&#xff0c;Kubernetes (K8s) RBAC (Role-Based Access Control) 和 ServiceAccount 都是 Kubernetes 中用于控制访问权限的两个重要概念&#xff0c;但是它们之间有一些区别和联系。 一…