鉴于有些群友和论坛会员想了解低功耗蓝牙的安全管理协议这方面的东西,所以我先将3.6节先发布出来。安全管理分为如下章节,会慢慢的在论坛中 展现,以及会在微信订阅号“FutureTek-2014”中慢慢呈现,
敬请期待和关注。
3.6 、 安全管理( Security Manager (SM))
我的体会是安全管理是整个协议中最难处理理解和处理的事情,
它的复杂程度有“这么”深,知道了吧!为了讲明白我也不知道该如
何是好啊!分这么几点讲吧!
为什么加密:为什么呢?安全啊!谁都不想光屁股在外面跑吧!
加密干了什么,需求什么?
加密相关计算公式
加密配对绑定过程(密钥计算)
安全管理传输协议
NRF51822 加密硬件模块介绍
NRF51822 和 IPhone4s 的空中数据分析
3.6.1 、加密做了什么和加密需求
在连接时,可通过加密来确保数据的机密性。机密性是指第三方
“攻击者”由于没有加密链路的共享秘密,因此无法拦截、破译或读
取消息原始内容。 注意:数据包的报头和长度字段不会被加密的,这
句在 4.0 的规范中找了好久。原文如下:
User information can be protected by encryption of the packet payload; the access
code and the packet header shall never be encrypted.
这有个好处是,当接收到包时可以直接分析报头判断 SN 和 和 NESN 标志。
加密数据包含一个消息完整性校验值, 表明该数据包已经过认证。
为了验明发送方的有效身份, 认证使用共享密钥为已加密的数据计算
签名,可防止第三方篡改数据包中的任何内容。通过认证,消息的接
收方能够确信收到的数据包来自一个可信设备。
加密数据包含一个数据包计数器,用来防止重放攻击。重放攻击
是指攻击者截取一个消息,随后再次发送该消息以期望收到响应。
简单来说, 1、 加密了整个发送到空中的数据, 防止窃取到原文;
2、发送到空中的包中包含有 32 位的消息完整性校验(MIC)值,这个
值能进行整个包的数据错位校验,CRC 只能检查有限的位,但是 MIC
可确保数据的正确性,在 3.6.3.3.4 节中可以知道,MIC 其实就是签名
认证;3、加密数据包中的包计数器确保数据不是由第三方伪造。
那么要完成加密需要哪些东西呢?首先需要一个密码块, 也就是
密码本,接收到的密文,通过密码本一一翻译,变为明文,在 BLE 中
的密码块,实际上是个单向函数,用于产生秘钥、加密和提供完整性
检查。这种加密引擎被称为先进加密系统(AES)。低功耗蓝牙使用 AES
的 128 位版本,也就是明文、秘钥和密文都是 128 位的。它的表达式
用式(3-1)表示:
密文=E key (明文) 或 密文=E(key,明文) (3-1)
上式是加密的发动机, 其中的密钥就是汽油了, 在 BLE4.0 的协议
中使用到大量的密钥, 而 加密 认证的整个过程几乎都是围绕怎么将两
个设备使用到的秘钥能够安全的共享, 也就是当一方把密码告诉另一
方时,始终要提防第三方也可能听得到这个密钥,一旦公共的密钥被
第三方窃取了,那么又变成光屁股在路上跑了。所以对于加密来说,
并不是加密数据有多难, 而是把需要共享的密钥安全的送到正确的设
备才是难点,这就引入了配对的复杂过程。
在 BLE 的 4.0 中主要有 5 个密钥需要共享,这些密钥传输时一次
比一次安全,有些密钥共享时并不是赤裸裸的直接传输特定密钥,而
是传输计算相应密钥时使用到的参数。这 5 个密钥如下:
临时密钥(Temporary Key:TK)
短期密钥(Short Term Key:STK)
长期秘钥(Long-Term Key: LTK)
身份解析秘钥(Identity Resolving Key:IRK)
连接签名解析秘钥(Connection Signature Resolving Key:CSRK)
3.6.2加密相关计算公式
在 4.0 的安全管理中设计到几个加密相关的计算,但是最终还是
会归到式(3-1)中的安全函数 e 中。涉及的公式如下(应用在密钥计算
章节):
ah 函数:这个函数是用来计算可解析地址中的哈希值(hash)的。
表达式为式(3-2)
ah(k, r) = e(k, r’) mod 2 24 (3-2)
其中 k =128 bits 、r = 24 bits。而 r’是将 r 高位补 0 达到 128bits。
表达式是 r’ = padding || r,padding 就是 104bits 的 0, “||”为连
接的意思。mod 2 24 目的是保留计算结果的低 24 位。
c1 函数:这是计算确认值的函数,表达式为式(3-3)。
c1 (k, r, preq, pres, iat, rat, ia, ra) = e(k, e(k, r XOR p1) XOR p2) (3-3)
其中
p1 = pres || preq || rat’ || iat’
p2 = padding || ia || ra
k = 128 bits: key 密钥
r =128 bits: rand 随机数
pres = 56 bits : pairing response command 配对应答命令
preq= 56 bits : pairing request command 配对请求命令
iat= 1 bit :initiating device address type 发起者设备地址类型
ia = 48 bits :initiating device address 发起者设备地址
rat =1 bit:responding device address type 响应者设备地址类型
ra = 48 bits :responding device address 响应者设备地址
padding = 32 bits or 0:补 0 用的掩码
s1 函数:计算短期密钥 STK 用,表达式为式(3-4)。
s1(k, r1, r2) = e(k, r’) (3-4)
其中
K= 128 bits
r1 =128 bits:这是蓝牙设备发送 128bits 的随机数
r2 = 128 bits:这是蓝牙设备发送 128bits 的随机数
r’ = r1’ || r2’,而 r1’ 和 r2’是截取 r1 和 r2 的低 64bits
dm 函数:这个函数是计算长期秘钥 LTK 中的某个参数时用到,
表达式为式(3-5)。
dm(k, r) = e(k, r’) mod 216 (3-5)
其中
k = 128 bits r= 64 bits
padding = 64 bits r’ = padding || r
d1 函数:这个函数用来计算 LTK、IRK、CSRK 和 DHK 等等密钥,
表达式为式(3-6)。
d1(k, d, r) = e(k, d’) (3-6)
其中
k =128 bits d = 16 bits
r = 16 bits padding = 96 bits
d’ = padding || r || d
3.6.3 、加密配对 绑定 过程
这里先解释一下,什么是配对和绑定,配对是找到并确定需要和
自己通信的设备,也就是身份确定,接着是将安全密钥共享,而这一
过程仅仅是由启动加密到得到短期秘钥(STK)为止(图3-66中的Phase1
和 Phase2);而绑定就是将长期秘钥(LTK)、身份解析秘钥(IRK)和连接
签名解析秘钥(CSRK)这 3 个密钥中的某个或者组合进行交换(图 3-66
中的 Phase3)后,将交换的这些密钥存储到数据库中的过程。
这里先讲明白一个事情:
配对绑定 (图 图 3-66 中的 Phase1 、Phase2 和 和 Phase3) 只有在两个
设备之间第一次进行配对时才会发生, 也就是说配对 绑定 过程只会发生在
两个设备之间第一次连 接, 那么第二次和之后的连接呢?因为有
在第一次配对 绑定 过程中有“绑定”过程,也就是 说已经将第一次的
密钥进行了存储, 如果这个存储的数据库没有人为的清空, 那么之后
的连接就不会再出现配对过程。 同时还有一个问题 是: : 并不是所有的
通信都需要加密进行数据保护, 有时应用发送的数据不怕被别人听到,
所以光着屁股跑也 是 没有关系。
配对绑定是一个三阶段的过程, 如图 3-66。 前两个阶段总是使用,
第三阶段是一个可选的传输特定密钥分配的阶段, 而这一个阶段的有
无是由第一阶段决定,也就是没有第三阶段,相当于没有需要存储的
密钥也就没有“绑定”过程。
阶段 1:配对特征交换得到临时密钥(TK)值
阶段 2:身份确认以及短期密钥(STK)生产
阶段 3:传输特定密钥
这三个阶段都有关系,第 1 阶段决定了临时密钥(TK)的生产方式,
同时也就是决定了第 2 阶段短期秘钥(STK)的生成,还决定着第 3 阶段
是否存在;而第 2 阶段从英文“Pairing over SMP”理解就是通过安全
管理协议进行配对,而实际上第二阶段过程的目的就是确定自己正在
和一个真正想要通信的设备通信,而非第三方,简而言之就是确定对
方身份。 而阶段 3 实际上属于绑定的过程,因为要存储到安全数据库
中的数据都是第 3 阶段发送的, 这个阶段传输的数据通过第 2 阶段生
成的密钥进行加密,确保共享的密钥受到保护。
欢迎关注 一个 专为 低功耗蓝牙写笔记的论坛 bbs.codertown.cn 欢迎加入蓝牙BLE4.0协议研究 177341833 一起学习和讨论 欢迎关注微信公众号 专门讲解 低功耗蓝牙4.0 协议
|