ZigBee安全由AES加密算法和CCM操作方式作为安全方案,广泛使用在ZigBee联盟的通信协议中。ZDO层负责安全策略和安全配置的管理。

Technorati 标签: ZigBee 安全

2. 配置

在Z-Stack协议栈中,安全网络配置默认是关闭的,如需开启,将SECURE设置为非0即可。

全局变量zgSecurityMode表示设备默认的安全模式

取值有以下几种情况:

   

全局安全模式 ZG_SECURITY_MODE

模式含义

SECURE =0

ZG_SECURE_DYNAMIC=0

ZG_SECURITY_NONE

 

SECURE非0

定义TC_LINKKEY_JOIN

ZG_SECURITY_SE_STANDARD

 

SECURE非0

定义了ZIGBEEPRO

ZG_SECURITY_PRO_STANDARD

Pro基本的安全设定

SECURE非0

其他

ZG_SECURITY_RESIDENTIAL

住宅安全相关

 

1. 没有定义ZG_SECURE_DYNAMIC或者定义了ZG_SECURE_DYNAMI并且赋值为1

     如果定义SECURE并且zgSecurityMode不为ZG_SECURITY_NONE,那么ZG_SECURE_ENABLED就定义为1,否则为0.

     ZG_CHECK_SECURITY_MODE定义为   zgSecurityMode本身。

2. 如果ZG_SECURE_DYNAMIC没有定义为1,而是定义为其他值,

     ZG_SECURE_ENABLED为SECURE值

     ZG_CHECK_SECURITY_MODE为    ZG_SECURITY_MODE

逻辑关系如下:

 

默认密钥(defaultKey,也称为网络密钥),可以选用默认的,也可以自己定义。定义了DEFAULE_KEY时,选用默认秘钥,默认秘钥在f8wConfig.cfg文件里面。

如果没有定义DEFAULT_KEY的话,使用的密钥在nwk_golbals.c中的defaultKey数组中。

 

1. Default_Key密钥有两种使用方式。

zgPreConfigKeys设为TRUE时,预先配置到网络上的每个设备

zgPreConfigKeys设为FALSE,只配置在协调器上,然后明文分发给入网设备。这种缺点是,加入网络的期间成为”瞬间的弱点”,此时的密钥是明文传递的,容易被竞争对手通过侦听获取。

 

2. 协调器可以通过任何逻辑方法决定一个设备是否允许加入这个网络。

        2.2通过修改ZDSeeMgr.c文件中的函数来实现自定义策略。

              加入策略修改,ZDSecMgr.c文件中的ZDSecMgrDeviceValidate函数

  ZDO接收到ZDO_NEW_DEVICE消息时,触发下面的调用流程。

ZDSecMgrNewDeviceEvent()

           ---->ZDSecMgrDeviceNew()

             ---->ZDSecMgrDeviceJoinDirect()

                ------>ZDSecMgrDeviceJoin()

                    ----->ZDSecMgrDeviceValidate()

 

 

        2.1加入时间窗口设置函数ZDSecMgrPermitJoining

        此函数和允许加入命令请求相关联。

        ZDO_ProcessMgmtPermitJoinReq

            --->ZDSecMgrPermitJoining

 

3.  协调器可以根据自己的判断更新通用网络密钥

     ZDO安全管理器(ZDSecMgr.c)通过

功能说明:加载一个新的NWK Key,并且触发网络密钥更新。允许协调器向网络中的所有设备广播新的网络密钥,此时,新的网络密钥将作为替代密钥保存在所有网络设备中。当协调器调用ZDSecMgrSwitchNwkKey时,一个全网范围内的广播将触发所有设备使用替换密钥。

ZDSecMgrUpdateNwkKey(key,keySeqNum,dstAddr)

     |----------->AddrMgrEntryGet

     |----------->APSME_TransportKeyReq

     |----------->SSP_UpdateNwkKey

     |----------->ZDApp_NVUpdate

 

功能说明:通过网络命令,更改使用的NWK密钥

ZDSecMgrSwitchNwkKey(keySeqNum,dstAddr)

    |--------------->AddrMgrEntryGet

    |--------------->APSME_SwitchKeyReq

    |--------------->SSP_SwitchNwkKey

    |--------------->ZDApp_NVUpdate

 

与安全相关的文件有,ssp.h,ssp_hash.h, nwk_global.c,

nwk_global.c中定义了默认的TCLinkKey:

DEFAULT_TC_LINK_KEY是在nwk_globals.h中定义的:

 

密钥类型(ssp.h文件中):

这六个密钥,可以划分为三类,

 

Master_key         

Link_Key

信任中心

TC_MASTER        

TC_LINK

应用程序

APP_MASTER      

