• ZigBee安全相关


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

    Technorati 标签:

    2. 配置

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

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

    image

    取值有以下几种情况:

       

    全局安全模式 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

    逻辑关系如下:

    image

     

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

    image

    如果没有定义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

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

    image

            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

    image

    DEFAULT_TC_LINK_KEY是在nwk_globals.h中定义的:

    image

     

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

    image

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

     

    Master_key         

    Link_Key

    信任中心

    TC_MASTER        

    TC_LINK

    应用程序

    APP_MASTER      

    APP_LINK

         

    网络安全

    标准网络密钥(NWK)

    高强度网络密钥(NWK_HIGH)

     

    image

    上述两者的最大默认值都为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的安全控制域格式如下:

    image

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

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

    image

    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和应用层中应用。

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

     

     

    image

     

    3. 网络访问控制

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

    3.1 时间窗口

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

    相关函数:

    uint8 ZDSecMgrPermitJoining( uint8 duration )

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

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

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

                

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

    3.2 地址过滤

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

     

    4.密钥更新

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

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

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

  • 相关阅读:
    Yarn&Mapreduce参数的具体含义和配置参考
    【转】用Python实现各种排序算法
    xpath表达式,提取标签下的全部内容(将其他标签过滤)
    ssh IP打通,hadoop启动失败
    windows7下安装python3的scrapy框架
    【转】git push 出现401 错误
    Linux多条指令之间;和&&
    [转]用了docker是否还有必要使用openstack?
    自动化软件部署的shell脚本
    Nginx配置教程
  • 原文地址:https://www.cnblogs.com/cherishui/p/4290379.html
Copyright © 2020-2023  润新知