配对和绑定
为了保证低功耗蓝牙的绝大多数安全特征,必须完成两件事情:首先,必须互相配对;其次,连接一旦加密,设备必须分配用于加密、保障隐私并对消息进行验证的密钥。只要密钥被保存下来,设备就处于绑定状态了。
因此,要想了解安全是如何工作的,关键在于理解配对和密钥分配系统的工作原理。同样,明确两个设备间的初始化连接不同与二者之间的后续连接也很重要。
1.连接:通讯的基础,通讯数据为明文;
2.配对:配对仅仅是为了在连接的基础上加密(通讯数据经过加密为密文),提高蓝牙链路传输的安全性。不配对也能连接进行通信。
3.绑定:绑定是配对发起时的一个可选配置。把配对信息记录下来, 下次不用配对自动进入加密的连接;所以没在bonding列表里的设备不影响连接,照连不误。
起初未提供安全性的两个设备如果希望做一些需要安全性的工作,就必须先配对。
配对涉及两个设备的身份认证,链路加密以及随后的密钥分配,身份解析密钥等。如果配对时设置了绑定位,分配的秘钥用户可以存储在flash中这样两个设备再第二次重连时的安全启动会更快。而不需要像第一次一样需要再启动整个配对过程。
第一阶段:配对信息交换(主要就是两边设备的i/o能力,设置绑定标志,链路是否需要MITM保护,如果设置绑定分配哪些密钥等信息。)
第二阶段:链路认证(以前的静态密码,动态密码,这个输入密码的过程就是认证的一种方式。)
· 第三阶段:密钥分配
配对信息交换:
配对的第一阶段涉及配对信息的交换,该信息用于确定设备的配对方式,以及确定在最后的阶段将会分配哪些密钥。
两台设备间配对信息的交换是通过配对请求(PairingRequest)和配对响应(PairingResponse)数据包实现的。这两种信息的内容请参考表1:配对请求/响应。
*位顺序从LSB到MSB。
· “代码”
· IO 功能
两端设备的输入输出能力如:是否有显示屏,键盘等。
· OOB DF(OOB Data Flag)
OOB即Out-of-Band的缩写,意为“带外”,采用外部通信方法交换一些配对过程中使用的信息。OOB媒体可能是任何一种能够传输相应信息的其他无线通信标准,如NFC或二维码。
· BF(Bonding Flags)
绑定(Bonding)是配对发生之后的长期密钥交换,并将这些密钥储存起来以供日后使用——即在设备间创建永久的安全连结。配对机制是绑定的前提。
· “MITM”
MITM是“Man-In-The-Middle(中间人)”。这一字段是1比特位的标识,如果设备需要MITM保护,则设置为1。如果需要输入密码就置1。
· “SC”
SC(LESC) 字段是1比特位的标识,设置为1,以请求低功耗安全连接配对。可能的配对机制结果是:如果两台设备均支持低功耗安全连接,则采用低功耗安全连接;否则采用低功耗传统连接。因此这一标识是决定第二阶段配对方法的一项指标。
· “KC”
按键字段是1比特位的标识,只用于万能钥匙进入协议,在其他协议中可忽略。万能钥匙进入是传统配对和安全连接的典型配对方法。这部分在下一篇博文中会进行讨论。
· “最大加密密钥规模”
最大密钥规模范围为7-16个八位字节。
· “发起者密钥分配”&“响应者密钥分配”
链路认证
密钥分配
配对触发方式:
1、 主机直接发起配对请求
2、从机直接发安全请求。如果之前绑定过,那么主机会直接用保存的LTK加密链路,如果没有那么主机会发起配对请求。
3、BLE中有一个安全模式的概念。当某个属性被设置为需要认证的加密链路访问时,那么当在主机访问从机的属性时,如果链路是不安全的就会返回错误,然后主机会发起配对请求从而实现安全请求。(属于被动等待主机触发方式,所以需要将一些属性设置为需要安全链路才能访问,手机在访问时就会触发配对过程了)
密钥生成方法
低功耗传统配对:
·直接连接(Just Works)
·万能钥匙(Passkey Entry)
·带外数据(Out-of-Band,简称OOB)
低功耗安全连接,除了以上三种方法以外,还增添了一种新方法:
·数值比较(Numeric Comparison)
第1步:查看配对特性交换框架中的安全连接位。如果双方的安全连接位都等于1,则采用低功耗安全连接,并进入第2步。否则采用低功耗传统配对,并进入第3步。
第2步:当选用低功耗安全连接时,发起设备和响应设备应遵循如下矩阵选择配对方法:
·“查看MITM”意为忽略“OOB”,查看MITM标识
·“使用IO功能”,进入第4步,根据双方设备的IO功能选择密钥生成方法
第3步:当选用低功耗传统配对(Legacy Pairing)时,发起设备和响应设备应遵循如下矩阵选择配对方法:
·“查看MITM”意为忽略“OOB”,查看MITM标识
·“使用IO功能”,进入第4步,根据双方设备的IO功能选择密钥生成方法
第4步:以下是IO功能和密钥生成方法的映射。根据下面这张图表,发起设备和响应设备双方就能根据他们的配对特性找到适合的连接方法。
绑定真正来说属于通用访问规范的讨论范畴。绑定指的无非是将密钥及相关身份信息保存到数据库中。如果设备不保存这些值,他们虽然能匹配,但不能绑定。只要当中某一个设备不保存,重新连接后,只有一个设备拥有LTK,因此加密的启动将会失败。
为了避免这种情况,两个设备在最初配对时就会交换绑定信息,从而能够清楚地知道对方是否保留了该绑定信息。如果对方设备不保存信息,那么一旦启动加密的尝试失败,主机将试图再次配对。
绑定的相关知识:
绑定并不是一个独立存在的过程。 可以理解成 配对有两种方式, 没有设置绑定表示的配对请求和设置绑定标志的配对请求。
配对的目的就是单纯的加密链路,但是配对过程比较耗时(包括配对信息交换,用户输入配对码或带外传输配对码,协议层的配对确认交换和随机数交换以及确认验证,都没问题后才会生成链路加密秘钥来加密链路),如果为了数据始终都是加密传输而每次连接都去配对的话就比较麻烦,所以又定义了一个绑定过程,绑定过程是在 配对后链路加密的情况下 分发一个 LTK(其他秘钥这里不涉及),这个LTK就可以供以后直接加密链路,而不用进过繁琐的配对过程。
总结
1.配对认证:主从机一方提供密码,一方输入密码,如果双方密码一致,那么此密码将作为TK(临时密码);
2.加密链路:利用得到的TK(临时密码)等信息计算出STK(短期密码)用来做加密认证;
3.绑定:加密认证通过后,利用STK等信息生成LTK(长期密码),把LTK保存下来,用于下次连接时做加密认证,不需要再次配对就可以加密链路,这就是绑定了;
绑定后通讯过程 : 每次连接时,从机会向主机发送安全请求,如果主从机相互绑定过,主机不会发送配对请求,主机直接利用绑定时保存的LTK发送加密请求,从机也会利用绑定时保存的LTK来做加密回复,三次握手成功后(加密成功,三次握手通讯由底层完成,用户不可见),从机回复主机加密状态success。