登录 搜索
首页 >> 技术干货 >> 蓝牙/BT

蓝牙技术联盟:解密蓝牙mesh七、八、九、十

2017-12-19 蓝牙mesh 蓝牙 mesh

解密蓝牙mesh系列 | 第七 

蓝牙mesh网络

市场上的低功耗蓝牙设备

 
 

低功耗蓝牙

低功耗蓝牙(Bluetooth Low Energy)是一项相当成功的无线技术。如今已经很难找到不支持低功耗蓝牙的智能手机或平板电脑了。可以说它是可穿戴技术兴起的关键因素。在医疗设备、智能家居设备、传感器等很多设备中,低功耗蓝牙的身影随处可见

目前有数十亿支持低功耗蓝牙的设备已投入使用。那么,这些设备都能成为蓝牙mesh网络的一员吗?这也是本文将会回答的问题。知道你已经迫不及待,早想对着电脑屏幕、平板电脑或手机大喊“天呐,快告诉我吧!”, 我就不卖关子啦:

答案就是YES。
 

低功耗蓝牙设备只要具有正确的低功耗蓝牙功能和一些附加软件,就能加入蓝牙mesh网络中。以智能手机为例,可能只需要一个可以与蓝牙mesh网络对话的普通应用程序(App)就足够了。换句话说,这是任何开发者都能编写的应用程序。

未来充满无限可能性,现在就让我们一探究竟吧!

承载层(bearer layer)

要了解非mesh低功耗蓝牙设备如何成为蓝牙mesh网络的一员,我们需要回顾一下蓝牙mesh协议栈(见 《解密蓝牙mesh系列 第二篇》)。

图 1 – 蓝牙mesh协议栈

蓝牙mesh网络采用低功耗蓝牙作为其射频通信协议栈。而具体如何使用,则是蓝牙mesh网络协议栈最底层的承载层需要负责的工作。

目前定义了两个承载层:广播承载层 (advertising bearer)和GATT承载层 (GATT bearer)。蓝牙mesh网络设备默认使用的是广播承载层,它负责在低功耗蓝牙广播数据包内收发蓝牙mesh数据包。

具有低功耗蓝牙协议栈、能够进行广播和扫描的设备具有基本的、必备的低功耗特性,因此能够支持广播承载层、乃至完整的蓝牙mesh网络协议栈。

既不支持也无法升级使用广播承载层的设备,则必须使用GATT承载层。使用GATT承载层时需要将蓝牙mesh协议数据单元(PDU)封装在代理协议(Proxy Protocol)中,我们将在下文中对此进行详细介绍。

节点与特性

成为蓝牙mesh网络中一员的设备被称为节点(Node)。很多种产品类型都能够成为节点:照明灯、灯具开关、温控器、窗锁、占用传感器等。然而,无论产品类型如何,节点都可能提供某些超出其产品本身功能的特定蓝牙mesh网络服务。

蓝牙mesh规格定义了节点可能拥有的特性。具有这些特性中的一个或多个,即表示节点可以在网络中扮演相应的特殊角色。定义的特性包括:

代理节点(Proxy Node)

图 2 – 代理节点

非mesh低功耗蓝牙设备成为蓝牙mesh网络成员的过程中,代理节点是关键。代理节点的根本目的是执行承载层转换。它能够实现从广播承载层到GATT承载层的转换,反之亦然。因此,不支持广播承载层的设备可通过GATT连接来收发各类蓝牙mesh消息。

 

节点可通过在特性字段中设置代理特性位(proxy feature bit),来表示自身可用作代理节点。特性字段是所有节点都具有的成分数据状态的一部分。

蓝牙mesh代理服务

代理节点(Proxy Node)可实施称为mesh代理服务的GATT服务,即本文中的“代理服务器(Proxy Server)”。mesh代理服务包含两个GATT特性:mesh代理数据输入和mesh代理数据输出。代理客户端(Proxy Client) 使用“GATT Write Without Response”子程序,将代理协议(见下图)PDU写入mesh代理数据输入特性,并从GATT通知中的mesh代理数据输出特性接收代理协议PDU。这就是互联GATT设备通过代理节点在蓝牙mesh网络中进行数据交换的机制。

图 3 – 代理服务器与代理客户端

发现代理节点


低功耗蓝牙设备使用GAP广播来帮助其他设备发现自己。蓝牙mesh代理节点使用完全相同的技术,即通过“GAP可连接型广播(connectable advertising)数据包”,对自身的可用性、可作为代理节点的角色、及其身份进行广播。


GAP广播数据包中包含各类字段,称为广播类型(AD Type)。核心规格附录中对广播类型进行了定义。代理节点会在广播数据包中包含以下字段:

