蓝牙篇之蓝牙核心规范(V5.4)深入详解汇总
1.知识回顾
蓝牙协议GATT(Generic Attribute Profile)是蓝牙设备间进行数据交换的标准协议之一。GATT是一种基于服务(Service)和特性(Characteristic)模型的协议,用于描述和传输设备之间的数据。
GATT主要包含以下几个部分:
- 服务(Services)
- 特性(Characteristics)
- 描述符(Descriptors)
GATT的通信是基于ATT协议的,ATT协议是一种双向的、基于应答的协议,用于在GATT服务和特性之间传输数据。ATT协议提供了诸如读、写、通知等操作,以及对于数据完整性和错误恢复的处理。
在GATT中,设备间的数据传输通常遵循以下步骤:
- 发现服务
- 建立连接
- 读取和写入特性
- 关闭连接
设备使用称为属性协议(ATT)的协议访问连接的远程设备的ATTRIBUTE表中的属性,遵循各种GATT过程定义的规则,例如特征值读取和特征值写入。
GATT定义了两种角色。 GATT客户端向GATT服务器发送ATT命令(不需要响应)和请求(需要响应)。 GATT服务器接受并处理从GATT客户端接收到的命令和请求。 GATT服务器还可以向GATT客户端发送各种类型的ATT PDU,俗称通知、指示和响应。
属性表中的每个属性都包括一组属性权限。 属性权限定义了有关连接客户端可能或可能无法对该属性的访问(例如,读取其值的能力)以及在授予访问之前可能适用的任何条件的规则。例如,属性的权限可能表明客户端可以读取其值,但仅限于经过身份验证和加密的链接。 属性权限还适用于ATT服务器及其使用通知和指示与客户端进行通信的情况。
ATT PDUs通过LE-ACL连接传输,因此在任何GATT过程执行和ATT PDU交换之前,设备必须首先建立连接。通常,建立连接后,GATT客户端将通过执行称为发现过程的一系列过程来继续进行。发现涉及确定远程设备的属性表中的内容,以服务、特征和描述符及其相关属性(例如句柄值、类型和权限)为对象。请注意,属性权限不会限制客户端执行发现过程的能力。
服务、特征和描述符的分层结构如下图所示
如果尝试访问属性,并且未满足相关属性权限的条件,则属性协议定义了多个错误代码,用于返回给客户端设备以指示访问请求被拒绝的原因。例如,包括加密不足、身份验证不足和加密密钥大小不足。
在所有GATT服务器中必须有两个特殊服务。这些是通用访问服务和通用属性服务。
GATT的安全性和用户体验
GATT(通用属性配置文件)是一种用于连接低功耗设备并进行通信的协议。在设计GATT应用程序时,安全性和用户体验是两个重要的考虑因素。
- 安全性:
-
- 身份验证:为了确保只有合法的设备可以访问GATT服务和特征,可以使用基于证书的身份验证机制。这样可以减少未经授权的设备连接到GATT网络的风险。
- 加密:使用适当的加密算法和密钥长度可以保护传输的数据不被窃听或篡改。这可以通过使用预共享的密钥或临时密钥来实现。
- 防止重放攻击:通过为每个GATT消息分配唯一的事务ID,可以防止攻击者重复发送相同的消息。这样可以避免信息泄露和不当操作。
- 用户体验:
-
- 简单性:GATT协议的设计应该尽量简单明了,以便用户可以轻松理解和使用。简化的命令和响应格式可以提高用户的学习曲线。
- 可扩展性:设计良好的GATT应用程序应该具有良好的可扩展性,以适应不同类型和数量的设备。这意味着应该支持添加新设备和服务的能力,而无需对现有代码进行重大更改。
- 可靠性:GATT客户端和服务器之间的通信应该可靠且及时。这意味着应该处理错误情况并提供适当的错误响应,以便用户可以采取适当的措施。
综上所述,为了确保GATT应用程序的安全性和提供良好的用户体验,需要考虑身份验证、加密、防止重放攻击等因素,并保持协议设计的简单性、可扩展性和可靠性。
在访问属性时,会检查属性的权限。如果属性权限规定的安全条件未满足,则访问将被拒绝,并且会返回包含错误代码的ATT_ERROR_RSP PDU响应。如果服务器拒绝对属性的访问,通常不会关闭连接。这允许客户端通过升级安全性来处理错误,以便后续访问尝试成功。例如,如果尝试读取特征值导致返回“加密不足”的错误,客户端可以通过启动配对过程并在完成后将连接升级为使用加密来处理此错误。用户可能需要再次与设备交互以重试失败的操作。
处理因安全权限不足而导致的错误的缺点是应用程序的正常流程被中断,因此用户体验不理想。然而,蓝牙核心规范(截至版本5.3)没有提供其他替代的安全错误处理策略。
2 LE GATT安全等级特征
蓝牙核心规范(Bluetooth Core Specification)版本5.4定义了一种新的特征称为LE Gatt安全级别特征(SLC)。SLC特征允许客户端确定GATT服务器的安全条件,如果要授予对所有GATT功能的访问权限,则必须满足这些条件。重要的是,它允许在访问应用程序使用的属性之前确定这些条件。提前检查访问要求可以在不因安全级别问题而中断应用程序流程的情况下创建更好的用户体验。
2.1 技术亮点
设备可能将SLC特征包含在强制的通用访问配置文件服务中。因此,它的包含是可选的,但鉴于其使用的改进用户体验,它是可推荐的。
SLC特征允许只读访问其值而没有进一步的安全限制,例如需要加密连接。
蓝牙LE安全级别以模式和级别的形式表示。
LE安全模式1具有以下安全级别:
- 无安全性(无身份验证和加密)
- 未经身份验证的配对和加密
- 经过身份验证的配对和加密
- 使用128位强度加密密钥的经过身份验证的LE安全连接配对和加密
LE安全模式2具有两个安全级别:
- 未经身份验证的配对和数据签名
- 经过身份验证的配对和数据签名
LE安全模式3具有三个安全级别:
- 无安全性(无身份验证和加密)
- 使用未经身份验证的Broadcast_Code
- 使用经过身份验证的Broadcast_Code
仅LE安全连接模式(LE安全模式1级别4)
可能存在一个以上满足服务器所有属性的安全要求的安全模式和级别组合。因此,SLC特性的属性值由一个或多个安全级别要求字段的数组组成。安全级别要求字段的类型为uint8[2],第一个uint8值包含安全模式的直接表示(例如,0x01表示安全模式1),第二个表示安全级别(例如,0x04表示安全级别4)。
客户端通过读取SLC特性的值,并将当前安全模式和级别与由安全级别要求字段指示的值进行比较来使用SLC特性。如果发现当前安全模式和级别不足以允许服务器支持的所有GATT功能,客户端应用程序此时会采取措施进行补救,通常通过调用升级链路安全的程序来完成