1. LoRaWAN 安全架构概述:威胁模型、安全目标与分层

各位好,我是老周。做 LoRaWAN 安全也有七八年了。今天咱们聊聊安全架构的底子——威胁模型、安全目标,还有那三层防护体系。这些东西看着基础,但我在项目里见过太多人栽在基础认知上。

说白了,LoRaWAN 不是 Wi-Fi,也不是 NB-IoT。它有自己的脾气。你想想看,一个终端节点可能在山沟里待三年,没人管,电池还不能换。这种场景下,安全设计能跟手机一样吗?

1.1 安全威胁模型:谁在盯着你的 LoRaWAN 网络?

先搞清楚敌人是谁。我习惯把威胁分成四类,每一类我都吃过亏。

威胁类型 攻击手段 真实案例(我遇到的)
窃听 空中抓包,分析载荷 某水表项目,明文传输被竞争对手截获了抄表数据
重放 抓取合法报文后重复发送 智能门锁项目,攻击者重放开锁指令,门开了两次
篡改 修改报文内容再转发 温控器项目,篡改温度阈值导致空调系统崩溃
伪造 冒充合法节点入网 某资产追踪项目,伪造节点上报虚假位置
⚠ 注意: 我曾经在一个项目中,客户觉得"数据不重要,没人会攻击"。结果上线第三天就被重放攻击打了脸。记住——没有不值得保护的数据,只有还没被发现的攻击面。

还有一个容易被忽略的点:物理攻击。终端节点部署在户外,攻击者可以直接拆设备、读芯片、提取密钥。我见过有人用逻辑分析仪直接从 SPI 总线上把 AES 密钥抓出来的。嗯,这个后面讲设备层安全时会细说。

1.2 安全三目标:CIA 在 LoRaWAN 里的落地

信息安全的老三样——机密性、完整性、可用性。但在 LoRaWAN 里,每个目标的实现方式都不一样。

机密性(Confidentiality)

说白了就是不让别人看懂你的数据。LoRaWAN 用 AES-128 做加密,但加密粒度有讲究:

  • 网络层加密:用 NwkSKey 加密 MAC 命令,保护网络控制信息
  • 应用层加密:用 AppSKey 加密应用数据,网络服务器也看不到业务内容

我建议你记住一个原则:应用数据必须走应用层加密。有些厂商图省事,只做网络层加密,结果网络服务器运维人员就能看到所有业务数据——这在很多行业是合规问题。

完整性(Integrity)

保证数据没被改过。LoRaWAN 用 MIC(消息完整性码)来实现。每个上行/下行报文都带 4 字节的 MIC,接收方用同样的密钥和算法重新计算,比对一致才算合法。

💡 小技巧: 排查 MIC 校验失败问题时,我习惯先看三个地方:1) 密钥是否匹配;2) 帧计数器是否同步;3) 报文在传输过程中有没有被截断。80% 的 MIC 错误都出在这三个点上。

可用性(Availability)

这个在 LoRaWAN 里最容易被忽视。攻击者不需要破解加密,只需要在同一个频点持续发送干扰信号,就能让你的整个网络瘫痪。这就是所谓的 Jamming 攻击。

我记得有个智慧农业项目,传感器部署在开阔农田里。攻击者用一台 100mW 的发射机在 470MHz 频段持续发射,所有终端都连不上网关。最后我们加了跳频策略和信号强度异常检测才解决。

1.3 安全架构分层:三层各司其职

LoRaWAN 的安全架构分三层。我画了张图,帮你理清关系。

LoRaWAN 安全架构三层模型 设备层(Device Layer) 核心密钥:AppKey / NwkKey 安全机制:Join 流程、密钥派生、物理防篡改 常见故障:密钥烧录错误、Join Nonce 重复、DevEUI 冲突 网络层(Network Layer) 核心密钥:NwkSKey 安全机制:MIC 校验、帧计数器、MAC 命令加密 常见故障:FCnt 不同步、MIC 校验失败、MAC 命令解析错误 应用层(Application Layer) 核心密钥:AppSKey 安全机制:应用数据加密、端到端安全 常见故障:AppSKey 不匹配、应用载荷解密失败

设备层——信任的起点

设备层是所有安全的根基。每个终端在出厂时就要烧录 AppKey(OTAA 入网)或 NwkKey(LoRaWAN 1.1 版本)。这些密钥一旦泄露,整个安全体系就垮了。

我建议你在设备选型时问供应商三个问题:

  1. 密钥是在产线上怎么烧录的?有没有加密传输?
  2. 芯片有没有安全存储区?密钥能不能被软件读出来?
  3. 有没有防拆机制?拆机后密钥会不会自毁?
🔑 核心要点: 设备层的安全不是靠软件,而是靠硬件。选一颗带安全元件的 MCU,比你在软件上做一百层加密都管用。

网络层——通信的守门员

网络层负责保护 LoRaWAN 协议本身的通信安全。主要干三件事:

  • MIC 校验:每个报文都带完整性校验码,防止篡改
  • 帧计数器:防止重放攻击。发送方和接收方各自维护一个计数器,报文序号必须递增
  • MAC 命令加密:网络控制指令(如 ADR、RX 窗口参数)用 NwkSKey 加密传输

帧计数器这块坑最多。我遇到过终端重启后计数器归零,但服务器还记着旧值,结果所有报文都被丢弃。解决办法是在终端侧做非易失性存储,每次发送前把计数器值写进 Flash。

应用层——业务的保险箱

应用层只做一件事:保护你的业务数据。用 AppSKey 对应用载荷做 AES-128 加密,网络服务器只能看到密文,解不开。

这里有个常见误区:有些人觉得"反正网络层已经加密了,应用层加不加密无所谓"。错!网络层加密只保护到网络服务器,如果你的网络服务器被攻破,或者运维人员有权限查看明文数据,应用数据就全裸奔了。

💡 我的习惯: 在应用层再加一层自己的加密。比如在 AppSKey 加密的基础上,对关键字段做 XOR 混淆或自定义编码。这样即使 AppSKey 泄露,攻击者还要破解你的私有协议。多一层保险,多一分安心。

1.4 密钥体系:一张表说清楚

LoRaWAN 的密钥体系看着复杂,其实就几个核心概念。我整理了一张表,方便你对照排查。

密钥名称 长度 用途 存储位置 派生方式
AppKey 128 bit OTAA 入网凭证,派生 AppSKey 和 NwkSKey 终端 + 网络服务器 出厂预置
NwkKey 128 bit LoRaWAN 1.1 版本,替代 AppKey 的部分功能 终端 + 网络服务器 出厂预置
AppSKey 128 bit 应用数据加密 终端 + 应用服务器 Join 过程中派生
NwkSKey 128 bit 网络层加密和 MIC 计算 终端 + 网络服务器 Join 过程中派生
⚠ 重要提醒: 密钥派生依赖 Join Nonce、DevNonce 等随机数。如果这些随机数重复,派生出来的会话密钥也会重复。我曾经排查过一个案例,终端每次重启都用相同的 DevNonce,导致所有会话密钥都一样——重放攻击直接失效了安全防护。

好了,这一章的内容就这些。安全架构是后面所有故障排查的基础。你把这个三层模型和密钥体系吃透了,后面遇到 Join 失败、MIC 错误、解密失败这些问题,心里就有底了。