表 1 – mesh代理广播

服务数据广播类型的内容还需经过进一步检查。

网络ID是从网络密钥(NetKey – 参照《解密蓝牙mesh系列 | 第六篇》)派生而来的唯一公共标识符。节点标识由代理服务器节点的单播地址和网络标识符的组合派生而来,例如启用该标识的子网的网络ID。

如果代理服务器是多个子网的成员,则它将对包含每个子网的网络ID广播数据包进行交替操作,每次处理一个广播数据包。

节点标识广播的主要用途是将启动配置设备(Provisioner)快速连接至刚刚完成启动配置的节点,从而完成新节点的配置。


代理协议


代理客户端和代理服务器使用代理协议进行通信,并向对方发送代理PDU。这些PDU就像是存放各类蓝牙mesh PDU的容器。


蓝牙mesh接入消息使用核心蓝牙mesh协议栈,因此消息包含在网络PDU内。网络PDU可被封装在代理PDU中。

蓝牙mesh配置文件规格中定义了各种Beacon,包括未经启动配置的设备Beacon、以及安全网络Beacon。可通过代理协议将蓝牙mesh Beacon纳入网络。

启动配置过程涉及其自身协议,且启动配置PDU也可在代理PDU内进行交换

最后,代理客户端和代理服务器可以交换特殊的代理配置消息,这些消息也可被封装于代理PDU中。


大多数类型的mesh数据可使用代理协议进行交换,因此可通过连接至代理节点的GATT客户端进行收发。

不同设备代理PDU的大小各异,PDU的大小是根据低功耗蓝牙属性协议(ATT)的最大传输单元(MTU)进行动态设置的,这是通过GATT连接来传输代理PDU的基础。此外,代理协议可以将完整的蓝牙mesh消息封装在代理PDU或多段消息的各个段中,借此来容纳较长的蓝牙mesh消息。

需要注意的一点是,任何蓝牙mesh节点(而非只有代理节点)都可以实施代理协议,从而支持基于GATT连接的直接交互。这在启动配置(provisioning)场景中非常有用。

关于代理协议的更多信息,包括代理PDU的格式,可参考蓝牙mesh配置文件规格: https://www.bluetooth.com/specifications/mesh-specifications

代理滤波器和代理配置

代理客户端可通过对代理服务器所应用的过滤器进行配置,对接收到的网络流量进行精确的控制。过滤器采用白名单和黑名单的形式,同时这些名单会指定各自的目标地址列表。列表中的地址可能是其所支持的地址类型的任意组合,即单播、群组或虚拟地址。如果消息的目标地址未包含在白名单过滤器中,则消息会被代理服务器的代理过滤器(Proxy Filter)滤掉。同样,如果消息的目的地包含在黑名单过滤器中,也会被滤过。

代理配置(Proxy Configuration)消息在代理客户端和代理服务器之间进行交换,并实现代理过滤器的配置。


使用低功耗蓝牙智能手机或平板电脑启动配置

通常使用智能手机或平板电脑执行启动配置流程,以将新设备添加至蓝牙mesh网络。大多数此类设备不会实施完整的蓝牙mesh网络协议栈,而且与蓝牙mesh网络进行的所有交互(包括启动配置)都很可能会使用代理协议。如前所述,启动配置PDU可被封装于代理PDU中,因此可通过代理服务器节点、利用GATT连接进行交换。蓝牙mesh配置文件规格中将采用代理协议的启动配置协议称为PB-GATT。

在上期《解密蓝牙mesh系列 | 第六篇》中介绍了启动配置流程,本系列后续文章中将进一步深挖有关启动配置安全性的细节问题。

借助代理节点使用代理协议时需要注意什么?

智能手机等设备要想通过代理节点、借助代理协议与蓝牙mesh网络通信,则必须扫描并连接至代理节点。换句话说,它必须支持GAP中央设备的角色。

此外,必须首先对智能手机进行启动配置。如果未经启动配置,任何设备都无法与蓝牙mesh网络中的节点进行交互。

结论

通过GATT、代理协议和蓝牙mesh代理节点对当前市场上的低功耗蓝牙设备提供支持,这绝对值得上新闻头条了!它为人们手中已有的海量设备打开了通往蓝牙mesh网络世界的大门,光是想想就觉得令人兴奋了呢!你也有同感吗?留言告诉我吧~

 

解密蓝牙mesh系列 | 第八

蓝牙mesh网络
安全性概览

为何安全性如此关键?


安全性可谓是物联网(IoT)最受关注的问题之一。从农业到医院、从智能家居到商业智能建筑、从发电站到交通管理系统,物联网系统和技术将触及我们生活的方方面面。物联网系统如果存在安全漏洞,就可能会导致灾难性的后果

