如需要了解更多蓝牙相关知识,请点击下方连接

https://blog.csdn.net/weixin_47456647/article/details/155188246?spm=1011.2415.3001.5331

安全。从农业到医疗、从住宅智能家居到商用智能建筑、从电站到交通管理系统,物联网系统与技术会触及我们生活的方方面面 —— 其安全漏洞可能造成灾难性后果。就是物联网(IoT)最受关注的问题之一就

蓝牙网状网络在设计之初就将安全作为首要优先级,是从底层构建的安全体系。本文会概述其核心安全特性与解除的安全问题,系列后续文章会深入探讨蓝牙网状网络安全的更多细节。

蓝牙网状网络的安全是强制要求

蓝牙低功耗(LE)GATT 设备可实现《蓝牙核心规范》定义的多种安全措施,具体采用哪些措施由产品设计者决定(甚至可选择不启用任何安全特性)—— 也就是说,蓝牙低功耗 GATT 的安全是可选的。若仅涉及单台设备及其与另一台设备的连接,且产品设计者完成了正确的风险评估,此种设计是合理的。但蓝牙网状网络的安全并非针对单个产品或对等设备连接,而是关注整个设备网络及各类设备组的安全

因此,蓝牙网状网络的安全是强制要求

蓝牙网状网络安全基础

以下安全原则适用于所有蓝牙网状网络:

安全机制说明
加密与认证所有蓝牙网状网络消息都经过加密与认证。
关注点分离网络安全、应用安全、设备安全独立处理(详见下文 “关注点分离”)。
区域隔离蓝牙网状网络可划分为多个子网,每个子网在加密层面独立且安全。
密钥刷新安全密钥可在网络生命周期内通过 “密钥刷新流程” 更新。
消息混淆混淆处理让网络内消息难以被追踪,提供隐私保护,降低节点被追踪的风险。
重放攻击防护蓝牙网状网络安全机制可防御重放攻击。
垃圾桶攻击防护节点可被安全移除,避免因丢弃 / 出售含密钥的设备而引发攻击。
安全设备配置设备加入网状网络成为节点的流程(配备)是安全的。

关注点分离与安全密钥

三类安全密钥,它们为网络不同层面提供安全保障,实现了关键的 “关注点分离” 能力。就是蓝牙网状网络安全的核心

以兼具中继机制的网状灯具为例:它可能会处理楼宇蓝牙网状门禁系统的消息 —— 灯具无需访问、处理这些消息的细节,但需要将其中继给其他节点。

为克服这种潜在的利益冲突,蓝牙网状网络使用不同的安全密钥(称为 AppKey):网络层消息的安全密钥,与照明、物理安防、暖通等特定应用数据的安全密钥是分离的。

蓝牙网状网络中的所有节点都持有一个或多个网络密钥(NetKey)(每个对应一个子网,可能是主子网)。持有网络密钥是节点成为网络成员的依据,网络加密密钥与隐私密钥直接由 NetKey 衍生而来。

持有 NetKey 的节点可解密并认证到网络层,从而执行中继等网络功能,但无法解密应用信息。

每个节点还拥有唯一的安全密钥 ——设备密钥(DevKey),用于节点的配置与设置流程。

区域隔离

持有主 NetKey 意味着成为网络成员并获得网络访问权,同时也可将网络划分为多个独立子网,每个子网有自己的子网密钥。这意味着只有持有某子网密钥的设备,才能与该子网的成员设备通信。子网密钥也可按需创建分配,典型示例是隔离酒店不同房间的节点。

节点移除、密钥刷新与垃圾桶攻击

如前文所述,节点包含各类蓝牙网状网络安全密钥。若节点故障需丢弃,或所有者决定将其出售,必须确保该设备及所含密钥无法被用于攻击原网络。

规范定义了节点移除流程:通过配置者应用将节点加入拒绝列表,再启动密钥刷新流程

密钥刷新流程会为网络中除拒绝列表成员外的所有节点,分配新的网络密钥、应用密钥及所有相关衍生信息 —— 即替换网络与应用安全的整套基础密钥。

因此,被移除的节点仅持有旧 NetKey 与旧 AppKey,不再是网络成员,也不会构成威胁。

