概述

Z-Stack Mesh 1.0.0支持128bit的AES对称加密算法,ZigBee协议栈为了避开相同设备的干扰,同时也为了防止数据包被其它设备监听,所以采用了AES加密技术将数据加密,提高数据的安全性。

AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它是为人们所公认的加密包括金融、电信和政府数字信息的方法。AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。

简单来说,就是用一个128位的KEY(密钥),通过AES加密算法加密要发送出去的数据,当目标设备收到加密的数据后,再通过一个同样的128位的KEY(密钥)来解密,就能获取到原数据了。这样即使有人通过抓包工具抓到了我们的数据包,可是没有解密的密钥也是无法得知我们发送的原数据的。而且不同密钥的设备即使入网了也无法通信,设备收到通信消息后会在网络层进行解析,解析失败后会自动丢弃此消息,不会上传到应用层。

加密方式

Z-Stack的加密方式有两种,一种是直接在协调器和入网节点中设置相同的 “网络密钥(NWK KEY)”加密;另一种是协调器在设备入网时将“网络密钥”发送至入网设备,则入网设备以后的消息都使用此“网络密钥”来进行加密。

预设置网络密钥加密

“预设置网络密钥”是在编程的时候直接将“网络密钥”写入到协调器和入网设备的代码中,使得两个设备在一开始通信的时候就使用设定好的“网络密钥”对数据包进行加密和解密。这种加密方式很安全,只有开发者才知道“网络密钥”是多少,协调器从一开始就使用“网络密钥”加密消息,使得别人也无法通过抓包来解析数据。

使用方法:将协调器和入网设备工程“f8wConfig.cfg”文件中的“-DSECURE”设置为1,再设置相同的默认网络密钥“-DDEFAULT_KEY” (16个字节);最后将“ZGlobals.c”文件中的“zgPreConfigKeys”设置为“TRUE”,表示网络密钥是直接预配置在设备当中的。

快速应用:

步骤 执行设备 执行项目
开启安全加密功能 协调器/入网设备 将“f8wConfig.cfg”文件中的“-DSECURE”设置为1
设置相同的默认网络密钥 协调器/入网设备 将“f8wConfig.cfg”文件中的“-DDEFAULT_KEY”设置为相同值,
例如:-DDEFAULT_KEY=”{0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0D}”
将配置密钥方式设置为预配置在各设备中 协调器/入网设备 将“ZGlobals.c”文件中的“zgPreConfigKeys”设置为“TRUE”

协调器传输网络密钥加密

“协调器传输网络密钥”是在入网设备入网后协调器通过“Transport key”命令将“网络密钥”发送给入网设备,入网设备收到后则以后的消息都是用此“网络密钥”来进行加密处理。这里还涉及到另外一个密钥,那就是“TC LINK KEY”。如果协调器和入网设备都开启了“TC_LINKKEY_JOIN”功能,则协调器会使用“TC LINK KEY”来加密“Transport key”命令,使得别人无法通过抓包解析“Transport key”命令得知“网络密钥”;而在入网设备中设置相同的“TC LINK KEY”,当它在收到“Transport key”命令后再使用“TC LINK KEY”解密,从而获得“网络密钥”。

未开启“TC_LINKKEY_JOIN”功能时,“Transport key”命令的抓包:
传感器网络加密设计 - 图1
开启“TC_LINKKEY_JOIN”功能时,“Transport key”命令的抓包:

传感器网络加密设计 - 图2
使用方法:将协调器和入网设备工程“f8wConfig.cfg”文件中的“-DSECURE”设置为1;然后在预定义里添加“TC_LINKKEY_JOIN”,说明使用“TC LINK KEY”加密;将“nwk_globals.h”中的“DEFAULT_TC_LINK_KEY”设置成相同的“TC LIN KEY”;设置协调器要使用的“网络密钥”;最后再将“ZGlobals.c”文件中的“zgPreConfigKeys”设置为“FALSE”,表示网络密钥是通过协调器发送给入网设备的。

快速应用:

步骤 执行设备 执行项目
开启安全加密功能 协调器/入网设备 将“f8wConfig.cfg”文件中的“-DSECURE”设置为1
在预定义里添加“TC_LINKKEY_JOIN” 协调器/入网设备 在预定义里添加“TC_LINKKEY_JOIN”
设置相同的“TC LINK KEY” 协调器/入网设备 将“nwk_globals.h”中的“DEFAULT_TC_LINK_KEY”设置成相同的“TC LIN KEY”
设置网络密钥 协调器/入网设备 在“f8wConfig.cfg”文件中的“-DDEFAULT_KEY”设置网络密钥,
例如:-DDEFAULT_KEY=”{0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0D}”。
-DDEFAULT_KEY=“{0}”则随机生成网络密钥。
将配置密钥方式设置为通过协调器发送给入网设备 协调器/入网设备 将“ZGlobals.c”文件中的“zgPreConfigKeys”设置为“FALSE”

qrcode_for_gh_e95b474fcf08_344.jpg