3. 网络层安全:无线通信安全与数据传输加密
网络层是农业物联网的命脉。传感器采集的数据要传出去,控制指令要发回来,全靠这一层。但无线信号在空中飘着,谁都能收到——这就麻烦了。
我做了这么多年物联网安全,见过太多人只盯着应用层,觉得网络层有加密就万事大吉。其实不然。无线通信的安全,说白了就是三个问题:信号能不能被截获?数据能不能被篡改?设备能不能被冒充?
这一章,咱们就围绕这三个问题展开。
3.1 无线通信技术安全对比
农业场景里,Wi-Fi、LoRa、ZigBee 用得最多。它们各有各的脾气,安全特性也完全不同。
| 技术 | 频段 | 典型距离 | 加密方式 | 主要风险 |
|---|---|---|---|---|
| Wi-Fi | 2.4/5 GHz | 50-100 m | WPA2/WPA3 | 暴力破解、KRACK攻击 |
| LoRa | Sub-1 GHz | 2-15 km | AES-128 | 重放攻击、干扰 |
| ZigBee | 2.4 GHz | 10-100 m | AES-128-CCM* | 密钥泄露、嗅探 |
先说说 Wi-Fi。农业大棚里用 Wi-Fi 的不少,尤其是视频监控和网关。WPA2 虽然普及,但 KRACK 攻击能让它形同虚设。我建议能用 WPA3 就别用 WPA2,实在不行也要禁用 TKIP,只开 CCMP。
LoRa 呢?它主打远距离、低功耗。加密用的是 AES-128,但有个坑——很多模块出厂时密钥是写死的。我曾经遇到过一批 LoRa 节点,所有设备的 AppKey 都是 12345678... 你想想看,这跟没加密有什么区别?
ZigBee 在农业里常用于传感器网络。它的安全层其实设计得不错,CCM* 模式同时提供加密和完整性校验。但问题出在密钥分发上。很多项目图省事,直接用默认的 Link Key,攻击者只要拿到一个设备就能解整个网络的数据。
3.2 数据传输加密实战
无线通信加密分两层:链路层加密和端到端加密。链路层加密由无线芯片完成,比如 Wi-Fi 的 WPA3、LoRa 的 AES-128。但光靠这个不够——网关能看到明文数据。所以,端到端加密才是真正的保险。
我个人习惯在应用层再加一层加密。具体做法是:传感器采集数据后,先用 AES-256-GCM 加密,再通过无线模块发送。网关收到后不解密,直接转发到云端。云端再用私钥解密。这样即使无线链路被攻破,攻击者拿到的也是密文。
下面是一个简单的 AES-256-GCM 加密示例(Python):
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
def encrypt_sensor_data(data: bytes, key: bytes) -> bytes:
# 生成随机 nonce,每次加密都不同
nonce = os.urandom(12)
aesgcm = AESGCM(key)
# 关联数据可以带上设备ID和时间戳
aad = b"agri_sensor_v1"
ciphertext = aesgcm.encrypt(nonce, data, aad)
# 返回 nonce + 密文
return nonce + ciphertext
def decrypt_sensor_data(encrypted: bytes, key: bytes) -> bytes:
nonce = encrypted[:12]
ciphertext = encrypted[12:]
aesgcm = AESGCM(key)
return aesgcm.decrypt(nonce, ciphertext, b"agri_sensor_v1")
这里有个关键点:nonce 必须唯一。如果两次加密用了相同的 nonce,GCM 模式的安全性就崩塌了。我见过有人用固定 nonce,结果密文被轻松破解。嗯,这个坑一定要避开。
3.3 网络入侵检测
加密不是万能的。攻击者可能不破解加密,而是直接干扰通信、伪造设备、发起拒绝服务攻击。这时候就需要入侵检测系统(IDS)了。
农业物联网的 IDS 和传统 IT 的 IDS 不太一样。农业网络流量小、设备种类多、通信模式相对固定。这反而是好事——异常行为更容易被发现。
我常用的检测方法有三种:
- 流量基线检测: 记录正常情况下的流量模式,比如每个传感器每小时发一次数据包,包大小 50-100 字节。如果突然出现大量异常流量,触发告警。
- 协议异常检测: 检查数据包是否符合协议规范。比如 LoRaWAN 的帧头格式、ZigBee 的 APS 层格式。不符合的包直接丢弃。
- 设备指纹识别: 每个无线设备都有独特的射频特征,比如信号强度波动、时钟偏移。攻击者用相同型号的设备冒充,指纹也会不同。
下面是一个简单的流量基线检测逻辑:
class TrafficBaselineDetector:
def __init__(self, device_id, expected_interval=3600, tolerance=0.2):
self.device_id = device_id
self.expected_interval = expected_interval # 秒
self.tolerance = tolerance
self.last_seen = None
def check_packet(self, timestamp):
if self.last_seen is None:
self.last_seen = timestamp
return True
interval = timestamp - self.last_seen
lower = self.expected_interval * (1 - self.tolerance)
upper = self.expected_interval * (1 + self.tolerance)
if lower <= interval <= upper:
self.last_seen = timestamp
return True
else:
# 异常:时间间隔超出容忍范围
return False
这个检测器虽然简单,但在实际项目中效果不错。我曾经在温室项目里部署过,成功抓到了一个攻击者——他用伪造节点发送假数据,但因为发包频率和正常节点不一样,被基线检测直接揪出来了。
3.4 知识体系总览
这一章的内容比较多,我画了一张图帮你理清思路:
从图上你能看到,网络层安全不是单点防护,而是三层纵深防御。无线通信安全解决链路层面的风险,数据传输加密保护内容不被泄露,入侵检测则负责发现异常行为。三层配合,才能构建一个相对安全的农业物联网网络。