干了这么多年现场调试,有一个场景每次遇到都让人心里一沉:你花了几个月调好的控制程序,设备发到现场,别人拿着U盘通过编程口几十秒就把程序拽走了,回头换个标牌、改个颜色,就成了别人家的产品。PLC这东西,说白了就是一台能跑梯形图的迷你电脑,只要有人能物理接触到它,你的程序就处于裸奔状态。早点把加密这件事想清楚,比等被抄了再后悔要划算得多。这篇文章我按自己这些年攒下来的经验,把PLC加密的常见手段、实操配置、背后的门道和踩过的坑一起整理出来,给正在做设备保护或者准备交付项目的同学一个可以直接抄作业的参考。
先说清楚适用范围:不管你是设备厂家的电气工程师、搞售后的服务人员,还是做集成项目的项目经理,只要手头有需要保护知识产权的PLC程序,这篇文章都适合。咱们不讨论极端高深的安全理论,就聊在西门子、三菱、欧姆龙、台达、汇川这些主流品牌上,实际能落地、能防住大部分人的加密方案。
1. 为什么非加密不可:被拷走的程序就是白干的项目
1.1 程序泄露的真正代价
很多刚入行的工程师觉得,PLC程序被读走不是什么大事,“反正设备都卖给人家了,程序给他们也无所谓”。但实际上,设备买卖转移的是硬件使用权,而程序里装的是你的工艺逻辑、调试参数、多年攒下来的人和设备的配合经验,这些才是设备真正的价值所在。你见过一个包装线设备,别人买回去第一件事就是找人破解程序、改产能上限、换掉你的核心动作逻辑的吗?我见过,最后原始开发的公司连售后维保都接不回来,因为客户拿着被改过的程序和别家签了服务合同。
更麻烦的是,一旦程序被读取并被恶意修改,设备出现安全事故时,责任归属会变得极其复杂。程序里那些互锁逻辑、安全回路,被人为删掉几条,设备照样跑,但如果出了事,你写的原始代码却成了事故调查报告里的“证据”。从这个角度看,加密不只保护商业利益,也是在保护工程师个人。
1.2 不同身份对加密的需求完全不同
我在不同项目里遇到过三种典型的加密诉求,出发点完全不一样。
设备制造商最迫切的需求是防抄板。设备卖出去,里面的程序就是核心竞争力,他们想要的不是“程序能跑”,而是“程序不能被完整读出来”,最好连核心算法都封装成看不见的黑盒。
终端工厂的电气主管关注点不一样,他们通常是修改权受限的一方。设备商卖完设备拍拍屁股走了,厂里工程师连换台电机都得找原厂要密码,这很不现实。所以他们想要的是“分级权限”——操作工能开机能停机,设备工程师能改参数,但核心工艺区动不了。
还有一类是项目型公司,比如做整套产线的集成商。他们在意的是“不能让我分包出去的程序被别人改得面目全非,最后连验收都过不了”。这种场景下,程序校验和防篡改比防拷贝更重要。
搞明白你是谁,才知道加密要做到哪一步。很多人一上来就想用最高级加密,反倒把设备维护搞得一团糟,这是典型的没有想清楚自己的需求。
1.3 加密程度与维护便利的博弈
加密永远是一把双刃剑。保护力度越高,日常维护就越麻烦,一旦密码丢失或者加密块逻辑有隐患,现场恢复的难度直接翻倍。我见过一个做非标设备的老板,把程序所有子程序全部加密,还绑定了CPU序列号,结果设备用了半年后CPU故障,新备件装上程序死活跑不起来,最后花了三倍价格从原厂走了加急服务才搞定。
比较合理的思路是分级加密:普通参数区不加密、关键工艺区加密、核心算法区用硬件绑定。这样既能防住大多数人,又不至于把正常的售后维护卡死。这个博弈原则我会在后面实操配置里反复提到。
2. 加密手段全景:从密码锁到硬件指纹
2.1 第一层防护:PLC编程软件的读/写/监控密码
这是最基础也是最常用的加密层,作用范围是“谁可以连接PLC”。
主流PLC都支持在编程软件里设置密码等级。拿常见的情况举例,你可以设置三类权限:读密码(能不能上载程序)、写密码(能不能下载程序)、监控密码(能不能在线监视和强制点位)。三者的权限级别可以分别控制,有些品牌还有“完全锁定”选项,设置后连软件都识别不了PLC的型号信息,别人想读程序都不知道该连哪个硬件版本。
一个常被忽略的点:很多品牌的密码保护默认只挡“在线操作”,如果你把存储卡拔下来插到读卡器里,程序文件照样可以被复制。所以第一层密码只能防君子,真正要防小偷,必须往下看。
2.2 第二层防护:存储区锁定与软元件锁
到了这一层,做的事情是“让程序即使被读出来,也无法完整运行或者修改”。
三菱FX系列里有“软元件锁”功能,可以把D区、M区的部分区域锁起来,别人在线读程序时这些区域读出来全是空的或者乱码,而程序运行却不受影响。欧姆龙和基恩士的一些型号也有类似的数据区保护功能,可以把关键配方数据、累计产量、补偿系数藏在锁定的存储区里。
这一层最大的价值在于:即使程序被人整个上载,缺失了关键存储区的数据,复制出来的程序在设备上也是跑不起来的,或者跑起来的工艺参数和原版差之千里。这类保护对工艺配方类设备特别有效。
2.3 第三层防护:Know-How Protection(核心块封装)
这个是当前应用最广、效果也最直接的加密手段,西门子用户应该很熟。
所谓Know-How Protection,简单说就是把标准PLC程序中不希望被人看到的子程序、函数块、数据块“封装加密”。开启保护后,别人上载程序,能看到这个块的名字、接口,但块内部的梯形图、ST代码是完全隐藏的,就像拿到了一个黑盒:能调用、能传参、能调试输入输出,但看不到里面是怎么算的。
这层加密非常适合保护核心算法程序。比如一个PID自整定算法、一个多轴同步控制程序、一套视觉检测的数据处理逻辑,全部把代码写进一个受保护的函数块里,主程序只管调用。别人拿到完整程序也没用,因为最核心的几段计算逻辑完全不可见。国产PLC近些年也在跟进类似功能,比如汇川、信捷的高端系列都有子程序源码加密选项。
2.4 第四层防护:CPU序列号绑定与硬件唯一性校验
如果前几层加密只是“藏”,这一层就是“锁”——程序必须运行在指定的那一台PLC上,换了CPU就跑不了。
实现方式不复杂:程序启动时读取PLC的CPU序列号或系统区信息,和内部存储的允许序列号比对,不一致就锁机或者进入受限模式。西门子S7-1200/1500可以用指令读CPU序列号,三菱FX5U、Q系列也有对应的系统寄存器可以读设备ID。国产PLC大多在系统区预留了序列号读取接口,查一下手册就能拿到。
硬件绑定的典型应用场景是设备售卖后的“分期付款保护”。比如设备商卖大型设备,客户分三期付款,程序里写个判断:系统时间到了XX日期,或者累计运行时间超过XX小时,而某一条件不满足,就直接锁机。这种做法在非标自动化设备厂里很常见,但要注意控制度,别搞得跟勒索软件一样,最后闹到客户投诉。
2.5 第五层防护:对外通讯数据加密
程序本身保护住了,但设备和人机界面、上位机、远程模块之间的通讯数据往往是没有保护的。
很多老工程师容易忽略这一层。你程序里用MODBUS TCP通讯把配方下发到PLC,数据明文传输,别人用一个简单的抓包工具就能看到通讯数据,分析出配方逻辑。高端一些的设备,尤其是有保密需求的医疗设备、军工配套设备,通讯层必须做加密。
常用的做法有两种:一是利用PLC和HMI支持的加密通讯协议,比如西门子S7协议本身带加密认证,或者Profinet的加密安全级别;二是应用层自己做校验,在通讯报文里加上自定义的帧头、CRC校验、累加和,甚至对关键字节做异或变换。这样做后即使数据被抓包,短时间内也解不出真实内容。
2.6 各层加密能力对比
| 加密层级 | 解决什么问题 | 被绕过后的影响 | 维护便利度 | 推荐场景 |
|---|---|---|---|---|
| 软件密码 | 阻止别人直接上载下载 | 程序可被完整读取 | 高 | 所有项目的基础配置 |
| 存储区锁定 | 缺数据,复制程序无法运行 | 缺关键数据,设备跑不起来 | 中 | 配方类设备,数据补偿较多的设备 |
| 块封装保护 | 隐藏核心算法逻辑 | 核心算法泄露 | 中高 | 非标设备、专用设备 |
| 硬件绑定 | 防止在别的PLC上运行 | 无影响 | 低 | 高价值设备、分期付款设备 |
| 通讯加密 | 防止数据被截获分析 | 通讯数据泄露 | 中高 | 需要保密通讯的场合 |
3. 实操配置:常见场景下怎么把加密落地
3.1 项目交付前的基础密码保护
先说最基础、最容易上手的操作。以比较常见的做法为例,项目调试完毕正式交付前,至少要做以下几件事:
设置编程密码。原则是密码要足够长且混合字符,不要用什么“123456”“PLC2023”这种一眼就破的密码。有些品牌的PLC密码有强度限制,尽量启用全部字符类型。密码本身要交底给客户的设备对接人,但不要写在设备铭牌或者操作说明书里,更不要贴在控制柜门上,我见过太多次了。
设置上载保护。这一步的核心作用是:程序可以下载到PLC,但不可以从PLC读回电脑。这能防止现场工程师把程序带走。不过要注意,上载保护一旦开启,你自己后续做程序备份也得输入密码,想清楚再开,别把自己锁在外面。
开启在线监控密码。这能防止别人在设备运行状态下随意强制点位、修改当前值。尤其在设备带料运行的产线上,强制一个传感器点位可能导致设备动作异常,这层保护很实用。
这些操作看似简单,但实际跑项目中,我见到大量设备连最基础的第一层密码都没设置。程序一眼就能被拷走,后续加密做再多,基础面已经开门了,没有意义。
3.2 用块封装保护核心算法
块封装保护最适合保护“核心计算逻辑”。
举个例子,我有一个模拟项目X,设备里有一个自动称量补偿程序,里面有一套修正系数自学习的算法逻辑,大约一百多行梯形图加ST语句。要保护这段程序,我先把它写进一个独立的函数块FC(或者功能块FB),然后在块属性里启用“Know_How_Protection”,设置保护密码。启用后,编译器会把这部分源码转换成加密格式,下载到PLC后,别人上载程序时只能看到FC的接口声明和Call语句,块内部代码完全不显示。
实操时有几个倾向性建议:
第一个,把所有核心算法集中放,不要分散在主程序里东一块西一块,那样保护起来既麻烦又容易漏。第二个,块的接口设计要尽可能完整清晰,注释写好。原因很简单:你自己在项目调试后期如果还要修改核心算法,接口不清楚会让你自己都看不懂。第三个,买PLC时注意选支持块源码加密的型号,有些小PLC型号不支持,被迫只能用更麻烦的方式替代。
3.3 硬件序列号绑定的写法参考
这个手段实现起来不复杂,核心就三步:读序列号、存允许序列号、比对判断。
以ST语句为例,大致的逻辑片段如下:
// 读取PLC系统区中的序列号 SerialNo := GET_CPU_SERIAL(); // 与预设的授权序列号比对 IF SerialNo <> 'ABC12345XYZ' THEN // 非授权设备:输出报警并停机 AuthOK := FALSE; MotorEnable := FALSE; AlarmMsg := 'CPU序列号不匹配,请联系设备厂商'; ELSE AuthOK := TRUE; END_IF;不同品牌的读取指令和系统区地址不一样,但逻辑思路完全相同。需要注意的一点是,序列号是静态存在CPU里面的,别人如果知道你的判断逻辑,可以通过修改程序跳开这段比对。因此,单纯的序列号绑定并不足够安全,更稳的做法是和前一道块封装结合:把序列号比对逻辑也封装进受保护的块里,甚至做两层校验。
还有一个常见做法是绑定PLC的MAC地址或网口信息,但这个容易被修改,可靠性不如CPU硬件序列号。
3.4 HMI权限分级的实战配置
设备交付后,日常操作的大多是产线操作工,设备维护大多由甲方电气人员完成,而你自己的工程师偶尔也要远程看一眼程序。这种情况下,把HMI的权限分成操作员、维护员、工程师三级,比一个通用密码人人可点要安全得多。
操作员权限最低,只能启动、停止、看报警、看产量。维护员权限可以修改配方参数、手动操作设备,但看不到设置页;工程师权限最高,可以进入系统设置、管理用户、切换手动自动模式,甚至可以触发数据导出。
在主流HMI软件里,权限系统基本都是靠用户组加密码实现的。每个画面元素可以单独设置“是否允许访问”。部分品牌的HMI支持二级密码联动,比如操作员输入密码进入运行页面后,再点某个按钮会弹出二级密码框,输对了才会执行,这对关键操作非常合适。
需要注意的坑:很多HMI屏的设置页面默认没有开启权限保护,调试工程师为了方便,把默认用户设成了最高权限,交付后忘了改。等客户那边操作工误进设置页把参数一顿乱改,问题就来了。所以交付前务必把默认用户权限拉低,并用不同密码重新设好一级二级账号。
3.5 程序运行状态的防篡改
加密不只是防读取,很多时候还要防“程序被改了但没人承认”。
常用的做法是给程序加一个自动校验功能。设备程序里放一段后台采样逻辑,每隔一段时间把程序区或关键数据区的一部分内容读出,做一个CRC校验,和出厂时写入的值比对。一旦发现不一致,立刻在HMI上弹出一个“程序校验失败”的报警,并记录发生时间。
有一种稍微复杂一点的实现是在数据块里存一个“程序签名值”。程序完整编译下载时,这个签名值是确定性的。如果程序被在线修改,比如有人强制修改了一条指令或者数据,签名值就会变化,系统就能检测到。这个操作不适合新手,但对甲乙方扯皮时的责任鉴定非常有用。
4. 从防守视角理解对抗:为什么有的加密能破,有的破不了
4.1 被绕过的主要路径
做加密这件事,最忌讳自以为是。你得站到对方的立场上看一看,常见的绕过路径大致有四条。
第一条:编程软件密码被暴力枚举。密码设置太简单,比如纯数字六位,用工具穷举只是时间问题。对策是用强密码加锁定次数,多数PLC在密码错误若干次后会延迟或者锁定访问。
第二条:从存储芯片直接读取。部分老型号PLC程序存储在外部存储器里,把芯片拆下来用编程器直接读,能绕过密码限制。厂商对此一般不会宣传,但实际存在。对策是选存储芯片内置的新型PLC,或者用硬件封装加密逻辑做二次防护。
第三条:读取加密块后逆向分析。Know-How Protection的强度取决于厂家的加密算法和密钥管理。正规品牌的封装保护可靠性较高,小品牌可能只是简单混淆,容易被逆向。对策是选主流品牌、新固件版本,并在关键项目中叠加硬件绑定。
第四条:通讯劫持与重放。如果不在通讯层加密,拦截了合法报文后重新发送,设备同样会执行动作。对策是应用层加序列号随机数和时间戳校验,让每条指令都“只用一次”。
4.2 加密成本与设备价值的权衡
加密强度越高,开发、调试、维护成本也越高。你在选择加密层级的时候,得先给设备本身估个值。
一台三万元的贴标机,用软件密码加Know-How Protection就足够了,没人会花几万块去逆向一台三万元的设备。但一台上百万元的专用生产线,客户可能雇人花半个月去破解,你必须上硬件绑定+通讯加密+封装保护的多层组合。
这个逻辑叫“破解成本杠杆”:当破解成本高于设备价值的10%时,绝大多数人都会放弃。所以加密不是追求绝对打不开,而是让打开的成本高过被保护的东西本身。
4.3 防篡改校验的工程细节
做防篡改校验时别忽略一个工程细节:PLC程序的执行周期。CRC校验不能放在每个扫描周期都执行,因为循环冗余校验运算本身会占用扫描时间。我一般把它放在一个定时中断或者每N个扫描周期执行一次的子程序里,校验过程控制在几十毫秒以内,不影响设备核心控制逻辑。
另一个细节是校验数据的存放位置。把校验基准值存在PLC的一个受保护存储区,并把校验逻辑放在Know-How Protection的块里,否则别人改了程序后顺手把基准值也更新了,校验就形同虚设。
5. 常见问题与排查技巧实录
5.1 自己把密码忘了,怎么办
这个问题几乎每个同行都遇到过,尤其项目一多,各设备的密码可能都不同。处理办法按品牌不同有所区别,大部分正规品牌都提供了密码找回或者密码清除的服务通道,但需要提供设备序列号、程序所有权证明之类的材料,流程通常比较慢。
我的实用建议是建立一套密码管理制度:每个项目在终验收时,把密码信息封存在项目档案里,由项目负责人和技术负责人分别保管。不要只存一份,也不要存在手机备忘录里。永远在交付前把密码验证一遍,确认没有输错、没有大小写混淆,再封存。密码遗忘后的破解手段我就不细说了,正规渠道解决才是正路。
5.2 加密后设备调试出现异常
这是我很想强调的一点:很多时候设备出问题不一定是程序逻辑有问题,而是加密手段在特定时序下干扰了运行。
块封装保护本身不影响调用,但如果你的“硬件绑定”逻辑写的是“序列号不匹配就停机”,那么一旦序列号读取函数在开机瞬间没准备好,设备可能出现偶发性启机报警。这种故障最折磨人,因为它不是每次必现。
经验是给绑定校验加一个延时和重试机制:开机后延时2秒再读取序列号,校验不通过先报警不直接停机,连续校验三次确认失败后再停。这样既能保护程序,又不会因为系统时序问题误伤正常使用。
另一个常见问题是套用了高强度的存储区锁定,结果配方下载报错,最后查出来是配方写入区和锁区地址重叠。配置存储区锁定时,一定把地址规划表先画出来再动手。
5.3 绑定CPU序列号的设备CPU坏了怎么办
这是硬件绑定最大的风险点。一旦绑定的CPU损坏,客户手边正好有一台备件PLC,换上就得等设备商到场重新授权,产线停线损失巨大。
我给这类设备做方案时,通常会建议客户先买两台同型号PLC,或者至少在合同中约定“紧急授权”的远程协助机制。设备端做一个“临时解锁”功能,可以通过加密狗或者授权码方式在客户现场临时解锁运行,后面再补正式授权。这个设计能解决售后纠纷中的大部分矛盾。
5.4 几条实在的经验总结
最后说几条实操心得,都是拿项目时间换来的。
第一,密码保护一定要记录备份。见过太多当事人离职,密码随人走,现场设备变“砖机”的情况。第二,加密时优先选用可逆手段,不要把自己锁死。比如上载保护这种功能,开启之前确认自己手里有程序源文件,不然以后想修改都读不出来。第三,项目进度再紧,加密配置也要在出厂前完整测试一遍,不要等到现场才第一次启用。
我个人的习惯是,在出厂质检流程里加一个专门的“加密功能检测项”:锁上,试跑24小时,解锁,再试跑24小时,都正常才放行。这个习惯帮我挡掉了至少两次因为加密时序问题导致客户拒收的情况。
5.5 常见问题速查表
| 问题 | 可能原因 | 处理建议 |
|---|---|---|
| 上载程序提示无权限 | 开启了上载保护 | 输入设置密码,如忘记密码走官方恢复通道 |
| 密码正确却无法在线监控 | 监控权限被单独禁用 | 检查软件内权限设置,重新开启监控功能 |
| 程序拷走后设备不正常 | 存储区锁定或硬件绑定生效 | 确认是否授权设备,检查授权序列号 |
| 更换CPU后程序无法运行 | 硬件绑定校验失败 | 联系设备商进行重新授权 |
| 通讯数据被拦截分析 | 未做通讯加密 | 启用加密通讯协议,增加应用层校验 |
| 设备偶发性锁机 | 序列号读取时序不稳定 | 增加延时重试机制后再锁定 |