APP_LINK

     

网络安全

标准网络密钥(NWK)

高强度网络密钥(NWK_HIGH)

 

上述两者的最大默认值都为3

 

下面介绍每种密钥的使用场景:

1.TC_MASTER

    由ZDO的事件处理循环ZDApp_event_loop里面的ZDApp_ProcessSecEvent来处理。

向ZDO发起ZDO_NEW_DEVICE事件,会触发新加入设备的请求。

        ZDSecMgrNewDeviceEvent()

           ---->ZDSecMgrDeviceNew()

             ---->ZDSecMgrDeviceJoinDirect()

               ---->ZDSecMgrDeviceJoin()

                 ---->  

 

2. TC_MASTER

    向ZDO的发起ZDO_SECMGR_EVENT事件,会触发安全管理事件,不断配置所有调用

ZDSecMgrEvent()

        ---->ZDSecMgrDeviceCtrlHandler() 设备控制命令

            ZDSECMGR_CTRL_TK_MASTER:ZDSecMgrSendMasterKey 对待入网的设备发送主密钥

            ZDSECMGR_CTRL_SKKE_INIT   : ZDSecMgrEstablishKey    对待加入的设备启动SKKE模式

             ZDSECMGR_CTRL_TK_NWK     : ZDSecMgrSendNwkKey   对带入网的设备发送网络密钥

          ---->

ZDSecMgrDeviceCtrlSetup -->ZDSecMgrDeviceCtrlHandler--->ZDSecMgrSendMasterKey

 

安全相关初始化

main()----->zginit()--->zgPreconfigKeyInit()--->

 

ZDOInitDevice()----->ZDApp_SecInit()---->ZDSecMgrInit()

                                                    ---->ZDSecMgrReadKeyFromNv()

                                                    ---->SSP_UpdateNwkKey()              设置另一个network key

                                                   ----->SSP_SwitchNwkKey()               激活新设置的network key

 

 

 

 

Z-Stack加密算法的开启方法

1. 将f8wConfig.cfg文件中设置为-DSECURE=1

2. 将ZGlobals.c中的zgPreConfigKeys修改为TRUE,表示

 

 

功能说明:向一个指定目的地址请求应用密钥

ZDSecMgrRequestAppKey(partExtAddr)

    |------------>

 

数据链路层通过建立有效的机制保护信息安全。在每个数据帧中,如果开启了安全模式,则会传输安全帧。

在MAC层的FrameControl.SecureityEnabled位控制MAC层的安全(1:安全,0:非安全)。

MAC的安全控制域格式如下:

第一个字节为安全控制域,格式如下:

前三位定义了8种安全级别,分别定义如下:

MIC提供数据的可靠性验证,有32位,64位和128位。ENC提供数据的保密性,包括32位,64位和128位。

Key Identifier Mode有0 , 1 ,2 ,3。关系到Key键值的确定。0:Key由接收帧的帧头来决定。1:由Key Identifier Field子域一个字节结合macDefauleKeySource来决定。

2:Key由4字节的Key Source subfield域和1字节的Key Index Identifier子域来决定

3:Key由8字节的Key Source subfield和1字节的Key Identifier field来决定。

IEEE 802.15.4标准使用的MAC层是CCM模式,CCM为一种通用的认证和加密模式,

 

网络层的加密,在传送过程中,一般使用链接密钥对数据进行加密处理,如果连接密钥不可用,那网络层将利用网络密钥进行保护。

 

网络层对安全管理有责任,但是它存储开销更小,NWK对安全管理有责任,但其上一层控制着安全管理。

 

ZigBee采用三种基本密钥,分布为网络密钥、链接密钥和主密钥。它们在数据加密过程中使用。

网络密钥可以在MAC、NWK和应用层中应用。

主密钥和连接密钥可以在应用层及其子层中使用。

 

 

 

3. 网络访问控制

协调器有多种策略来决定是否允许设备入网。

3.1 时间窗口

协调器开启一个时间窗口,在此时间内,允许设备入网,时间到了后关闭窗口,之后,禁止设备入网。

相关函数:

uint8 ZDSecMgrPermitJoining( uint8 duration )

输入参数:0x00-->不允许设备加入

              0xff--->始终允许设备加入

             0x01~0xfe---->在指定时间内允许设备加入

            

全局变量ZDSecMgrPermitJoiningEnabled为真时,允许设备加入。

3.2 地址过滤

协调器根据请求入网设备的IEEE地址来决定是否允许设备入网。

 

4.密钥更新

协调器可以随时更新网络密钥,有几种策略来实现。一是设定为周期性更新网络密钥。二是通过用户输入指令来更新网络密钥。

ZDSecMgrUpdateNwkKey:允许协调器将新的网络密钥广播给网络中的所有设备。