隐私保护

由 NetKey 衍生的隐私密钥会对网络 PDU 的头部值(如源地址)进行混淆处理,避免随意的被动窃听用于追踪节点及使用者,同时增加了流量分析类攻击的难度。

重放攻击防护

网络安全中,重放攻击是指窃听者拦截并捕获消息,之后重新发送,诱使接收方执行攻击者未被授权的操作。典型示例是汽车无钥匙进入系统被攻击:攻击者拦截车主与车辆的认证序列,之后重放消息来开锁、启动车辆。

蓝牙网状网络通过两个网络 PDU 字段(序列号(SEQ)IV 索引)防御重放攻击:元素每次发布消息都会递增 SEQ 值;若节点收到某元素的消息 SEQ 值小于等于该元素最后一条有效消息的 SEQ 值,则会丢弃该消息(判定为疑似重放攻击)。同理,IV 索引是与 SEQ 配合的独立字段,同一元素消息中的 IV 索引值必须大于等于该元素最后一条有效消息的 IV 索引值。

加密工具库

蓝牙网状网络的大部分安全特性依赖行业标准的加密算法与流程,系列后续安全相关文章会提及这些内容,本文先介绍最重要的部分。

蓝牙网状网络协议栈运用两类核心安全功能:AES-CMACAES-CCM—— 它们是基础的加密与认证功能,其他密钥生成相关效果均基于这两者完成。

AES-CMAC

基于分组密码的消息认证码(CMAC)是一种算法,可为任意长度的输入生成固定长度(128 位)的消息认证值。使用 AES-CMAC 算法生成消息认证码(MAC)的公式为:

AES-CMAC 的输入包括:

  • k:128 位密钥
  • m:待认证的可变长度数据

AES-CMAC 具备出色的错误检测能力:校验和或错误检测码等技术仅能检测数据的意外修改,而 AES-CMAC 可同时检测有意的未授权修改与意外修改。若想了解更多,可参考其定义文档 RFC4493。

AES-CCM

AES-CCM 是一种通用的认证加密算法所有场景下的基础加密与认证功能,其采用公式如下:就是,适用于密码分组密码。在《蓝牙网状网络规范》中,AES-CCM

AES-CCM 包含 4 个输入参数:

  • k:128 位密钥
  • n:104 位随机数(nonce)
  • m:待加密与认证的可变长度数据
  • a:待认证但不加密的可变长度数据(也称为 “附加数据”),该参数长度可为 0 字节

AES-CCM 会输出 2 个结果:

  • ciphertext(密文):加密后的可变长度数据
  • MIC(消息完整性校验值):对m和a的完整性校验值

图 1 展示了一个明文载荷(可能来自蓝牙网状网络层或上层传输层),结合输入的加密密钥、随机数与明文载荷,经 AES-CCM 处理后,输出加密载荷与 MIC 的流程。

SALT 生成

蓝牙网状网络安全定义了一种名为s1的 SALT 生成函数,它基于 AES-CMAC 功能实现。如前文所述,AES-CMAC 有两个输入参数:k和m。但在 SALT 生成场景中,只有输入参数m是可变的,k会固定设为 128 位值0x0000 0000 0000 0000 0000 0000 0000 0000—— 在《蓝牙网状网络规范》中,该值被称为 “ZERO”。

SALT 生成函数的输入

m —— 非零长度的字节数组或 ASCII 编码字符串。

SALT 生成函数的输出是 128 位 MAC 值,s1的公式表示为:

其他安全函数

在《蓝牙网状网络规范》的 3.8.2 节 “安全工具库” 中,还定义了其他安全函数(如各类密钥衍生函数)。这些函数均基于 AES-CMAC 与 SALT 生成函数s1(而s1本身也基于 AES-CMAC 实现)。

后续内容

安全是蓝牙技能的重要议题,也会在本蓝牙网状网络系列文章中反复出现。读完本文后,你应该已充分理解蓝牙网状网络的核心安全特性,以及部分底层加密技术。

后续文章会深入探讨这一主题,届时你可以进一步了解蓝牙网状网络安全的细节。