第二章 ZigBee3.0协议栈的Standard Security
2.1 Standard Security
Standard Security是所有的ZigBee应用规范都使用的安全模型,包括ZigBee3.0。它也是EmberZnet协议栈中唯一支持的安全模型。
Standard Security分别使用Network Key和Link Key在网络层和APS层加密数据。APS层安全允许Trust Center来安全传输Network Key给加入节点或拒绝节点加入,并且它允许应用来增加可选的安全加密消息。网络层安全用来保证所有的ZigBee网络中发送消息的安全性。Standard Security不包括MAC层的通信(比如association,数据请求polling,MAC ACKs)。
2.2 Use of Keys in Standard Security
Standard Security定义了不同类型的Keys,使用不同的方式来保证数据的安全。所有的Keys都是用128位对称密钥(AES-128)来解密和加密数据包。
2.2.1 Network Key
Network Key用来保证网络层的安全传输。所有Standard Security网络中的设备都会对Network Key进行备份。Trust Center可以周期性的更新Network Key。Trust Center通过两种方式进行更新:广播更新或单播更新。在广播更新的情况下,Trust Center首先广播新的Network Key,此时使用旧的Network Key来对广播消息进行加密。在单播更新的情况下,Trust Center发送新的Network Key给每一个设备,此时使用Trust Center Link Key来对其进行加密。当新的Network Key发送给各网络节点之后,Trust Center再发送一条转换命令告诉所有的设备转换为新的Network Key。新Network Key对应一个序列码,这个序列码在旧的Network Key 序列码基础上加1。
2.2.2 Trust Center Link Key
Trust Center Link Key用于两个节点(其中有一个节点是Trust center)之间的端到端的安全通信。在以下情况下使用Trust Center Link Key:
• 当节点初次加入网络时,需加密传输Network Key到加入节点。
• 当Network Key更新时,有些节点因未接收到新的Network Key,因此需要Rejoin。此时,Trust Center使用Trust Center Link Key加密 Network Key发送给该重新入网节点。
• 路由器向发送给Trust Center,或从Trust Center接收APS安全消息时,需要使用Trust Center Link Key。比如路由器发送节点加入或Rejoin的更新给Trust Center时,或由Trust Center发送到路由器以执行一些安全功能的命令时, 需要使用Trust Center Link Key。
• 启用APS加密的应用程序单播消息,其中发送或接收设备是Trust Center。
由Trust Center决定如何管理Trust Center Link Key的选项。它可以为每个设备选择唯一的密钥
(从设备的IEEE地址导出的密钥),或者对于所有的设备采用相同的全局密钥。
2.2.3 Installation Code Keys
ZigBee 3.0支持Installation Code Key,在之前只用于Smart Energy Network(智能能源网络),Smart Energy Network必须使用install code。现在所有ZigBee 3.0认证设备都需要支持install code,但是由Trust center决定是否在网络中使用。
Install code用来预配置Trust Center Link Key,其用于加入ZigBee网络时对Network Key的传输进行加密。在进入网络时,加入设备和Trust Center都必须知道这个唯一的密钥,所以install code用于在两端导出密钥。Install code可以是6,8,12或16字节的任意值,再末尾加上这些字节的16位CRC(最低有效字节优先)。Install code用作Matyas-Meyer-Oseas(MMO)Hash散列函数的输入,其散列长度等于128位。该AES-MMO哈希函数的128位(16字节)结果就是用作该设备的预配置Trust Center Link Key的值,并且Trust Center可以安装密钥表条目(该密钥和加入设备的EUI64),其然后允许在加入网络期间成功地进行认证,加入设备可以成功地接收和解密Network Key。作为此过程的一部分,Install code和加入设备的EUI64必须在带外传送(目标ZigBee之外网络,因为新节点尚未加入)到网络的Trust Center,以允许创建正确的Link key表条目。
2.2.4 Application Link Keys
Application Link Key与Trust Center Link Key不同,它不是必须的,属于可选的一种安全机制。Application Link Key用于网络中两个都不是Trust Center的设备之间的APS级加密。设备不会与Trust Center之间使用Application Link Key。Application Link Key可以通过以下两种方式建立:
• 由应用程序手动配置,指定与目标设备关联的Application Link Key。
• 通过请求Trust Center生成Application Link Key并将其发送到两个设备。
Ember Stack支持两种请求Application Link Key的方法。
第一个是ZigBee标准方法,其中一个设备通过联系Trust Center向另一个设备请求Application Link Key。然后Trust Center立即响应并将随机生成的Application Link Key发送回请求设备和另一个设备。这种做法的缺点是:只有一个设备请求密钥,而另一个设备可能正在休眠,离线,或没有足够的容量来保存新的Application Link Key。
第二种方法,如下图所示,不是ZigBee标准方法,由Ember Stack在第一种方法上进行改进,所以其不兼容第三方设备。它还要求网络中的所有Ember设备都配置为使用此方法,包括Trust Center。这种方法更加可靠,因为它有助于确保伙伴设备在线,因此能够接收Application Link Key。在这种情况下,设备A向Trust Center发送与设备B的Link Key请求(这个请求是使用设备A的Trust Center Link Key进行APS层的加密)消息。Trust Center接收到该请求之后,在一定的时间内(由Trust Center应用程序定义这个时间的长短),在此期间,设备B向Trust Center发送与设备A的Link Key请求(这个请求是使用设备B的Trust Center Link Key进行APS层加密)消息。如果发生这种情况,Trust Center生成随机Application Link Key并将其发送给两个设备。要求两个设备都发送Link Key请求大大减少了设备接收不到Application Link Key的情况。
• EmberZNet PRO支持用于存储Application Link Key的可配置表。
2.3 Joining a Network
设备加入ZigBee Standard Security网络时,首先向父节点发送MAC关联请求。 如果关联成功,则设备处于已加入但未认证状态,此时它不具有Network Key。父节点给设备发送MAC关联成功的响应之后,再向Trust Center发送更新设备消息,指示新节点希望加入ZigBee网络。 然后由Trust Center决定是否允许设备加入。 如果不允许设备加入,则向父节点发送移除设备(Remove device)请求。 如果允许该设备加入,Trust Center则向父节点发送Network Key,Trust Center的行为取决于设备是否具有预配置的Trust Center Link Key。
2.3.1 Preconfigured Link Keys
Trust Center规定了如何处理新设备和确定设备是否应该具有Preconfigured Link Key。 如果新设备没有Preconfigured Link Key,它将无法加入网络。
Trust Center可以选择该密钥是Default global Link Key(ZigBeeAlliance09)还是installation code。下图说明了使用Preconfigured Link Key的加入网络的过程。
为了允许设备加入到网络,Trust Center发送Network Key(使用Preconfigured Link Key加密)给父节点。ZigBee 3.0和所有ZigBee应用程序配置文件需要Preconfigured Link Key才能加入。
2.3.2 Decision for Using Well-Known Key or Installation Code
Trust Center是使用Well-Known Key还是Installation Code,取决于易用性和安全性之间的平衡。使用Well-Known Key使设备能够更容易地加入网络,而无需大量的用户交互。然而,Well-Known Key加密Network Key提供了一个脆弱的时刻,直到该Well-Known Key被替换为新的密钥。使用Installation Code为Network Key到设备的初始交换提供了安全性,代价是用户和Trust Center之间增加了交互。用户必须以某种方式将密钥从设备传输到Trust Center。这是通过ZigBee网络之外的机制来完成,例如从列出加入设备上的代码的标签将代码输入到Trust Center GUI中;在加入设备上运行的主应用程序。在网络上运行的主要应用程序将帮助决定是否易于使用与更好的安全性谁更重要。
2.3.3 Requesting a New Link Key after Joining
ZigBee 3.0设备成功加入网络后,设备需要请求更新的Trust Center Link Key以替换它们现有的Preconfigured Link Key。 即使使用Installation code的设备,也将替换成新的Trust Center Link Key。 下图说明了ZigBee 3.0设备如何更新Trust Center Link Key。
只有在Trust Center和加入设备都支持ZigBee 3.0的情况下,才能更新Trust Center Link Key。 如果其中一个不是ZigBee 3.0设备,则保留原始的Preconfigured Link Key。
2.4 Network Key Updates
加密网络层的所有传输。在网络中的任何设备的Frame Counter到达0x80000000最大值之前,Trust Center应该更新Network Key。由于Trust Center不可能在任何给定时间知道网络中的每个设备的Frame Counter的值,所以依赖于特定Frame Counter阈值的方法来更新Network Key是不实际的。因此,推荐采用Trust Center定期更新Network Key,以减小Network Key被泄露的风险。这有助于确保已离开ZigBee安全网络的设备无法Rejoin。
• 更新Network Key可以使用广播或单播两种方式,由Trust Center决定使用哪种机制。
2.4.1 Broadcast Network Key Update
当采用广播的方式对密钥更新时,使用当前Network key加密消息。 收到广播的设备不立即使用该Network Key,而是先存储它。 之后Trust Center广播密钥切换命令,以通知所有节点开始使用新密钥。Trust Center在发送切换命令之前应该允许足够的时间(大约9秒)来保证新密钥的广播到整个网络。 此外Trust Center必须记住,睡眠终端设备可能会错过初始广播,除非他们频繁轮询父节点。广播机制非常简单,因为它不需要知道网络上所有设备的身份。 它也只涉及发送两个消息,更新的密钥消息和切换消息。
2.4.2 Unicast Network Key Update
当采用单播的方式对密钥更新时,Trust Center将向网络上的每个设备发送单独的密钥更新。 Trust Center必须维护网络上所有授权设备的列表,以便执行此操作。更新消息使用每个设备的特定Trust Center Link Key单播具有APS加密的消息到每个设备。 然后由Trust Center广播切换命令,告知所有节点开始使用新密钥。
2.4.3 Missing a Network Key Update
任何设备可能会错过密钥更新,比如它处于睡眠,断电或者长时间掉网的状态。 如果发生这种情况,设备可以尝试执行Trust Center Rejoin操作。 然后由Trust Center决定是否允许节点返回到网络上。
EmberZNet PRO协议栈可以检测接收的加密数据包是否使用较新的Network Key。如果检测到,它将自动执行Trust Center Rejoin到当前网络以尝试获取最新的Network Key。
2.5 Network Rejoin
Rejoin是指节点重新连接到其先前所在的网络的一种方式。在以下几种不同的情况下需要进行Rejoin:
• 移动或睡眠的设备,可能无法再与其父节点通信。
• 错过Network Key更新,并需要更新Network Key副本的设备。
• 错过PAN ID更新并需要发现网络的新PAN ID的设备。
当设备尝试Rejoin网络时,它可能有,也可能没有当前网络的Network Key。如果没有正确的Network Key,设备的Rejoin请求会被附近的路由器忽略。
因此,当Rejoin时,设备有两个选择:Secure Rejoin或Trust Center Rejoin。注意,这些Rejoin的情况都不需要在目标网络中的任何设备上设置MAC允许关联(也称为“允许加入”)标志。路由器/协调器设备将始终接受NWK层Rejoin命令,该命令是Trust Center Rejoin或使用Network Key的Secure Rejoin。对于Trust Center Rejoin的情况,Trust Center的责任是在收到通知后授权或拒绝设备的重新连接。
2.5.1 Secured Rejoining
Secured Rejoin的情况是更简单一些,试图重新加入网络的设备应当首先尝试这个方法。 如果它具有当前Network Key,则设备将能够在很快地重新加入网络。 当睡眠或移动终端设备与其父节点失去联系时,才需要进行Secured Rejoin。
如下图所示,设备发送用其Network Key副本加密的Rejoin请求给父节点。 如果路由器在附近并且使用相同的Network Key,则父节点将Rejoin响应发送回该设备。 设备处于成功加入网络中并处于验证状态。 父节点通知Trust Center该设备Rejoin,但Trust Center不得采取进一步的操作。
如果设备尝试Secured Rejoin失败,并且设备使用Standard Security性,则应用程序可以尝试Unsecured Rejoin。
2.5.2 Trust Center Rejoin
当相邻设备已经切换到新的Network Key并且不再使用与Rejoin设备相同的Network Key时,就需要进行Trust Center Rejoin。要成功地在Trust Center Rejoin,设备必须有一个Trust Center Link Key。设备发送未加密的Rejoin请求给父节点。附近的路由器(父节点)接受未加密的Rejoin请求并且发送响应到该设备,允许它转换到加入和未认证的状态。
如下图所示,Rejoin设备的父节点向Trust Center发送更新设备消息,通知它有不安全的Rejoin。Trust Center有两个选择:拒绝或接受Rejoin。如果它接受Rejoin,则它必须向设备发送更新的Network Key。但是,它使用该设备的Trust Center Link Key保护此消息。该消息(在网络层和APS层均被加密)被发送到Rejoin设备的父节点。然后,父节点中继此消息(只进行APS层加密而不进行网络层加密)到Rejoin设备。一旦它具有Network Key,它将处于加入和认证状态,即可以在网络上再次通信。
备注:
Trust Center决定是否允许Trust Center Rejoin,必须考虑加入设备是否使用Global Trust Center Link Key。如果Trust Center只有设备的Global Trust Center Link Key(例如ZigBeeAlliance09密钥),则它应该忽略Rejoin请求。众所周知,Global Trust Center Link Key是不安全的,因此不应该用于传送重要的数据(Network Key),在Rejoin期间,Global Trust Center Link Key应该只用于初始加入,甚至应该只允许短暂的时间。
Pre-ZigBee 3.0网络在加入后不会立即更新Link Key,因此强烈建议拒绝任何使用Global Trust Center Link Key来进行Rejoin操作。智能能源网络不受此特定问题的限制,因为他们在加入后立即更新Link Key。
因此,智能能源网络可接受Trust Center Rejoin。
建议拒绝Trust Center Rejoin而不是明确拒绝Trust Center Rejoin是必要的保持与ZigBee 3.0之前的设备的兼容性。 Pre-ZigBee 3.0设备可以尝试Trust Center Rejoin而不考虑是否先前已经获得了更新的Link Key。如果进行明确拒绝,则设备可能完全脱离网络,静默拒绝将允许设备稍后尝试Secured Rejoin并成功。
Trust Center的行为将最终决定Trust Center Rejoin的安全性。这可以通过控制在SOC上的emberTrustCenterJoinHandler()回调,在NCP上通过配置EZSP_TRUST_CENTER_POLICY的ezspSetPolicy()API。要忽略SOC设备上的Trust Center Rejoin,emberTrustCenterJoinHandler()必须返回EMBER_NO_ACTION。要忽略NCP上的Trust Center Rejoin,主机必须将EZSP_TRUST_CENTER_POLICY设置为EZSP_IGNORE_TRUST_CENTER_REJOINS。
如果终端设备只有一个Global Trust Center Link Key,建议将其限制为只执行Secured Rejoin。然而,如上所述, Trust Center的行为最终保证网络的安全。