馬學文
深圳市麥馳安防技術有限公司 廣東 深圳 518126
Zig Bee是一種近距離、低速率、低功耗、低成本的無線網絡技術,目前基于Zig Bee標準的無線傳感器網絡的應用越來越廣泛。但由于Zig Bee無線設備在存儲能力、計算能力及電源供電時間方面的局限性,不僅使得原來在有線環境下的許多安全方案和安全技術不能直接應用于Zig Bee網絡環境中,而且對Zig Bee網絡安全服務過程與算法提出了更高的要求。
本文的相關研究是基于TI公司的CC2530芯片方案,CC2530是用于2.4-GHz的Zig Bee 應用的一個真正的片上系統(SoC)解決方案。它能夠以非常低的材料成本構建強大的網絡節點。CC2530 結合了TI公司的業界領先的Zig Bee協議棧(Z-Stack?),提供了一個強大和完整的Zig Bee 解決方案[1]。
其中,Z-Stack對Zig Bee網絡提供了全面的安全支持,特別是CC2530 硬件支持 128bit 的AES加密算法 我們基于這個技術來論述在Zig Bee是如何實現加密從而提高網絡的安全性。
我們先看看Z-Stack的安全管理框圖,如下:

圖1 Z-Stack安全管理框圖
如上圖所示,Zig Bee的安全架構主要包含在協議棧兩個層次的安全機制。NWK層和APS層,其各自負責安全傳輸他們各自的幀,APS子層提供了建立和維護安全關系的服務。我們重點關注NWK層和APS子層:
NWK層也就是俗稱的網絡層:主要包括了配置新設備,啟動網絡,執行加入網絡,重新加入網絡和離開網絡的功能,提供尋址功能,鄰居發現,路由發現,接收控制和路由等功能。其安全性方面主要是AES-CCM*來實現[2]。
APS也就是應用層的子層:主要是提供NWK和APL之間的接口,提供數據傳輸服務和提供安全服務,設備綁定和組管理。APS層基于鏈接密鑰或網絡密鑰的幀安全性,負責向外傳出的幀和安全的接收傳入的幀以及安全的建立和管理加密密鑰所需的處理步驟。此外,在應用層的上層的ZDO(Zig Bee Device Object,Zig Bee設備對象),ZDO負責初始化APS,NWK和安全服務提供商。
了解完協議棧層面的安全機制后,我們知道任何通信數據都是以幀的格式來組織通信,Zig Bee也不例外,協議棧的每一層都有特定的幀結構,總計定義了信標幀,數據幀,確認幀和MAC命令幀四種,其目的就是實現在多噪音無線信道環境中的數據可靠傳輸。其通用結構一般分幀頭(MAC Header(MHR))、負載(MAC Payload)和幀尾(MAC Footer(MRF))三部分組成,其中幀頭是由幀控制信息、幀序列號和地址信息組成,負載是可變長度的內容,由幀類型決定,幀尾是16位的CRC校驗序列[3]。
限于篇幅,在此以NWK層的幀控制域格式為例簡單描述下幀的相關定義,例如NWK幀控制域如下,其由兩個字節組成,包括幀類型、地址和其他控制標記:
其中安全域的標志位為1時,該幀就具有網絡層的安全操作能力。在特定的安全等級上對NWK或APS幀使用安全機制,我們一般用到AES-CCM*操作模式,該模式是AES-CCM的拓展,提供認證和加密功能。Zig Bee還采用AES-CCM*來保證數據的完整性、可靠性、安全性。

0-1 2-5 6-7 8 9 10 11 12 13-15幀類型 協議版本 發現路由 多播標記 安全 源路由 目的地址 源地址 保留
發送端,將要發送的數據組織為128位的數據塊,然后進行AES-CCM*的處理,得到的是加密的128位數據和一個生成的MIC(消息完整性代碼,它是通過使用128位密鑰加密IEEE MAC幀的部分而創建的)
接收端將收到的數據去除掉MIC,然后進行AES-CCM*處理,得到解密的128位數據,并且同步校驗,來判斷數據是否完整、正確[4]。
其示意圖如下:

