2. 通信协议安全:DLMS/COSEM协议基础、协议安全机制、常见攻击与防御
各位好,我是老张。在电力系统安全这块摸爬滚打了十几年,今天咱们来聊聊智能电表通信协议里最核心的一个——DLMS/COSEM。说实话,这个协议刚出来那会儿,我第一反应是“又是个国际标准来折腾人的”。但真正啃下来之后,发现它确实有两把刷子。
2.1 DLMS/COSEM协议基础
DLMS/COSEM,全称是Device Language Message Specification / Companion Specification for Energy Metering。名字挺长,说白了就是一套让电表跟后台系统“说同一种语言”的规则。
我习惯把它拆成两层来看:
- DLMS:负责“怎么说话”——定义了消息的格式、编码规则、传输方式。
- COSEM:负责“说什么内容”——定义了电表里有哪些数据对象,比如电压、电流、有功功率,每个对象长什么样。
举个例子,你想想看,一个电表要上报“当前正向有功总电能”,如果没有统一标准,A厂家叫它“E_total”,B厂家叫它“Total_Active_Energy”,后台系统就懵了。COSEM就是给这些数据起了个“国际通用名”,比如1.0.1.8.0.255这个逻辑名,全球通用。
核心要点:DLMS/COSEM不是一种物理通信介质,它是个应用层协议。它可以跑在串口、TCP/IP、甚至PLC(电力线载波)上。我在项目中遇到过,有人以为换了协议就得换硬件,其实只要电表支持,改个配置就行。
2.2 协议安全机制
嗯,这里要注意。DLMS/COSEM在设计之初就把安全考虑进去了,不像某些协议是后来“打补丁”加上的。它的安全机制主要分三块:
2.2.1 认证机制
说白了就是“你是谁”。DLMS/COSEM支持三种认证级别:
| 级别 | 名称 | 说明 |
|---|---|---|
| Low | 低级别认证 | 只验证客户端地址,不验证密码。说白了就是“你说你是谁就是谁”。 |
| Low+ | 低级别加密码 | 需要明文密码。我建议别用这个,密码在网络上裸奔,太危险。 |
| High | 高级别认证 | 使用挑战-响应机制。服务器发一个随机数,客户端用密钥加密后返回。这才是正经做法。 |
我个人习惯,只要是新项目,一律用High级别认证。曾经有个客户为了省事,全线用Low+,结果被中间人抓包抓到了密码……嗯,后来他们连夜升级了固件。
2.2.2 加密机制
DLMS/COSEM支持AES-128-GCM加密。为什么选这个?因为GCM模式不仅能加密数据,还能做完整性校验。你想想看,如果只加密不校验,攻击者虽然看不懂数据,但可以篡改数据,比如把“用电量100度”改成“用电量1度”。
避坑指南:我曾经遇到过,电表固件里虽然支持AES加密,但密钥是硬编码在代码里的,所有电表用同一个密钥。这等于给大门上了把锁,但钥匙挂在门框上。正确的做法是:每个电表使用唯一的密钥,并且支持密钥更新。
2.2.3 完整性校验
除了GCM模式自带的校验,DLMS/COSEM还支持独立的MAC(消息认证码)。每次通信都会带一个签名,接收方验证签名是否匹配。如果有人篡改了数据,签名就对不上了。
2.3 常见攻击与防御
做了这么多年安全,我见过的攻击手段五花八门。针对DLMS/COSEM协议,主要有这么几类:
2.3.1 重放攻击
攻击者抓取一段合法的通信数据,比如“读取电表数据的请求”,然后重复发送。如果电表没有防重放机制,就会一次次响应。
防御:DLMS/COSEM协议里有个“帧计数器”机制。每次通信,帧计数器都会递增。如果收到一个帧计数小于或等于上次的,直接丢弃。我在项目中测试过,这个机制很有效。
2.3.2 中间人攻击
攻击者插入在电表和后台之间,拦截、修改、转发数据。如果用的是明文通信,那简直就是“裸奔”。
防御:启用高级别认证 + AES加密。攻击者即使抓到了数据包,也解不开。而且挑战-响应机制能防止攻击者冒充合法客户端。
2.3.3 密钥破解
暴力破解密钥,或者利用弱密钥。有些电表出厂时密钥是“12345678”或者全零,这跟没锁门一样。
防御:使用强随机数生成密钥,定期更换。我建议至少每3个月更新一次密钥。另外,电表端要限制错误认证次数,比如连续5次失败就锁定10分钟。
2.3.4 协议解析攻击
攻击者发送畸形数据包,试图让电表协议栈崩溃或进入异常状态。说白了就是“协议层面的缓冲区溢出”。
防御:在协议栈实现时做好输入校验。我见过一个案例,某款电表在处理超长APDU(应用层协议数据单元)时直接重启。后来厂商打了补丁,限制了APDU最大长度。
重要提醒:不要以为用了DLMS/COSEM就万事大吉。协议本身是安全的,但实现协议的电表固件、通信模块、后台系统都可能存在漏洞。安全是一个链条,最弱的一环决定了整体安全水平。
2.4 我的实战建议
最后,分享几点我这些年总结的经验:
- 能加密就别明文。哪怕只是测试环境,也养成加密的习惯。我见过太多“先跑起来再说,安全后面补”的项目,最后都没补。
- 认证级别选High。别为了省那点计算资源用Low或Low+。现代电表的芯片算力足够跑AES加密。
- 密钥管理要规范。密钥生成、分发、存储、更新、销毁,每个环节都要有制度。我曾经帮一个客户做安全审计,发现他们的密钥存在Excel表格里,还共享在网盘上……
- 定期做渗透测试。找个靠谱的安全团队,模拟攻击者的手法去测试你的系统。很多漏洞自己发现不了,外人一测一个准。
好了,关于DLMS/COSEM协议安全,今天就聊到这儿。下一节咱们讲讲智能电表的数据存储安全,那又是另一个有意思的话题。