1. 程式人生 > >Mesh Profile (3.8)mesh安全性

Mesh Profile (3.8)mesh安全性

向量 ddr 永遠 nonce 而不是 忽略 開始 包含 aid

(翻譯自《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安全性