ZDSecMgrSwitchNwkKey:进行全网的广播,触发所有设备进行密钥更新。此时的密钥是预先存在设备的flash上的。

ZigBee安全相关的更多相关文章

  1. 【转】zigbee终端无法重连的问题解决

    zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...

  2. 【转】ZigBee终端入网方式深入分析

    前述 继之前对终端Direct Join的分析,发现很多东西还很模糊,存在很多问题.终于找到时间继续深入挖下去,这次应该比较完整地搞清了终端的入网机制,并纠正之前的几个认识偏差. 由于Z-Stack网 ...

  3. 【转译】加入ZigBee联盟,共画物联网的未来

    Zigbee联盟是物联网全球革命的领导者,创造了随心控制的时代.Zigbee简化了无线产品的整合.加快了市场化,同时让那些希望引入高能效的无线控制的厂商,降低了成本和风险.我们的联盟成员在开放的全球环 ...

  4. [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

    说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...

  5. zigbee 路由节点丢失后清除 该节点的残余网络信息

    清除脱离网络的 路由节点(stale device)的 残留在各表中以AssociationDevList为例的残余信息. 如图所示拓扑结构中: 路由器1脱离网络后,通过协调器按键操作来  清除 协调 ...

  6. 【转】ZigBee是如何组网的?

    组网方案设计:组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点(路由器或终端)加入网络,其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 一.网络初始化:  ...

  7. 关于zigbee 网络拓扑节点数量的一点说明

    理论上,一个zigbee网络可以存在65535个节点,即一个协调器下挂这么多个节点(ZR & ZE),但是实际应用中几乎是不可能达到的,达到100~200已经是很不错了,达到300几乎也是凤毛 ...

  8. MySQL 5.7 学习:安全相关特性

    背景: 继上次介绍 初识 MySQL 5.6 新功能.参数完之后,刚好MySQL 5.7又GA了,在官方测试里看到,MySQL5.7在功能.性能.可用性.安全和监控上又提升了很高.现在看看和MySQL ...

  9. zigbee学习之路(十五):基于协议栈的按键实验

    一.前言 经过上次的学习,相信大家已经初步学会使用zigbee协议进行发送和接受数据了.今天,我们要进行的实验是按键的实验,学会如何在协议栈里实现按键中断. 二.实验功能 在协议栈上实现按键中断,BU ...

随机推荐

  1. CentOS 7 ibus 导入第三方词库

    CentOS 7 自带的输入法是ibus默认有带拼音输入法“Intelligent Pinyin 1.6.91“,但是在使用过程中发现很多词汇没有.所以就想捣鼓一下,怎么把像搜狗或者其他输入法的数据库 ...

  2. iLinuxBot: Designing Botnets to Manage Linux Clients

    转:http://www.linuxforu.com/2012/05/ilinuxbot-designing-botnets-to-manage-linux-clients/ By Nishant S ...

  3. C++与正态分布

    正态分布(Normal distribution)又名高斯分布(Gaussiandistribution).若随机变量X服从一个数学期望为μ.方差为σ^2的高斯分布,记为N(μ,σ^2).其概率密度函 ...

  4. Emmet语法

    子代:> 如:div>ul>li <div> <ul> <li> </li> </ul> </div> 兄弟: ...

  5. 讲讲你不知道的 ARC (一)

    来源:伯乐在线 - 酷酷的哀殿 链接:http://ios.jobbole.com/89420/ 点击 → 申请加入伯乐在线专栏作者 内容提要 通过阅读本篇文章,希望您能了解:如何在 ARC 下,强制 ...

  6. 浏览器显示本地照片 image

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  7. Java中ThreadLocal的设计与使用

    早在Java 1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择.使用这个工具类可以很简洁地编写出优美的多线程程 ...

  8. hadoop下的Pipes(用C++进行hadoop程序开发)

    说明:这篇博客来自我的CSDN博客:http://blog.csdn.net/lxxgreat/article/details/7755369 经过一上午的努力,终于以伪分布式模式运行了C++版的Ma ...

  9. u163是什么故障 佳能MX328 u163是什么意思?墨水打完了,我加了墨水后还是显示U163(请检查墨水-彩色)警告灯亮

    U163:墨水已用完.请更换墨盒,然后关闭“扫描单元”(“机盖”).如果打印正在进行并希望继续打印,请在不取出墨盒的情况下按 [Stop] (停止) 按钮至少 5 秒. 然后可以在墨水用完的情况下继续 ...

  10. Flask-在浏览器中直接显示文本文件中的内容

    目录结构: project├── info.json├── run.py└── static       └── readme.txt # 直接返回static目录下的文件内容 @app.route( ...