蓝牙mesh网络的安全性从设计之初就是重中之重。本文将着重分析主要的安全特性和现已被解决的安全问题。本系列的后续文章也将持续详细地介绍蓝牙mesh网络安全性的各个方面。

蓝牙mesh网络强制使能安全性

低功耗蓝牙(Bluetooth Low Energy)GATT设备可实施蓝牙核心规格中定义的一系列安全措施。产品设计人员有责任决定采取哪些安全措施,也可以决定不采用任何既有的安全特性。换句话说,低功耗蓝牙GATT的安全性配置是非强制性的。如果我们谈论的是单一设备的安全性及其与另一台设备的连接,只要产品设计师正确地进行风险评估,那么他的决定就是合理的。然而,蓝牙mesh网络中的安全性涉及的不仅是单一设备或对等设备之间的连接安全性;它关注的是整个设备网络的安全性,以及网络中各组设备的安全性。

因此, 蓝牙mesh网络中强制性使用安全性

蓝牙mesh网络安全性的基本概念

以下基本的安全性说明适用于所有蓝牙mesh网络:

安全分级考量与安全密钥

蓝牙mesh安全性的核心是三类安全密钥。这些密钥为mesh网络的不同方面提供了安全性,并实现了蓝牙mesh网络安全性中的关键性能,即“安全分级考量”。

以可用作中继(Relay)节点的mesh照明灯为例,它能够作为中继,处理与楼宇中蓝牙mesh门窗安全系统相关的消息。照明灯完全不涉及对这些消息内容细节的访问和处理,但却会将消息中继至其他节点。

为处理这种潜在的利益冲突,蓝牙mesh采用称为“应用密钥(AppKey) ”的安全密钥来保护应用层消息,它不同于用于保护特定应用(如照明、物理安全、温控等)相关数据安全的密钥。

蓝牙mesh网络中的所有节点都拥有一个或多个网络密钥(NetKey),每个网络密钥对应一个子网,它也可能是主要子网。节点必须拥有网络密钥,才能成为网络中的成员。网络加密密钥(Encryption Key)和隐私密钥(Privacy Key)直接源于网络密钥

拥有NetKey让节点能够对网络层的数据进行解密和验证,以便执行诸如中继等网络功能。但应用程序数据不可被解密。

每个节点还拥有一个唯一的安全密钥,称为设备密钥(DevKey),用于节点的启动配置(Provisioning)和配置流程。

区域隔离

节点拥有了主要NetKey ,就意味着它具备了蓝牙mesh网络成员资格和访问权限。但也可以将网络划分成不同的子网,每个子网都有自己的子网密钥。这意味着只有拥有指定子网密钥的设备才能与该子网中的其他成员设备进行通信。也可以临时创建并分配子网密钥,例如,酒店中位于不同客房的节点的隔离。

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

如上所述,节点包含各种蓝牙mesh安全密钥。如果一个节点发生故障并需要处理,或者如果所有者决定将节点出售给其他人,那么重要的是确保该设备及其所包含的密钥不会被盗用,避免向节点原本所在的网络发动攻击

蓝牙mesh网络确保设备可被安全地进行丢弃处理

从网络中删除节点的程序现已有明确定义。通过启动配置设备(Provisioner)应用程序,可将节点添加至黑名单,然后启动密钥刷新程序(Key Refresh Procedure)


密钥刷新程序会向网络中除黑名单成员以外的所有节点发放新的网络密钥、应用密钥、以及所有相关的派生数据。也就是说,构成网络和应用程序安全性基础的整套安全密钥将被替换

因此,已从网络中移除的、包含原有NetKey 和AppKey的节点将不再是网络成员,换句话说,上述这些不被授信的节点将从网络当中剔除出去,因此也无法再构成威胁。

隐私

由NetKey导出的隐私密钥(Private Key)用于对网络PDU (Payload Data Unit) 的报头值进行模糊化,例如源地址(source address)。模糊化可以确保无法通过随机的被动窃听来跟踪节点及其使用者,也使得基于流量分析的攻击难以实施

中继攻击

在网络安全方面,中继攻击是窃听者拦截并捕获一个或多个消息、稍后重新进行传输的一种技术,目的是欺骗接收者,执行未经被攻击设备授权的任务。常见的例子就是汽车的无钥匙进入系统被攻击者所击破,攻击者就能拦截汽车车主和汽车之间的认证序列,然后对这些消息进行中继,以进入汽车并将其偷走。