圖2 AES-CCM*工作流程圖
接下來,我們結合上面的理論分析,以CC2530的Zig Bee模組為例講述一下該安全機制的具體實現過程。
實際應用中,因為Z-Stack已經在網絡和應用層定義了安全管理。它包括針對關鍵進程建立和傳輸、設備管理和框架保護的方法。只要在Z-Stack開發中我們選擇使用一個公共的 Zig Bee類,那么Z-Stack就已經為其應用做出了安全決策,因為在該類中已經對安全性進行了預定義,Zig Bee主要提供三個等級的安全模式:
2.1.1 非安全模式:為默認安全模式,即不采取任何安全服務,因此可能被竊聽;
2.1.2 訪問控制模式:通過訪問控制列表(Access Control List,ACL,包含有允許接入的硬件設備MAC地址)限制非法節點獲取數據;
2.1.3 安全模式:采用AES128位加密算法進行通訊加密,同時提供有0,16,32,64,128位的完整性校驗。
我們只需要來判斷:是否需要對數據幀的載荷進行加密,以及附著在數據幀末尾的認證碼長度(8、16 或 64 位,等等)。我們還必須決定在哪個層上施加安全機制:網絡層還是應用層?如果應用需要盡可能強大的安全保護,那么就在應用層保護它。但不論哪層的安全機制,都離不開密鑰[5]。
密鑰一般分為主密鑰(兩個設備之間長期安全性的基礎,僅由APS使用)、網絡密鑰(用在廣播通信,每個節點都要有網絡密鑰才能與其他節點安全通信。由NWK和Zig Bee的APL應用該密鑰)、鏈接密鑰(用在單播通信)。
參照上圖,AES-CCM*第一步是創建密鑰,AES-CCM*是一個迭代的、對稱密鑰分組的密碼,并且用 128 位(16 字節)分組加密和解密數據。同樣在Z-Stack中采用的也是128位的加密,首先需要一個128位的Key,Key不同,加密出來的內容也不同,所以,需要在Z-Stack的配置文件f8wConfig.cfg創建密鑰,通過DEFAULT_KEY="{0x01, 0x03, 0x05, 0x07, 0x09, 0x0B,0x0D, 0x0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A,0x0C, 0x0D}"這種方式來定義,用戶只需要在此修改DEFAULT_KEY的值就可以定義自己使用的密鑰[6]。
此外,在Z-Stack中已經實現了AES-CCM*加密算法,我們只需要開啟這個服務就可以了,其開啟可以簡單地 兩步完成:
首先,將f8wConfig.cfg文件中設置為DSECURE=1,這句話的意思是DSECURE=1,這個變量在協議棧中作為if語句的條件使用,條件為真的語句中就是開啟加密算法的函數。所以要使用加密算法,第一步是要將這個參數設置為1。
其次,將ZGlobals.c中的uint8 zgPreConfigKeys = FLASE;
修改為:uint8 zgPreConfigKeys = TRUE;
如果這個值為真,那么默認的密鑰必須在每個節點程序的配置文件中配置。如果這個值為假,那么默認的密鑰只需配置到協調器設備當中,并且通過協調器節點發送給其他的節點[7]。
至此,整個加密過程結束,加密算法開啟。 我們通過sniffer抓包分析加密前后的數據格式,抓包分析:加密前和加密后的數據對比圖(上面為加密前下面為加密后)。
實際應用中Zig Bee的安全機制還有非常多的內容需要研究和關注,例如其還可以通過不同的模式進行不同的加密處理、通過不同的層進行加密等等,本文拋磚引玉論述了Zig Bee網絡組網中的安全機制及一種AES加密算法實現方法,該算法具有明顯的優勢,一方面能夠提高硬件的安全性,在數據大量涌入時,能夠高速運行,另外一方面還能夠保持軟件的使用靈活性,尤其在維護方面,具有重要的實用價值和意義。