Mesh Profile (3.8)mesh安全性

(翻译自《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)保护

消息处理流

猜你喜欢

转载自www.cnblogs.com/minnowbin/p/9823504.html
今日推荐