蓝牙mesh可保护网络免受中继攻击。这种保护是基于分别称为序列号(SEQ, Sequence Number)和IV索引(IV Index)的两个网络PDU字段。每次发布消息时,元素会增加SEQ值。节点从元素接收消息,如果元素包含的SEQ值小于或等于上一个有效消息中的SEQ值,则节点会将消息丢弃,因为这则消息可能与中继攻击有关。IV索引是一个单独的字段,需与SEQ一同纳入考量。来自给定元素的消息中的IV索引值必须始终等于或大于该元素的上一个有效消息。

加密工具箱
 

蓝牙mesh网络的大多数安全特性都有赖于业内标准的加密算法和程序,这在本系列的其他安全性相关文章中也会提及,本文还是着重解释最重要的内容。

蓝牙mesh协议栈中采用的两项关键的安全功能是AES-CMAC和AES-CCM。这些是基本的加密和认证功能,所有用于密钥生成的其他功能都是基于上述两者。

AES-CMAC


基于密码的消息认证码(CMAC)是一种算法,能够生成固定长度的128位消息认证值,并将其用于任何变量长度输入。使用AES-CMAC算法生成消息认证码MAC的公式为:

AES-CMAC具有出色的错误检测能力。涉及验证校验和或者使用错误检测代码的其他技术只能检测数据的意外修改。AES-CMAC旨在检测有意的、未经授权的数据修改,以及意外修改。如果您有意向了解更多关于此功能的信息,请参考RFC4493 中的详细定义:https://tools.ietf.org/html/rfc4493

向 AES-CMAC输入:

  • – 128位的密钥

  • – 将被认证的可变长度数据

 

 
AES-CCM

AES-CCM是一种通用的、认证的加密算法,使用时需要加密块密码。在蓝牙mesh规格中,AES-CCM在所有情况下都能被用作基本的加密和认证功能。其使用公式如下:

向AES-CCM输入四项内容:

  • k – 一个128位的密钥

  • n – 一个104位的随机数

  • m – 将被加密和认证的可变长度数据

  • a – 将被认证、但不加密的可变长度数据,也被称为“附加数据(Additional   Data)”,这一输入参数长度可以为0字节。

    从 AES-CCM有两项输出:

  • 密文  - 加密后的可变长度数据

  • MIC – m和a的消息完整性检查值

    下图显示了可能来自蓝牙mesh网络层(network layer)或上层传输层(upper transport layer) 的纯文本有效载荷(Payload),由具有输入加密密钥(Key)随机数(Nonce)文本有效载荷的AES-CCM进行处理。其输出为加密的有效载荷(Encrypted Payload) MIC

用于数据包有效负载加密和认证的AES-CCM 

SALT生成

蓝牙mesh安全性定义了SALT 生成函数s1,它采用AES-CMAC功能。如上所述,AES-CMAC具有两个输入参数:k和m。当用于SALT生成时,只有输入参数m发生变化。 K一直被设置为一个128位的值,即0x0000 0000 0000 0000 0000 0000 0000 0000,它在蓝牙mesh规格中被称为ZERO。

SALT生成函数

向 SALT生成函数输入:

m – 一个长度非零的八位字节数组或ASCII编码字符串

其输出为一个128位的MAC值,s1公式 如下:

其它安全性函数

在蓝牙mesh网络规格第3.8.2章节的“安全工具箱(Security Toolbox)”部分中,可以找到对其他安全函数的定义,例如各种关键性的派生函数。所有这些都是基于AES-CMAC和SALT生成函数s1(SALT生成函数也是基于AES-CMAC)。
https://www.bluetooth.com/specifications/mesh-specifications

安全性是蓝牙技术的首要问题,我们将在解密蓝牙mesh系列中持续探讨这一话题。读完本文,对于蓝牙mesh网络主要的安全特性以及一些基本的加密技术,您应该已经有了较为深入的了解,敬请期待下周的解密蓝牙mesh系列!

 

解密蓝牙mesh系列 | 第九 


蓝牙mesh网络

启动配置Part1

受WannaCry攻击的国家地区

2017年5月,臭名昭著的勒索软件WannaCry向全球各地的电脑发起了攻击,并窃取了用户数据进行勒索。来自150个国家和地区的数百万台计算机遭受影响,勒索软件要求用户通过比特币这一加密电子货币的形式支付赎金。如果没有稳健的、基于标准的安全系统设计,物联网(IoT)可能也会发生类似情况。可以想象,如果没有完善的安全防护,今后物联网设备的用户也会迫不得已支付“赎金”让“黑客”打开自家的家门。

 

安全性是蓝牙mesh网络设计的核心,而且这种安全性是强制性的,网络中的每个数据包都会经过加密和认证。蓝牙mesh网络的安全性能够保护整个mesh网络免受各类威胁和问题的困扰,包括:

