热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Zigbee安全入门(一)——技术介绍和安全策略

么是Zigbee?Zigbee说白了就是类似wifi、蓝牙的一种交换数据的方式,学术点说就是低成本、用于低功耗嵌入式设备(无线电系统),用以促进机器与机器之间高效且有效通信(通常相

么是Zigbee?

Zigbee说白了就是类似wifi、蓝牙的一种交换数据的方式,学术点说就是低成本、用于低功耗嵌入式设备(无线电系统),用以促进机器与机器之间高效且有效通信(通常相距10-100米)的无线技术。它建立在IEEE802.15.4的基础上,比起蓝牙,它能建立更大的网络(蓝牙的piconet最多支持7个设备),比起wifi,它虽然速度差很多,但功耗相应的也要低不少,因此它非常适合家庭、工厂等应用场景。小米近期推出的家庭网关设备也正是因为Zigbee的这些优势才选择了这项技术。

上面提到的IEEE的802.15.4主要是定义了协议栈的PHY层和MAC层,而Zigbee则是在其基础上建立了完整的协议栈。之后我们会对Zigbee的每一层再进行详细的说明。

技术分享图片

Zigbee将设备划分成了三类,协调器(Coordinator)、路由器(Router)、终端(EndPoint或是EndDevice)。



  • 协调器是整个Zigbee网络的发起者、管理者,功能包括:对网络进行初始化,包括制定网络的信道、PANID(网络的标识符,比如一个信道内可以存在多个Zigbee网络,每个网络就由PANID来区分);配置网络的安全级别和配置信任中心的地址(默认是协调器自己,且每个Zigbee网络只能有一个信任中心),信任中心用来分发网络和端到端应用程序配置管理的密钥,当一个路由器想要加入网络,也需要信任中心的许可;维护当前关联的设备信息。如图,可以在给的Sample中Tools目录下的f8wConfig.cfg中修改信道和PANID

技术分享图片



  • 路由器负责在终端设备之间或终端设备与协调器之间路由数据包,同样需要维护当前关联的设备的信息,而且它作为网络的连接点,是不能休眠的。

  • 终端负责感知信息,它不允许其他设备关联自己,相当于树的叶子

Zigbee常见的网络拓扑结构主要有一下几种

技术分享图片

图中提到的PAN协调点也就是协调器的意思,FFD(FFD-Full Function Device全功能设备)即可以当做三类设备中任一一类使用的设备,而RFD(RFD-Reduced Function Device精简功能设备)则只可以当做终端使用。实际上我们一般买到的都是FFD,只是在将代码导入设备时,根据选择的不同编译器会做不同的处理,最终生成三类不同的设备,如图,在IAR中可以直接修改

技术分享图片

Zigbee采用short地址方式标识网络内的设备,short地址是16位的,是由所属的网络分配的,类似我们网卡的ip地址,要注意因为short地址只有16位,所以Zigbee的最大接入设备数是65535。

 


Zigbee的协议栈

上面说了Zigbee的协议栈是在IEEE802.15.4的基础上建立的,那么要搞懂Zigbee的协议栈就要首先把15.4给搞明白,这就要涉及到无线网络的知识了。

首先是802协议的相关内容,15实际上是WPAN(wireless personal area network无线个域网),也就是为了实现近距离通信而设置的,其中15.1就是我们熟悉的蓝牙,15.4是zigbee,而我们最了解的wifi其实是802.11,也就是WLAN(Wireless Local Area Network 无线局域网)。

由于这部分内容居多无比,所以本文只概括性的进行一下解释,具体的各层分析会放在以后的文章中

技术分享图片


物理层(PHY)

它指定了Zigbee使用的是2.4GHz物理层和868、915MHz物理层,均基于直接序列扩频(DSSS)技术。而DSSS技术有如下两个特点:



  • DSSS使用一串连续的伪随机码(pseudonoise, PN)串行,用相位偏移调制的方法来调制信息。这一串连续的伪随机码称为码片(chips),其每个码的持续时间远小于要调制的信息位。即每个信息位都被频率更高的码片所调制。因此,码片速率远大于信息位速率。

  • DSSS通讯架构中,发送端产生的码片在发送前已经被接收端所获知。接收端可以使用相同的码片来解码接收到的信号,解调用此码片调制过的信号,还原为原来的信息。

该层最主要的任务就是在两个对等MAC实体间提供可靠链路,它提供PHY数据服务和PHY管理服务两种服务,PHY数据服务使PHY能通过物理无线信道传输和接收PHY协议数据单元(PPDU);PHY管理服务为PLME(这是一个管理该层的实体,可以通过调用它提供的接口对该层进行管理)提供的接口。


MAC层

在《计算机网络》这门课中我们学过非常经典的CSMA/CD(也就是多点接入、载波监听、碰撞检测)来避免线缆传输信息时造成的碰撞,实际上这是定义在802.3的内容,它定义了MAC通过这种方式来避免冲突。但上面提到了“线缆”二字,也就是说这玩意是针对有线网络而言的,实际上它是通过电压变化检测来冲突,那么问题来了,我现在是无线网络,这上哪检测电缆电压去?所以这里我们换了一种想法,我们不再去检测它是不是冲突了,而是尽可能避免冲突,这也就是CSMA/CA(多点接入、载波监听、碰撞避免)。Zigbee的802.15.4和wifi的802.11都是在MAC层通过这种办法来避免冲突的。

我们需要关注的还有安全性的问题。上层会将MAC层的默认密钥设置为网络的密钥,而MAC层则会将上层的链接密钥设置为自己的链接密钥。此外,MAC层采用cbc-mac来进行加密。(关于各类密钥的说明见下文)

同样,MAC也提供了MAC数据服务和管理服务,也有管理实体,叫做MLME

以上是对802.15.4规定的层的简单说明,以下便是Zigbee建立的上层


网络层(NWK)

网络层向上通过NLDE实体与应用层联系,通过NLME管理该层,主要包括了配置新设备,启动网络,执行加入网络,重新加入网络和离开网络的功能,提供寻址功能,邻居发现,路由发现,接收控制和路由等功能。安全性方面主要是AES-CCM*


应用层(APL)

由上面的图可以看出该层主要分为两部分,一是APS,也就是应用支持子层,二是一堆的object。

APS目的是为了提供NWK和APL之间的接口。和其他层一样,同样提供了两项服务,一是APSDE在应用实体之间提供数据传输服务,二是APS管理实体APMSE,主要是提供安全服务,设备绑定和组管理。APS层基于链接密钥或网络密钥的帧安全性。APS层负责安全的传输向外传出的帧和安全的接收传入的帧以及安全的建立和管理加密密钥所需的处理步骤。上层通过向APS层发布原语来控制加密密钥的管理。

一堆的object则又可以分为两部分,一部分是254个用户可以自己选用的应用object,他们通过绑定端号实现,实际上就和我们在计算机上常说的端口类似,应用间的通信也是基于端号实现的;另一部分是ZDO(Zigbee Device Object,Zigbee设备对象),ZDO负责初始化APS,NWK和安全服务提供商。它组装了来自末端应用程序的配置信息,来确定和实现设备和服务发现,安全管理(密钥加载,密钥建立,密钥传输和身份验证),网络管理(网络发现,离开/加入网络,重置网络连接和创建),绑定,节点和组管理,负责管理设备的安全策略和安全配置。

 


Zigbee安全策略


Zigbee安全密钥

上文中我们提到了链接密钥和网络密钥,但并没有具体解释到底是什么,这里我们就来详细说明一下。



  • 主密钥:构成两个设备之间长期安全性的基础,仅由APS使用。

  • 网络密钥,主要用在广播通信,每个节点都要有网络密钥才能与其他节点安全通信。可以是通过密钥传输(网络设备向信任中心发出请求,要求将密钥发送给它)获得,或者是预安装(制造商将密钥安装到设备本身,用户进行选择)获得,由NWK和ZigBee的APL应用该密钥

  • 链接密钥,主要用在单播通信,当节点与节点应用通信时,信任中心会生成一个链接密钥并通过网络密钥加密发送至节点,也被叫做唯一密钥;而节点在加入网络时信任中心会给它分配与信任中心通信的链接密钥,这叫做全局密钥。当然,也可以用过与安装的方式获得。链接密钥比起网络密钥多了一种获得方式——密钥构造。所谓构造就是通过主密钥和其他参数算出来一个链接密钥出来,这样就可以避免了服务之间可能存在的冲突和安全隐患(毕竟算出来,你是你,我是我,井水不犯河水)默认的全局信任中心链路密钥由ZigBee联盟定义。如果应用程序在加入时未指定其他链接密钥,则默认值为5A 69 67 42 65 65 41 6C 6C 69 61 6E 63 65 30 39


Zigbee安全模型

Zigbee支持两种不同的网络安全管理方式,主要区别就是新设备的处理方式和信息的保护,我看大佬们将它翻译为安全模型,那我也就这样用了……

技术分享图片

如图为集中式安全模型,这种模型需要我们上面提到过的信任中心来负责安全事务。我们可以通过协调器来指定信任中心或默认使用协调器作为信任中心。当有一个新设备要加入网络时,首先在配置信息添加新设备的信息,然后为该设备建立唯一的信任中心链接密钥(也就是在MAC层我们提到过的链接密钥),以实现与信任中心的通信。

建立的过程主要是根据安装码,安装码说白了就是一串通过16位循环冗余校验的128位随机数字,信任中心会通过Matyas-Meyer-Oseas(MMO)哈希函数从安装码派生唯一的128位信任中心链接密钥

信任中心会维护一个网络密钥用来加密信息,并且定期或根据需要切换,来保证网络信息的安全性。

另外,在集中式模型中,可以使用基于证书的密钥建立协议(CBKE)来分发密钥。可以根据制造时存储在两个设备中并由证书颁发机构(CA)签名的证书与信任中心协商对称密钥。

我们提到的大多数技术也是在此模型上建立的。

技术分享图片

如图为分布式安全模型,最主要的就是信任中心被“分散”了,负责安全的成了路由器,路由器来注册接入网络的设备,链接密钥在加入网络时各设备预先配置,而网络密钥由路由器分发给接入的设备,并且同一网络使用同一密钥。


Zigbee安全措施

上文提到了Zigbee采用了AES-CCM*的来保证数据的完整性、可靠性、安全性。



  • 发送端,将要发送的数据组织为128位的数据块,然后进行AES-CCM*的处理,得到的是加密的128位数据和一个生成的MIC(消息完整性代码,它是通过使用128位密钥加密IEEE MAC帧的部分而创建的)

  • 接收端将收到的数据去除掉MIC,然后进行AES-CCM*处理,得到解密的128位数据,并且有生成了一个MIC,检查这个MIC和接收的MIC是否一致即可判断数据是否完整、正确。

技术分享图片

上文讲述了设备加入集中式安全模型的网络时信任中心会给予其一个链接密钥,Zigbee通过住宅模式和商业模式进行不同的处理



  • 住宅模式,新加入的设备有可能没有网络密钥,没有受保护的链路,但是还是要接收信任中心的链接密钥,这时候就是不安全的发送了;当然,如果有网络密钥的话,会等待信任中心的消息,通过这条特殊的消息确认信任中心的地址,然后在进行相应的设置。

  • 商业模式,信任中心通过不安全的方式向加入设备发送一个主密钥,然后双方通过密钥建立协议(SKKE),然后建立链接密钥。

Zigbee还在预防重放攻击(啥是重放攻击这里就不再展开了)上做了很多工作。Zigbee的每个节点维护了一个32位的帧计数器,数据包每次传递时它就会自增,同时它也会跟踪自己连接设备的帧计数器,当发过来数据包,上一个的帧计数器还是和自己相同或者甚至还比自己小,那就说明有问题了,于是就把这个包丢掉。

上文我们还说到了Zigbee会更新自己的网络密钥。当信任中心认为该更新网络密钥时,它先生成一个新的密钥,然后借助旧的密钥加密分发给其他节点,并将节点的帧计数器清0。注意,新网络密钥建立存在延时,节点仍旧会保持旧的密钥一段时间。


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
单身男人adgjm
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有