目录
蓝牙BLE是一种无线通信,监听者可以很容易的获取空中的数据,为了保证数据通信的安全性,必要时需要对所传输的数据进行加密。Bluetooth Core Spec文档中关于蓝牙BLE安全相关的内容主要分布在GAP,GATT和SMP这三个章节中,三者的关系如图1,将三部分内容整合在一起去理解,更容易系统的理解蓝牙BLE的安全性的内容。

图1
无线通信要保证数据的安全性的话,两个设备之间所传输的无线数据一定是加密的(或者是签名的),双方使用相同的对称密钥或者非对称密钥进行加解密即可,数据的加密/解密并不是蓝牙BLE协议的设计难点,两个无线设备之间如何安全的分配/协商密钥,才是BLE安全通信的核心内容。蓝牙BLE协议协商/分配密钥的过程是通过配对机制来实现的。
蓝牙BLE设备是基于CS模型设计的,client端向提供数据的server端发送消息,以读取或者写入数据。server作为数据的提供者,是对数据安全性更有需求的一方,而client是被要求的一方,简单点来说,server将敏感数据配置为较高的安全等级需求,client只有满足了这个安全等级,server才允许这个client来访问它的数据。
server提供的数据可能并不是敏感数据,即使是敏感数据,也是有安全等级划分的。因此server对不重要的数据,完全可以不配置安全性的加密需求,对于重要的数据,也可以根据重要程度,设置不同的加密等级,这些安全等级的机制,蓝牙BLE协议都是支持的。
两个互相通信的蓝牙BLE设备,在第一次配对绑定成功之后,会将协商好的密钥保存在各自的数据库中,在下一次进行连接时,直接使用数据库中的密钥进行加密即可。蓝牙BLE安全性的实现需要双方设备分别有一个security database来存储这些配对成功的密钥。core spec文档中同样有提到过:"The local device’s security database specifies the security settings required to accept a service request."。说明server配置的安全等级需求,也是保存在security database中的。
GAP章节中定义了安全模式和安全等级,GATT中提到过attribute permission,SMP讲解了分配密钥的具体实现(配对的详细过程)。我个人的理解是GAP定义了BLE安全相关的框架,SMP定义了具体实现,而GATT作为数据的提供者是BLE安全传输的需求方。
因此为了更好的理解蓝牙BLE的安全管理,我们先从GAP章节开始阅读,对于细节的疑问可以先不用深究,在SMP章节会详细的介绍如何实现的。
我们以SIG Bluetooth 4.2版本的Core Spec文档来介绍GAP的安全相关的内容。相关内容在Vol 3,part C的SECURITY ASPECTS – LE PHYSICAL TRANSPORT一节中。
本小结定义了安全连接的模式和规程,其中安全模式分为2种,实现安全模式的安全规程有4种。
安全模式1共有4个安全等级:
安全模式2共有2个安全等级:
安全等级是向下兼容的,也就是说如果server端要求level 3的密钥安全等级,两个设备使用level 4的方式进行配对也是可以的。(配对的方式决定了密钥的安全等级)。
认证规程描述了两个ble设备之间的安全模式是如何建立起来的,认证规程覆盖了security mode 1,认证规程是在连接建立成功之后才开始的(security mode 2是在数据签名规程中定义的)。security mode 1是通过加密来实现的安全性,加密的安全等级根据配对方式的影响,有两种配对类型,一个是认证配对,一个是非认证配对,前者更安全,有MITM Protection;后者没有那么安全,没有MITM Protection。
认证规程其实就是两个设备间,根据Server端设置的数据的security mode 1的level,通过配对方式来交换密钥的过程。如果Server端的数据设置了最高的level 4,那么这两个设备一定要使用LESC的配对方式才能满足,如果Server端设置了level 3的安全等级,那么这两个设备需要使用passkey或者oob的方式进行验证(如果有能力的话,使用LESC的配对方式更好,安全等级是向下兼容的)。
Responding to a Service Request:
本地设备是一个GATT Server,远端设备是GATT Client,当本地设备收到Client的Service request消息,如果当前链路不符合Server所要求的安全等级,Server应该回复error code给client。error code的值依赖于当前连接是否加密,以及所使用的加密密钥LTK的类型(LTK的类型,也就是配对的类型,是认证的,还是非认证的,还是LESC的)。

图2
GATT Server收到一个Client发送的Service Request之后的处理流程如图3。

图3
Security DB数据库文件中存储着这个GATT Server中的数据所需要的安全等级。如果不需要安全的等级,即level 1的安全等级,则直接访问数据;如果未配对,则发起配对流程,用以生成符合安全等级要求的LTK;如果已配对,判断当前的LTK是否符合数据的要求,不符合要求就重新配对,符合要求的话,就开启加密。
有一个特殊的地方是Server的notify和indication,如果之前一个连接的Client把cccd设置为notify了,现在新连接的Client也需要重新验证安全等级,Server才可以发送notify和indication。
Initiating a Service Request:
本地设备是一个GATT Client,远端设备是GATT Server,client发送Service request消息到Server,流程图4。

图4
GATT Client端同样有一个security DB,存储着对方Server的安全等级的要求,是否已配对的状态,和用于加密链路的LTK的值,如果没有存储则尝试和Server建立配对关系。
数据签名用在“两个设备建立连接但是未启动加密”的情况下传输认证的数据,数据签名在两个设备需要快速建立连接且快速传输数据的情况下被使用,如果一个client发送的service request使用了签名写入命令,则Server端被认为当前是在使用LE Security Mode 2进行安全通信。
数据签名需要使用CSRK密钥对数据进行加密,设备双方在配对的过程中,会生成CSRK,LTK和IRK,并且各自保存在security database中。签名数据的传输使用的命令是Signed Write Command,命令格式如图5。

图5
其中12字节的认证签名,内部包含了4字节的SignCounter和8字节的MAC(Message Authentication Code )。SignCounter每发送一次该值会+1,这么设计的目的是防止重放攻击,这也就要求了GATT Server一定要保存所接收到的signed data数据中的SignCounter,以实现防重放攻击的逻辑。签名数据包的格式如图6。

图6
如果链路是加密的,也就是使用了security mode 1的安全模式,server收到了client的签名数据,server会执行client的请求,因为加密是向下兼容签名的。
“授权”,顾名思义是授予一定的权限去做某事,结合到蓝牙BLE的GATT中,是GATT Server授予某个Client去做某事。在允许client访问数据之前,service可以要求授权,授权是需要用户确认才能继续进行的应用层操作,认证不要求一定要提供授权的功能。授权是在认证成功后,有用户确认是否继续进行的操作。
授权是在认证的基础上实现的:举个例子,认证成功后,client访问一个配置了授权的数据,则gatt server可以向用户弹出一个对话框,提示用户是否给对方设备授权,用户点击确定,则认为用户对这个设备进行了授权,如果用户选择“取消”,则gatt Server认为对方设备没有经过授权,则不允许当前的访问。
没有经过认证的GATT Client,可以根据GATT Server返回的error code,发起配对请求,与GATT Server建立认证关系,但是授权则不同,没有经过GATT Server授权的Client,对此无能为力。
认证和授权的区别:认证是一种安全等级的密钥的分配和使用该密钥加密解密的过程,认证过程中可以不需要用户参与,设备之间根据自身的io capability的配对和绑定;授权是在认证的基础上实现的,当client过来访问server的数据时,会给用户提示,询问用户是否允许client进行访问,或者存在一个授权设备的列表,只允许这些Client设备来访问GATT Server。
关于授权的内容,在4.2 Core Spec的几个地方有提到。
GAP章节中:


GATT章节:
