赞
踩
什么是低功耗蓝牙配对?什么又是绑定?配对和绑定有什么区别?配对有什么好处?如何删除绑定信息?如何确定配对的安全等级?just work的配对一定就不安全吗?如何开发自己的配对应用?本文将对以上问题进行论述。
Paring(配对)和bonding(绑定)是实现蓝牙射频通信安全的一种机制,有两点需要注意:
实现蓝牙通信安全,除了paring/bonding这种底层方式,用户也可以在应用层去实现相同功能,两者从功能上和安全性上没有本质区别,只不过应用层自己实现的话,需要自己选择密码算法,密钥生成,密钥交换等,如果你不是这方面的专家,你的应用就有可能会存在安全漏洞。Paring/bonding则把上述过程标准化,放在了蓝牙协议栈中,并且其安全性得到了充分评估,用户可以 “无感的” 用上安全的蓝牙通信。
Paring/bonding是蓝牙security manager(SM)的一部分,SM定义了蓝牙通信的安全框架,里面涉及安全架构,密码工具箱,paring协议等,其中paring协议是关键,所以我们经常把paring和SM二者等价,下面将对paring进行详细阐述。
°Paring(配对)
°Bonding(绑定)
°SM(security manager)
°SMP(security manager protocol)
°OOB(out of band,带外)
°Passkey
°Numeric comparison(数字比较)
°MITM(man in the middle)
°LESC(LE secure connections)
°Legacy paring
°TK(Temporary Key,临时密钥)
°STK(short term key,短期密钥)
°LTK(long term key,长期密钥)
°IRK(Identity Resolving Key,蓝牙设备地址解析密钥)
°Identity Address(设备唯一地址)
°IO capabilities(输入输出能力)
°Key size(密钥长度)
°Paring包含三个阶段:
**1、**阶段1:配对特性交换,即交换各自都支持哪些配对特性,比如支不支持SC,支不支持MITM,支不支持OOB,以及它的输入输出能力等。
**2、**阶段2:密钥生成阶段,legacy paring和LESC paring两者的区别就在这里,因此后续我们会分开阐述legacy paring和SC paring的阶段2。
**3、**阶段3:通过蓝牙空中包分发一些秘密信息。Legacy paring需要分发LTK,IRK等,而SC paring只需分发IRK。秘密信息分发之前,必须保证连接已加密。
°Paring流程如下所示:
°配对特性交换涉及三条PDU命令:
1、Paring_Request:
2、Paring_Response:
3、Security_Request:
°IO Capability占一个字节,其定义如下所示:
°AuthReq也是占用一个字节,其定义如下所示:
°根据阶段1的IO输入输出能力以及是否存在OOB,阶段2存在如下几种配对方式(或者说认证方式):
对于legacy paring,如果A和B都支持OOB,那么两者就会采用OOB方式进行配对,否则根据IO能力选择配对方式。对于SC paring,如果A或者B有一方支持OOB,那么两者就会采用OOB方式进行配对,否则根据IO能力选择配对方式。不同的IO能力对应的配对方式如下所示。
粗略来说,有认证的配对方式就具备MITM保护功能,从IO角度看,有三种配对方式:just works,passkey和Numeric Comparison,其中just works没有MITM保护功能,而passkey和Numeric comparison具备MITM保护功能。换句话说,如果你要求你的设备具备MITM保护功能,那么它必须有一定IO能力,而不能是“NoInputNoOutput”。至于OOB方式有没有MITM保护,取决于OOB通信的安全性,如果OOB通信具备MITM保护,那么蓝牙也具备MITM保护,否则就不具备。
下面分legacy paring和sc paring对配对流程进行讲解。
2.2.1 legacy paring
°Legacy paring整个配对流程是围绕STK生成来做的:
设备的认证是通过设备A和B经由TK生成一个确认数,如果这个确认数相同,则认证通过。
如前所述,legacy paring需要先生成TK,TK的生成方式取决于配对方式:
°然后生成确认数,算法如下所示:
LP_CONFIRM_I = c1(TK, LP_RAND_I, Pairing Request command, Pairing Response command,
initiating device address type, initiating device address,
responding device address type, responding device address)
LP_CONFIRM_R = c1(TK, LP_RAND_R, Pairing Request command, Pairing Response command,
initiating device address type, initiating device address,
responding device address type, responding device address)
°生成STK的算法如下所示:
STK = s1(TK, LP_RAND_R, LP_RAND_I)
°****以passkey legacy paring为例,其第2阶段全工作流程如下所示:
Just works和OOB配对流程就不再赘述了,大家自己去看一下蓝牙核心规范的说明。
对于legacy paring,如果A和B都支持OOB,那么两者就会采用OOB方式进行配对,否则根据IO能力选择配对方式。对于SC paring,如果A或者B有一方支持OOB,那么两者就会采用OOB方式进行配对,否则根据IO能力选择配对方式。不同的IO能力对应的配对方式如下所示。
2.2.2 LESC paring
°跟legacy paring不一样的地方:
LESC paring是通过Diffie-Hellman算法直接生成LTK,因此它不需要生成TK和STK。为了生成LTK,双方需要先交换公钥,流程如下所示:
以LESC Numeric comparison为例,其第一阶段认证流程如下所示:
我们还是以LESC Numeric comparison为例,其第二阶段全工作流程如下所示:
一旦LTK生成成功,主机端就可以发起加密连接流程,如下所示:
至此,LESC连接被LTK加密了,后面就可以分发秘密信息了。
°一旦连接加密了,主机和从机之间就可以分发一些秘密信息。如果是legacy paring,如下秘密信息必须分发:
°同时根据情况,legacy paring还需分发如下信息:
°对于LESC paring,秘密信息分发是可选,一般有可能分发如下信息:
如下为legacy paring可能分发的最多秘密信息的一个例子:
°如果配对的两个设备生成了LTK及其他秘密信息:
如上所述,如果配对的两个设备生成了LTK及其他秘密信息,并且把LTK及其他秘密信息保存到Flash等永久化存储设备中,那么我们就可以说这两个设备绑定成功。换句话说,paring和bonding是两个不同的概念,paring更强调认证和密钥生成,而bonding更强调密钥保存。一旦两个设备bonding成功,那么这两个设备断开再次重连的时候,主机就可以发起加密流程,从而使用paring生成的LTK对后续的连接进行加密。主机发出加密连接流程如下所示:
这里说明一下,加密连接只能由主机发出,而不能由从机发起。不过从机可以发出加密请求,主机收到从机的加密请求后,可以发起加密连接也可以拒绝其请求。如下为主机同意从机的加密请求的工作流程:
°如下为SM中用的PDU命令列表:
(注:加密连接命令属于LL控制命令,所以没有包含在其中)
°苹果手机的一点不同****:
安卓手机允许用户手动发起paring请求,而苹果手机则没有这个功能。因此,即使你的characteristic没有使能安全级别,安卓手机还是可以跟你的设备完成配对的,而苹果手机则不支持这个功能,苹果手机要不要跟设备进行配对,不能由人来控制的,只能由苹果iOS来控制。
欲触发苹果iOS发起配对请求,有两种方法:
°重连加密等级****:
绑定成功后,如果发生重连,那么主机应该自动发起加密连接请求,以对连接进行加密。一般来说,在连接没有成功加密前,主从机不要做敏感数据的交互,否则softdevice API会报NRF_ERROR_FORBIDDEN。对于有MITM保护的加密连接,在收到PM_EVT_CONN_SEC_SUCCEEDED这个事件后,设备应该去检测连接的安全等级是否符合要求,具体可参考ble_app_gls例子的做法。
°Service changed(服务改变)****:
设备跟手机绑定成功后,手机再次重连这个设备时,就会自动跳过service discovery过程,换句话说,配对的时候手机会把设备所有服务和characteristic的handle保存下来,二次重连的时候,直接用以前保存的handle值去操作设备。
有了这个characteristic,当设备的服务发生改变时,设备就可以通过这个characteristic发送一个indicate PDU给到手机,从而手机知道设备的服务已发生了改变,此时手机会重新发起service discovery流程,以重新获得service和characteristic最新的handle列表。欲添加service changed characteristic,你只需在sdk_config.h文件中打开如下两个宏:
然后当服务发生改变时,调用pm_local_database_has_changed(),协议栈就会自动发起service changed indicate PDU给手机,从而引起手机重走服务发现过程。
°删除主机端绑定信息****:
如果手机端删除了绑定信息,为了安全起见,设备端也需要跟着一起删除绑定信息,否则手机无法再次跟设备进行配对,这个是最理想的情况,但是我们有的设备没有任何输入接口,无法手动删除绑定信息,这个时候能不能有一种办法可以让手机跟设备进行二次配对呢?
if (p_evt->evt_id == PM_EVT_CONN_SEC_CONFIG_REQ)
{
pm_conn_sec_config_t cfg;
cfg.allow_repairing = true;
pm_conn_sec_config_reply(p_evt->conn_handle, &cfg);
}
这样,即使用户把手机端paring信息删掉,设备端paring信息没有删掉,手机还是可以跟设备进行二次配对的。
°删除从机端绑定信息****:
跟上面相反,如果设备端bonding信息被删除了,而手机端bonding信息没有被删除,这种情况下如何实现二次配对?
°同时绑定多个设备:
Nordic SDK是支持一个设备同时跟多个主机绑定,只要设备存储空间足够大,那么可以绑定的设备数就不设限。nRF5 SDK中bonding信息也是通过fds来存储的,也就是说绑定信息和用户Flash数据共享同一块空间,如果需要绑定多个设备,那么FDS_VIRTUAL_PAGES这个宏的值必须进行修改,以保证分配的Flash空间可以同时容纳bonding信息和用户Flash数据。
°循环绑定测试****:
很多开发者喜欢做循环绑定测试,即同一部手机不断跟同一个设备进行配对,然后删除配对信息,然后再进行配对,他们测试下来发现:
°白名单与绑定****:
虽然白名单和绑定二者没有任何联系,但是我们一般都把两者结合起来一起使用,以达到我们的使用期望。当两个设备绑定成功后,我们就可以将对方的mac地址或者IRK放入白名单中,同时开启白名单广播,这样设备只跟白名单中的主机进行连接,白名单以外的设备在controller层面就被过滤掉了,从而提高私密性以及连接效率。
这样,即使用户把手机端paring信息删掉,设备端paring信息没有删掉,手机还是可以跟设备进行二次配对的。
°删除从机端绑定信息****:
跟上面相反,如果设备端bonding信息被删除了,而手机端bonding信息没有被删除,这种情况下如何实现二次配对?
**
**
°同时绑定多个设备****:
Nordic SDK是支持一个设备同时跟多个主机绑定,只要设备存储空间足够大,那么可以绑定的设备数就不设限。nRF5 SDK中bonding信息也是通过fds来存储的,也就是说绑定信息和用户Flash数据共享同一块空间,如果需要绑定多个设备,那么FDS_VIRTUAL_PAGES这个宏的值必须进行修改,以保证分配的Flash空间可以同时容纳bonding信息和用户Flash数据。
°循环绑定测试****:
很多开发者喜欢做循环绑定测试,即同一部手机不断跟同一个设备进行配对,然后删除配对信息,然后再进行配对,他们测试下来发现:
°白名单与绑定****:
虽然白名单和绑定二者没有任何联系,但是我们一般都把两者结合起来一起使用,以达到我们的使用期望。当两个设备绑定成功后,我们就可以将对方的mac地址或者IRK放入白名单中,同时开启白名单广播,这样设备只跟白名单中的主机进行连接,白名单以外的设备在controller层面就被过滤掉了,从而提高私密性以及连接效率。
°Authenticated payload timeout****:
大家都知道蓝牙连接有一个supervision timeout时间,也就是说,当建立连接的两个设备,任何一方在supervision timeout(比如4s)时间内,没有给对方发送任何蓝牙空口包,此时认为连接已断开,并触发supervision timeout事件。
当然,如果你能保证每30s时间内,手机和设备之间肯定会有有效数据包交互,或者手机端能及时准确地发出ping request,那么上述过程就完全没有必要了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。