码迷,mamicode.com
首页 > 其他好文 > 详细

Mesh Profile (3.8)mesh安全性

时间:2018-10-21 00:53:46      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:不能   att   安全加密   相同   攻击   包含   四种   offer   功能   

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

 

消息处理流

 

Mesh Profile (3.8)mesh安全性

标签:不能   att   安全加密   相同   攻击   包含   四种   offer   功能   

原文地址:https://www.cnblogs.com/minnowbin/p/9823504.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!