中继攻击(Replay attack):可通过正确使用序列号来保护网络不受中继攻击。

中间人攻击(Man-in-the-middle attack):采用非对称加密技术来进行抵御,例如通过椭圆曲线Diffie-Hellman(ECDH)来有效防范中间人攻击。

垃圾桶攻击(Trash Can attack):这种攻击利用的是废弃设备,必要时可通过刷新安全密钥来防止攻击发生。

 概述 


启动配置(Provisioning)是向蓝牙mesh网络(如灯泡)添加新的未经启动配置设备的过程。该过程由启动配置设备(Provisioner) 进行管理。启动配置设备和未经启动配置设备遵循蓝牙mesh规格中定义的固定过程。启动配置设备向未经启动配置设备提供使其成为蓝牙mesh节点的启动配置数据(provisioning data)。

启动配置设备通常是运行启动配置应用程序的智能手机或其它移动计算设备。尽管每个网络只需要一台启动配置设备来执行启动配置,但可用的启动配置设备可以有多台。

 启动配置协议  


蓝牙mesh规格中定义了启动配置协议,该协议定义了启动配置流程中用于在启动配置设备和新的未经启动配置设备之间进行通信的标准流程以及PDU。图1描绘了完整蓝牙mesh协议栈之外的启动配置协议栈。

图1: mesh系统架构与启动配置协议栈

从下到上的组件如下:

启动配置承载层(Provisioning Bearer)

启动配置承载层实现了启动配置PDU在启动配置设备和未经启动配置设备之间的传输。定义的两个启动配置承载层包括

B-ADV:指通过蓝牙广播信道进行设备启动配置的启动配置承载层。PB-ADV承载层用于发送通用启动配置 (Generic Provisioning) PDU。支持PB-ADV的设备应尽可能执行占空比接近100%的被动扫描,以避免遗漏任何发送来的通用启动配置PDU。

B-GATT:指使用来自代理协议的蓝牙mesh代理(proxy)PDU来进行设备启动配置的启动配置承载层。“代理协议能使节点通过面向连接的低功耗蓝牙(Bluetooth Low Energy)承载层来收发网络PDU、mesh Beacon、代理配置消息和启动配置PDU。PB-GATT在GATT操作中包含了启动配置PDU,涉及GATT启动配置服务,同时能在启动配置设备不支持PB-ADV时供其使用。

 

启动配置协议

定义对于启动配置PDU、行为和安全性的要求。了解启动配置协议将有助于您根据应用需求选择合适的验证方法。

 启动配置程序  


启动配置协议定义了10种启动配置PDU

  1. 启动配置邀请 (Provisioning Invite)

  2. 启动配置能力 (Provisioning Capabilities)

  3. 启动配置状态 (Provisioning State)

  4. 启动配置公钥 (Provisioning Public Key)

  5. 启动配置输入完成 (Provisioning Input Complete)

  6. 启动配置确认 (Provisioning Confirmation)

  7. 启动配置随机 (Provisioning Random)

  8. 启动配置数据 (Provisioning Data)

  9. 启动配置完成 (Provisioning Complete)

  10. 启动配置失败 (Provisioning Failed)

