本文引自:https://blog.bluetooth.com/bluetooth-pairing-part-4
在前一章节,概述了<采用万能钥匙配对方法的低功耗传统配对>。在Bluetooth 4.2版本中,引入了低功耗安全连接(SC)。它采用符合联邦信息处理保准(FIPS)的算法--椭圆曲线(ECDH)算法来生成密钥。并且引入了一种全新的关联模型:数值比较(Numeric comparison).
今天,我们来一起深入一览:
回顾一下“BLESM(1)”的内容。表一是pairing request/response分组定义。在“AUthreq”字段中,有一个名为“SC”的位。如果设备支持低功耗安全连接配对,则SC字段应该设置为1,
否则,设置为0。如果两个设备都支持低功耗安全连接配对,则应该使用低功耗安全连接配对,否则使用传统配对。
*表一 pairing request/response
* 位顺序是从LSB到MSB
因此,两个设备要通过SC配对,则必须设置“SC”为1,以告知对等设备我具备安全连接的能力“”。
完成配对特性交换之后,发起设备和响应设备应确定使用何种密钥生成方法。这里是密钥生成方法的C语言编码实例:
if ((1 == OOB_Flag_Initiator) || (1 == OOB_Flag_Responder)) {
runOOBMethod();
} else if ((0 == MITM_Flag_Initiator) || (0 == MITM_Flag_Responder)) {
runJustWorksMethod();
} else {
checkIOCapablities();
}
表2列出了数值比较发起设备和响应设备的IO功能。当发起设备和响应设备都具有显示屏和“是/否”的IO功能、或显示屏和键盘的IO功能时,则使用数值比较
关联模型。
* 表2 数值比较的IO能力映射
* “-”表示适用于其他密钥生成方法,而非数值比较
密钥生成之后,配对进入阶段3,即身份认证阶段。目的是保护连接不受中间人攻击(MITM),同时生成即将用于加密连接链路的密钥。
在公钥交换中,每个设备生成自己的椭圆曲线(ECDH)公私密钥对,其中包含私钥和公钥。
* 图1 数值比较的认证过程
通过发起设备将PKa发送到响应设备来启动配对。随后,响应设备恢复自己的PKb。交换公共密钥后,设备即可开始计算Diffie-Hellman(椭圆曲线)密钥。
在上图中可以看到,Diffie-Hellman(椭圆曲线)密钥计算是在1b结束后开始的。
随后,每个设备选择一个128位随机数,此值将用于防止重放攻击(replay attacks)。
下一步,响应设备计算提交Cb,其通过Nb,PKa,PKb和0计算得出。请看图1中的步骤3.
步骤4,响应设备必须在接收到发起设备的Na之前共享Cb。
步骤5,发起设备必须在接收到响应设备的Nb之前共享其Na。
步骤6,发起设备接收到响应设备的Nb之后,必须检查来自响应设备的Cb。
此时发起设备和响应设备已经知晓对等设备的公共密钥和随机数。发起设别可以确认来自响应设备的提交(Cb)。在这一节点上的失败意味着存在攻击者
或者其他传输错误,且会导致配对过程终止,如步骤6a。
验证成功之后,两个设备会开始计算将用于链路加密的长期密钥(LTK)。
这是配对和重新连接的最后一部分:在不同的关联模型中,通过不同的方法来验证对等设备并防止MITM攻击。
由于LTK计算对于任何低功耗安全连接关联模型都是十分常见的。因此在下一篇中,会展开detail 讨论。
根据用户体验和便利性的考量,与Passkey Entry方法相比,数值比较只需要两个按钮:YES和NO,以指示两台设备之间的6位确认制是否匹配,而不需要从0到9的数字键盘,因此可谓一项简化硬件IO能力的改进。同时数值比较仅适用于低功耗安全连接,可针对窃听和MITM提供更高一层的保护。
因此,你如果正在着手开发一款非常注重隐私,需要对蓝牙低功耗链路提供高度保护的产品,这将是一个不错的选择。