(翻译自《mesh Profile v1.0》3.8 Mesh security)
安全工具箱
加密功能
CMAC功能
CCM功能
s1 SALT生成功能
k1导出功能(如何理解derivation?)
k2网络秘钥导出功能
k3导出功能
k4导出功能
序列号
序列号,是一个包含在网络层PDU SEQ字段中的24bit值。主要用于避免重放攻击(replay attacks)。
相同节点中的元素可以共享也可以不共享序列号。
对于mesh网络安全很重要的是,在每一条消息的源(every message source,根据包含在SRC字段中的源地址区分)的网络层PDU中包含一个不同的序列号。
一个元素通过使用一个24bit的序列号可以在重复一个nonce之前传输16777216(2的24次方+1)条消息。
如果一个元素平均每5s钟传输一条消息,那么在重复nonce之前可以传输2.6年。
每一个元素对其生成的网络层PDU应该严格的增加序列号。
在序列号达到最大值之前,元素应该通过IV更新过程更新IV索引。这也保证了序列号永远不会重复(wrap around 环绕)
IV索引
初始化向量索引是一个32bit的值。并且他是网络中一个共享的资源。(网络中所有的节点共享相同的IV索引,并且将该IV索引用于他们所拥有的子网中。)
IV索引从0x000000开始。通过IV更新过程完成增加。
IV索引增加的时间不必精确。因为IV索引的最低有效位在每一条网络层PDU中交流。
IV索引是一个32bit的值,所以一个mesh网络可以在发生重复之前,工作接近5万亿(trillion)年。
IV索引通过安全网络beacon(Secure Netwok Beacon)在一个网络中实现共享。
一个子网中收到IV更新后处理并且在子网中传播。
IV索引更新的传播通过设备在特定的子网中使用更新后的IV索引传输安全网络beacon完成。
如果一个主子网中的一个设备收到了该主子网中的更新,该设备应该传播该更新到其他的子网。
如果一个主子网中的一个设备收到了其他子网中的更新消息,那么该更新消息应该被忽略。(即从主子网开始发起了IV索引更新)
如果一个设备从mesh网络中离开了一段时间。它可以扫描安全网络beacon或者使用IV索引恢复过程,从而自主的设置IV索引值。
Nonce(一个只被使用一次的任意或唯一的随机数)
nonce是一个13octec的值。对于每一条新的消息的加密都是唯一的。网络中使用了四种不同的nonce。nonce的类型由第一个octet决定。
0x00 网络nonce 用于网络层认证和加密的秘钥
0x01 应用nonce 用于高传输层认证和加密的应用秘钥
0x02 设备nonce 用于高传输层认证和加密的设备秘钥
0x04 代理nonce 用于代理认证和加密的秘钥
注意:TTL在网络nonce中使用而不是在应用nonce和设备nonce或者代理nonce中。这意味着当一个消息被中继进而TTL被减小时,应用和设备nonce并不发生改变,而网络nonce需要改变,从而允许TTL值的认证(?TTL值也需要被认证吗)
注意:DST在应用nonce和设备是nonce中使用而不再网络nonce中。这意味着应用或者设备消息的目的地需要被认证,而网络层目的地址被加密(?nonce是怎么使用,和认证是什么关系,和加密时什么关系?)。
秘钥
mesh规范中定义了个类型的秘钥:应用秘钥和网络秘钥。应用秘钥用于高传输层的安全通信,网络秘钥用于网络层的安全通信。
两种类型的秘钥在各个节点间共享。
还存在一种设备秘钥,它是一种特殊的应用秘钥。每个节点的设备秘钥是唯一的。只有该节点和配置客户端知道该节点的设备秘钥。设备秘钥用于节点和配置客户端之间的安全通信。
应用秘钥被绑定到网络秘钥上。这意味着应用秘钥只在它绑定的网络秘钥的上下文环境中使用。一个应用秘钥只能被绑定到一个网络秘钥上。
一个设备秘钥被绑定到全部的网络秘钥上。
下图阐述了应用秘钥绑定的实例。
设备秘钥
设备秘钥是一个访问层的秘钥,只有节点自己和配置客户端知道。
设备秘钥应该被绑定到节点知道的每一个网络秘钥上。这种绑定不能被改变。
设备秘钥由ProvisionSalt和ECDHSecret通过K1方法得到。
其中ProvisionSalt是一个公有值,ECDHSecret和DevKey是私有值。
应用秘钥
应用秘钥通过随机数生成器产生。
应用秘钥标识(AID)用于表示应用秘钥,通过对应用秘钥做K4方法得到。
网络秘钥
网络秘钥通过一个随机数生成器产生。(蓝牙核心定义的PartH,Volume2中涉及)
网络秘钥存在一种分层。如下图:
NID,加密秘钥和私有秘钥
每一个网络层PDU使用有NID,加密秘钥和私有秘钥组成的安全材料实现安全加密。
NID是一个7bit的值,标识了网络层PDU使用的安全材料。
注意:对于每一个NID最多有2121个可以使用的秘钥;因此,NID只能提供一个安全材料已经在网络层PDU被使用的指示。
主安全材料(相对于朋友安全材料而定义)由NID,加密秘钥和私有秘钥由安全凭证作为输入,通过K2函数得到。
NID || EncryptionKey || PrivacyKey = k2(NetKey, 0x00)
朋友关系中的安全材料通过朋友关系的安全凭证得到:
NID || EncryptionKey || PrivacyKey = K2(NetKey, 0x01 || LPNAddress || FriendAddress || LPNCounter || FriendCounter)
其中,
LPNAddress是建立朋友关系时朋友请求消息(Friend Request message)的源地址。
FriendAddress是建立朋友关系时朋友提供消息(Friend Offer message)的源地址。
LPNCounter是建立朋友关系时朋友请求消息中LPNCounter字段的值。
FriendCounter是建立朋友关系时朋友提供消息中FriendCounter字段的值。
对于在低功耗节点和朋友节点之间传输的网络层PDU需要用到朋友安全材料。
对于其他的网络层PDU,用主(master)安全材料。(这里主安全材料相对于朋友安全材料)
网络ID
网络ID有网络秘钥通过K3方法得到。每个网络秘钥生成一个网络ID。
这个网络ID是公有的信息。
标识秘钥(IdentityKey)
标识秘钥由网络秘钥得到。每个网络秘钥生成一个标识秘钥。
salt = s1("nkik")
P = "id 128" || 0x01
IdentityKey = k1(NetKey, salt, p)
Beacon秘钥
Beacon秘钥由网络秘钥得到。每一个网络秘钥生成一个Beacon秘钥。
salt = s1("nkbk")
P = "id128" || 0x01 // id128应该如何理解?
BeaconKey = k1(Netkey, salt, P)
全局秘钥索引
网络和应用秘钥组着在mesh网络中的两个列表中,通过配置客户端维护。
每一个列表是一个共享的mesh网络资源。并且每个列表最大容纳4096个秘钥。
秘钥通过全局的秘钥索引完成引用:网络秘钥索引和应用秘钥索引。
秘钥索引是一个12bit的值,从0x000到0xFFF。
索引是0x000的网络秘钥被称为主网络秘钥(Primary NetKey)
消息安全性
消息重放(replay)保护
消息处理流
原文地址:https://www.cnblogs.com/minnowbin/p/9823504.html