开发者若想了解有关这些PDU的详细信息,请参考蓝牙mesh规格的5.4.1节(详见:https://www.bluetooth.com/specifications/mesh-specifications )。

完整的启动配置过程必须在更高的层面完成两项重要任务:

  1. 验证未经启动配置的设备在蓝牙mesh网络中,一个小空间中可能存在几台、几十台或数百台设备。执行认证是为了确保与启动配置设备进行交互的设备就是用户想要启动配置的设备。

  2. 与未经启动配置的设备建立安全链接,并与之共享相应的信息。在流程的最后,原本未经启动配置的设备将成为蓝牙mesh网络中的节点。

启动配置流程包括五个阶段:

1

发送Beacon信号

2

邀请

3

交换公共密钥

4

认证

5

启动配置数据分发

这里将介绍前三个阶段。我们将在“蓝牙mesh网络启动配置Part2”中介绍最后两个阶段。

1、发送Beacon信号

Beacon是低功耗蓝牙的传统应用场景。想象一下,一个GAP外设(如智能手表或活动跟踪器)希望与GAP中央设备(如智能手机或平板电脑)连接。 GAP外设切换到广播状态并开始发送其广播数据包。GAP中央设备扫描广播数据包以发现其它设备并接收相关基本信息。蓝牙mesh启动配置使用的也是相同的广播机制


如果未经启动配置的设备支持PB-ADV承载层,则其作为未经启动配置设备Beacon进行广播。这涉及指定的数据包格式,且未经启动配置设备通过此方式来使自身被启动配置设备 (Provisioner) 发现。

当未经启动配置设备使用PB-GATT承载层时,一项称为“mesh启动配置服务”的GATT服务会支持整个启动配置程序,同时支持与启动配置设备的交互。在发送Beacon信号阶段,未经启动配置设备会发送包括mesh启动配置服务UUID的广播数据包,它会被启动配置设备通过标准的低功耗蓝牙扫描程序发现。

2、邀请


在发送Beacon信号之后,启动配置设备和未经启动配置设备会建立PB-ADV或PB-GATT启动配置承载层(provisioning bearer)。然后,启动配置设备发送一个启动配置邀请 PDU,设备通过启动配置功能PDU对其作出响应。


启动配置邀请PDU包括Attention Duration字段,其指示了未经启动配置设备的主要元素应采用某种视觉指示方式,并在多长的时间内吸引用户的注意力。

启动配置功能PDU包括:

  • 设备支持的元素数量;

  • 支持的一组安全算法;

  • 使用带外(OOB)技术实现的公共密钥可用性;

  • 该设备向用户输出值的能力。

  • 该设备允许用户输入值的能力。

图 2 – 启动配置邀请

图2中的流程图让人联想到低功耗蓝牙中的配对过程,这在此前的文章《蓝牙配对 - 第一篇:配对特性交换(Pairing Feature Exchange)》中有所介绍。 低功耗蓝牙配对采用的配对特性交换类似于蓝牙mesh启动配置程序中的启动配置邀请阶段。在启动配置邀请阶段,目的是向启动配置设备(Provisioner) 提供有关未经启动配置设备功能的信息。有了这些信息,启动配置设备就能决定下一步该如何进行。

3、交换公共密钥

信息加密涉及两项基本技术:对称加密(也称为密钥加密)和非对称加密(也称为公钥加密)。


对称加密采用相同的密钥进行加密和解密。只要发送设备和接收设备都知道密钥,就能够解密所有使用此密钥加密的信息。然而,很难安全地通过链路交换密钥并防止其落入坏人之手。

非对称加密使用两个相关的密钥(即一个密钥对)来解决上述问题:公钥和私钥。公钥免费提供给任何可能想向您发送消息的人。私钥则为保密,只有你自己知道。使用公钥加密的任何消息(文本、二进制文件或对称密钥)只能通过应用相同的算法、且仅能使用与之匹配的私钥进行解密。这意味着您不必对通过链接传递公钥的过程有任何担忧,因为它们仅用于加密而非解密。然而,非对称加密比对称加密慢一些,且需要更高的处理能力来进行消息内容的加密和解密。

在蓝牙mesh用例中,大多数设备基于嵌入式芯片组或模块,因此无法使用计算成本昂贵的非对称加密技术来对每个消息进行加密/解密。对称加密更适合于不具备非对称加密所需处理能力的设备,但如何安全地交换并使用密钥仍然是一大问题。蓝牙mesh采用了非对称和对称加密结合的方式来解决这一问题。

非对称加密:椭圆曲线Diffie-Hellman(ECDH)是一种匿名密钥协商协议,允许具有椭圆曲线公私密钥对的双方在非安全信道上建立共享保密信息。ECDH在蓝牙mesh启动配置中的目的是在启动配置设备和未经启动配置设备之间创建安全链路。它使用公钥和私钥来分发对称性密钥,两台设备随后可将其用于后续消息的加密和解密。

对称加密:在蓝牙mesh网络中传输的每个消息都使用AES-128密码加密。 AES-128算法是常用的对称加密/解密引擎,常用于嵌入式平台。

在交换公钥阶段,有两种交换ECDH公钥的可能方式。它们可以通过蓝牙链路、或OOB隧道进行交换。在启动配置邀请阶段,未经启动配置的设备已经报告了是否支持通过OOB隧道发送自身公钥。如果是,则启动配置设备可继续使用它,并通过发送启动配置开始PDU来通知未经启动配置的设备。

如果未经启动配置设备的公钥可通过OOB隧道获得,则临时公钥从启动配置设备发送到设备,并采用合适的OOB技术(例如二维码),从未经启动配置的设备中读取静态公钥,如图3所示。

图 3 – 未经启动配置设备采用OOB方式进行的公钥交换

否则,双方的公钥都会经由图4中所示的蓝牙链路进行交换。

图 4 – 未经启动配置设备的公钥未知时的公钥交换

ECDHSecret = P-256 (私钥,对等公钥)

在该等式中,P-256即FIPS 186-3中定义的FIPS-P256曲线。

本文的Part2将介绍启动配置程序的最后两个阶段:启动配置数据的认证和分发。我还会对蓝牙mesh网络中会用到的安全工具箱进行介绍。


解密蓝牙mesh系列 | 第十  

蓝牙mesh网络
启动配置Part2

在本文的Part1中,我介绍了启动配置承载层(provisioning bearer layer)和蓝牙mesh启动配置流程的前三个阶段:发送Beacon信号邀请交换公共密钥。 

启动配置流程包括五个阶段:

1

发送Beacon信号

2

邀请

3

交换公共密钥

4

认证

5

启动配置数据分发

  1. 发送Beacon信号:如果未经启动配置的设备支持PB-ADV承载层,则其作为未经启动配置设备Beacon进行广播;如果使用的是PB-GATT承载层,则发送可连接的广播数据包。这就向启动配置设备(Provisioner)表明未经启动配置的设备已做好准备,可进入启动配置流程。

    邀请:启动配置设备(Provisioner)邀请未经启动配置的设备发送自身启动配置功能信息。      

    交换公共密钥:在此阶段,根据未经启动配置设备的功能,启动配置设备(Provisioner)选择合适的验证方法,并通知未经启动配置设备将要采取的方式。之后,启动配置设备和未经启动配置设备会创建一个椭圆曲线公私密钥对并交换公钥。然后,每台设备使用自己的私钥和对等设备的公钥来计算对称密钥,即ECDHSecret。该密钥用于验证对端设备的身份。

本文将介绍启动配置流程的后两个阶段:认证启动配置数据分发

4、认证

在此步骤中,启动配置设备使用所选的验证方法,对未经启动配置设备进行验证。有三种可用的验证方法(OOB, Out-Of-Band):输出OOB(Output OOB)输入OOB(Input OOB)、以及静态OOB(Static OOB)无OOB(No OOB)。 

 

 输出带外(Output OOB)

若选择的是输出带外(Output OOB)验证方法,则未经启动配置设备会选择一个随机数,并通过与其功能兼容的方式输出该数字。例如,如果未经启动配置设备是一个灯泡,则它能够闪烁指定的次数。如果设备具有LCD屏幕,则可以将随机数显示为多位数值。启动配置设备(Provisioner)的用户需要输入观察到的数字,来验证未经启动配置的设备。输出带外验证方法的工作流程如图1所示。   

图1 – 通过输出OOB进行验证

输入随机数后,启动配置设备(Provisioner)生成并检查确认值。无论采用哪种验证方式,整个验证步骤中的检查确认值(check confirmation value)计算方式都是相同的,请继续往下看。

输入带外(Input OOB)

输入带外(Input OOB)验证方法与输出带外(Output OOB)方法类似,但设备的角色相反。启动配置设备(Provisioner)生成并显示随机数,然后提示用户采取适当的操作,将随机数输入未经启动配置的设备。以照明开关为例,用户可以在一定时间内数次按下按钮,以这种形式输入随机数

与输出带外验证(Output OOB)相比,输入带外(Input OOB)方法需要发送一个附加的启动配置协议PDU。在完成认证操作之后,未经启动配置的设备向启动配置设备发送一个启动配置输入完成PDU(Provisioning Input Complete PDU),通知其随机数已输入完成。随后进入到执行检查确认值操作的步骤。

图 2 – 通过输入OOB进行验证

静态带外(Static OOB) 或无带外(No OOB) 

在输入带外或输出带外都不可用的情况下,启动配置设备(Provisioner)和未经启动配置的设备可采用静态带外(Static OOB)验证或无带外(No OOB)验证:采用静态OOB信息;或静态OOB信息不可用,直接以数值0代替。在此情况下,启动配置设备和未经启动配置的设备各自生成一个随机数,然后进行检查确认值操作。

检查确认值(Check Confirmation Value)

无论采用何种验证方法,都会进行确认值生成和检查。根据蓝牙mesh规格,启动配置设备(Provisioner) 和未经启动配置设备应分别计算确认值。这两个值被称为ConfirmationProvisionerConfirmationDevice。这两个值的计算都使用一系列相同的函数,不同之处仅在于所使用的随机数输入。

蓝牙mesh规格中有两页关于计算过程的内容说明确认值生成函数需要8个参数,参数值来自启动配置(Provisioning)过程中的后续步骤。可参考规格的5.4.2.4认证和5.4.1启动配置PDU部分,了解更多详细信息。(详见:https://www.bluetooth.com/specifications/mesh-specifications 

表1列出了用于确认值生成及其来源的参数。 

表1 - 用于确认值计算的参数

让我们来看看用于确认值生成的算法。图3是一个流程图,其中包括了几轮AES-CMAC和SALT生成[1]。该流程图对于ConfirmationProvisioner和ConfirmationDevice值均适用。

如果由启动配置设备(Provisioner)执行输入,则从一个名为RandomProvisioner的值开始(下图中以蓝色表示),并生成ConfirmationProvisioner值。

如果由未经启动配置设备执行输入,则从一个名为RandomDevice的值开始(下图中以绿色表示),并生成ConfirmationDevice值。

图 3 – 确认值生成图

确认值检查(Confirmation Value Check)

当确认值生成之后,两台设备就会进行交换,并且都会检查接收值的完整性。图4表示确认值检查的过程。

确认过程的开始就是启动配置设备(Provisioner)将其随机数RandomProvisioner发送到未经启动配置的设备。未经启动配置设备使用它来重新计算确认值,并与之前接收的确认值进行比较,进行验证。

图 4 –确认值检查

如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner不匹配,则启动配置(Provisioning)过程将被中止。

如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner匹配,则未经启动配置设备将其RandomDevice值发送给启动配置设备。

然后,启动配置设备(Provisioner) 使用相同的过程来重新计算确认值,并通过比较计算所得值与先前接收值来进行验证。

如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice不匹配,则启动配置(Provisioning)流程将被中止。

如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice匹配,则表示验证成功。后续只要启动配置设备(Provisioner)和未经启动配置设备完成启动配置流程的第五步:启动配置数据分发,则未经启动配置设备就能成为蓝牙mesh网络中的节点(node)。  

5、动配置数据分发

认证步骤完成之后,就可以确保在启动配置设备(Provisioner)和未经启动配置设备之间建立的承载层的安全,然后就进入启动配置(Provisioning)过程中最重要的一步:导出并分发启动配置数据(provisioning data)。启动配置设备(Provisioner) 负责生成启动配置数据,启动配置数据由多个数据项组成,包括一个称为网络密钥 (NetKey) 的安全密钥。表2列出了启动配置数据字段

表 2 – 启动配置数据(provisioning data)

为安全地进行启动配置数据分发,启动配置设备(Provisioner)采用AES-CCM [2],借助共享的会话密钥(SessionKey)对启动配置数据(provisioning data)进行加密,启动配置设备和未经启动配置设备都会进行计算。 AES-CCM需要三个输入参数:会话密钥会话随机数纯文本。纯文本参数值包含需要被加密的启动配置数据。设备密钥(DevKey)、会话密钥(SessionKey)和会话随机数(SessionNonce)的值通过图5所示的过程导出。

 
 

图5  -  DevKey / SessionKey / SessionNonce生成过程

从图5可以看出:

如果将prsk(绿色)的输入值代入k1函数中,则会生成SessionKey。这是用于启动配置数据加密的关键。

如果将prsn(黄色)的输入值代入k1函数中,将生成SessionNonce。这是用于启动配置数据加密的随机值。

如果将prdk(蓝色)的输入值代入k1函数,则将生成DevKey。

启动配置设备(Provisioner)和未经启动配置设备都需要生成会话密钥(SessionKey)和会话随机数(SessionNonce)。当SessionKey和SessionNonce值准备就绪时,启动配置设备将对包含导出启动配置数据的启动配置数据PDU (Provisioning Date PDU) 进行加密,并将其发送至未经启动配置的设备。此处,相同的SessionKey和SessionNonce值也可用来对接收到的数据进行解密。

至此,启动配置流程完成。两台对等设备都已知晓新的设备密钥(DevKey)和全网的网络密钥(NetKey),这就意味着我们的新设备已成为蓝牙mesh网络中的节点(node)和成员

开发mesh

启动配置过程是蓝牙mesh安全的基础,让网络设备之间能够可靠安全地进行通信。如果您想了解有关蓝牙mesh的更多信息,请下载蓝牙mesh规格,蓝牙mesh创新产品开发所需的一切都将尽在掌握。

转自:蓝牙技术联盟

您可能感兴趣的文章
全面了解C-V2X车联网,只需牢记这十点
天线大神出手,立马做出一台logo自发光的iPhone X
详解开关电源EMC设计实用技术
为什么32.768kHz的晶振封装这么另类?
5G NSA(非独立组网)标准正式冻结,2G是否要退网?
疑中兴子公司裁员,致南开硕士工程师丧命,家属痛诉跳楼始末
参与讨论
后参与评论
扫码加入
官方微信群
合作伙伴 / 生态圈:
Copyright © 2015 - 2017 深圳市创客智趣通信技术有限公司 粤ICP备15070425号-1