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索引恢復過程
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安全性