NwkKey的职责:保障网络层安全,防止中间人攻击

好,咱们进入正题。上一章聊了AppKey,这一章我重点说说NwkKey。

NwkKey是LoRaWAN 1.1版本引入的。说白了,它就是专门负责网络层安全的密钥。它的核心任务只有一个:防止中间人攻击。

你可能会问,为什么1.0版本没有NwkKey,也能跑?嗯,1.0版本确实也能跑,但安全模型比较粗糙。我在做网关对接时遇到过一个问题:1.0版本里,终端设备和网络服务器之间没有独立的网络层校验。攻击者只要拿到AppKey,就能伪造网络层的消息。这很危险。

所以1.1版本把密钥拆成了两个:NwkKey管网络层,AppKey管应用层。职责分离,安全边界就清晰了。

NwkKey到底保护什么?

NwkKey负责生成网络层的会话密钥。这些密钥用来保护终端设备和网络服务器之间的通信。具体来说,它干三件事:

  • 消息完整性校验:确保消息在传输过程中没被篡改。
  • 消息源认证:确认消息确实来自合法的终端设备。
  • 网络层加密:对MAC命令和帧头信息进行加密。

这三件事合在一起,就构成了网络层的安全屏障。中间人想插进来?没那么容易。

中间人攻击是怎么发生的?

我画个图,你一看就明白。

NwkKey 防止中间人攻击示意图 终端设备 NwkKey 中间人攻击者 无NwkKey 网络服务器 NwkKey 篡改消息 校验失败 攻击流程说明 1. 攻击者截获终端设备发出的上行消息 2. 攻击者尝试修改消息内容(如篡改传感器数据) 3. 网络服务器用NwkKey校验MIC,发现不匹配 4. 服务器直接丢弃该消息,攻击失败

你看这个图。终端设备用NwkKey计算MIC,发给网络服务器。中间人截获后,想篡改数据再转发。但服务器收到后,用自己保存的NwkKey重新计算MIC,发现对不上。嗯,直接丢弃。

这就是NwkKey的核心价值。没有它,中间人就能轻松伪造消息。

NwkKey生成哪些会话密钥?

NwkKey不是直接用来加密每条消息的。它是个根密钥,用来派生会话密钥。具体派生关系如下:

会话密钥 用途 派生来源
FNwkSIntKey 上行消息网络层完整性校验 NwkKey + 特定派生因子
SNwkSIntKey 下行消息网络层完整性校验 NwkKey + 特定派生因子
NwkSEncKey 网络层MAC命令加密 NwkKey + 特定派生因子

这三个密钥,每个都有自己的职责。FNwkSIntKey和SNwkSIntKey负责完整性校验,NwkSEncKey负责加密。你想想看,如果攻击者想伪造一条下行MAC命令,他得同时伪造SNwkSIntKey的MIC。没有NwkKey,他做不到。

实战中的避坑指南

我在实际项目中踩过不少坑。这里分享几个典型的:

我曾经犯过的错:在OTAA入网流程中,把NwkKey和AppKey搞混了。结果终端设备入网成功,但后续数据包全部被服务器丢弃。查了两天才发现,是Join-request消息的MIC计算用了AppKey而不是NwkKey。

这个坑很常见。1.1版本里,Join-request的MIC必须用NwkKey计算。如果你用AppKey算,服务器校验肯定失败。我建议你在代码里明确区分这两个密钥的用途,不要混用。

我的个人习惯:在代码中给NwkKey和AppKey分别起不同的变量名,比如nwk_key和app_key。然后在计算MIC的函数里,明确传入对应的密钥。这样即使代码写错了,review时也能一眼看出来。

NwkKey与AppKey的职责对比

为了让你更清楚,我列个对比表:

对比维度 NwkKey AppKey
保护层级 网络层 应用层
主要职责 防止中间人攻击 保护应用数据机密性
派生密钥 FNwkSIntKey, SNwkSIntKey, NwkSEncKey AppSKey
使用场景 Join-request, MAC命令, 帧头校验 应用数据加解密
泄露后果 攻击者可伪造网络层消息 攻击者可解密应用数据

这个表很直观。NwkKey管的是网络层的安全,AppKey管的是应用层的安全。两者缺一不可。

为什么NwkKey能防中间人攻击?

核心原因就一个:MIC校验。

每条LoRaWAN消息都带一个MIC(Message Integrity Code)。这个MIC是用NwkKey派生出来的会话密钥计算的。服务器收到消息后,会用同样的密钥重新计算MIC。如果对不上,说明消息被篡改了。

中间人攻击者没有NwkKey,他算不出正确的MIC。他只能瞎猜。但MIC是4字节的,猜对的概率是2的32次方分之一。嗯,基本不可能。

关键点:MIC校验不仅防篡改,还防重放攻击。因为MIC的计算包含了帧计数器。攻击者即使截获了一条合法消息,也不能重放它。帧计数器变了,MIC就失效了。

所以,NwkKey的存在,让中间人攻击变得几乎不可能。你想想看,攻击者既不能篡改消息,也不能重放消息,还能做什么?

总结一下

NwkKey的职责很明确:保障网络层安全,防止中间人攻击。它通过派生会话密钥,实现消息完整性校验、源认证和网络层加密。没有NwkKey,LoRaWAN网络就像没有锁的门,谁都能进来。