ARTICLE · 1317119
自研发视觉软件怎么防破解:RSA + 机器码授权体系
一、场景:工控软件的破解,比你想的简单得多
自研视觉软件交付到客户产线上,第一件事不是调参,是回答一个问题:
"这个软件,怎么保证只在你授权的电脑上跑?"
工控软件的授权困境和互联网软件不一样:
1. 现场没有网——很多产线电脑是隔离内网,联网激活那套(账号体系、在线校验)根本用不了;
2. 一给就是永久——客户买断式付费,软件要在人家那台电脑上跑几年,你不能靠"连服务器续命";
3. 对方手里有完整程序——exe 就在人家电脑上,离线破解是绕不开的假设。
所以我们的授权体系要同时答对三道题:怎么离线验证?怎么绑定一台机器?怎么防"绕过验证"而不是防"伪造授权"?
第三道题最难,也最容易被忽略——这是本文的重点。
二、机器码:给每台工控机发身份证
授权的第一步是"知道这是哪台电脑"。我们的机器码取两个硬件因子:
```text
机器码原文 = MachineGuid(Windows 安装唯一标识) + "|" + C盘卷序列号
机器码 = SHA256(原文) 前 8 字节 → 16 位十六进制 → XXXX-XXXX-XXXX-XXXX
```

设计考量两条:
- 因子要"偷不走":MachineGuid 是装系统时生成的注册表值,卷序列号格式化才变。想把这个机器码搬到另一台电脑用?两个因子对不上,算出来的机器码就不同。
- 要"可打印、可口述":现场工程师是要用微信把这个码发给你的,所以做成 16 位十六进制加分隔符,电话里都能报清楚。
三、RSA 签名:私钥不随软件走,数学上不可伪造
license.xml 里只有三个字段:机器码、有效期、签名。
验证侧三步:
```text
1. 验签:RSA2048 验证 Signature = Sign(机器码|有效期) —— 私钥签的才通过
2. 对码:授权里的机器码 == 本机机器码 —— 换台电脑就失效
3. 验期:当前时间 ≤ 有效期 —— 到期即停
```
关键是密钥的方向:签名用私钥,验签用公钥,私钥永远不离开你自己的电脑,不随软件发布、不写进任何交付物。
破解者手里只有公钥。公钥能验证签名,但不能生成签名——这是 RSA 的数学性质,不是"藏得够不够深"的工程问题。想伪造一份授权文件?要么拿到私钥,要么破解 RSA-2048。前者靠管理,后者目前没有现实路径。
很多人在这一步用反向做法:软件里"加密"授权信息再"解密"——对称加密的密钥必须藏在程序里,反编译就能挖出来。公私钥分离把"藏密钥"这个问题直接消掉了。
四、踩坑一:只在启动时校验一次?等于没锁
如果只做到这里,我们的授权体系在真正的高手面前是纸糊的。
看一个残酷的事实:上面的验证逻辑写在 `Program.Main` 里,反编译工具打开 exe,找到那行 `if (!License.Validate()) return;`,改成 `if (false)`,保存——启动校验整个跳过,RSA 再硬也用不上了。
因为绕过校验根本不需要伪造授权。
所以真正的防线不是"验得有多狠",而是校验的位置有多少。我们的做法是把授权做成"运行期持续约束",在四个互相独立的位置都要通过:
```text
① 启动硬闸(Program.Main)
② 开 TCP 触发服务前(自动/手动两个入口各查一次)
③ 每帧判定入口(RunProcess)
④ 30 秒周期巡检
```

想绕过?得在反编译代码里把四个位置全部找准、全部改掉——而且第④个是定时器驱动的,和启动流程没有代码路径上的关联。绕过成本从"改一行"变成"持续对抗",而这还只是第一层。
五、踩坑二(更狠的一层):失败方向必须是"判 NG"
四个检查点,破解者哪怕真的全部绕过,拿到的是什么?
我们的设计里写死了一条原则:授权失败的方向永远是"判 NG",绝不会放行产品。
也就是说:绕过了启动闸,软件界面照常打开、相机照常取图、日志照常打——但每一件产品都判 NG。产线一件好品都出不去,这个"破解版"在产线上毫无价值,还会因为"全剔"在第一时间暴露。
这是工控软件和普通桌面软件最大的不同:普通软件破解者的目标是"能用",产线软件的命门是"不能错放"。把授权的失败方向对齐到业务的安全方向,破解就从"技术问题"变成了"自杀行为"。
顺带还有一层免维护的好处:授权失效不会让产线停机找你救火(它只是全剔 + 日志明示原因),但绝不会漏检放行砸自己招牌。
六、踩坑三:每帧都验签?产线等不起
四个检查点里有一个是"每帧判定入口"——但 RSA 验签要读文件、要加载公钥、要做非对称运算,600 件/分钟的产线上每帧来一次,CPU 和 CT 都吃不消。
落地的是2 秒结论缓存:
```text
Guard() 进来 → 上次通过且距今 < 2 秒 → 直接返回 true(只付一次原子读的代价)
→ 否则完整 Validate():读文件 + RSA 验签 → 更新缓存
```

实测下来,正常帧的守卫开销趋近于零,而"运行中授权文件被删/被改"最多 2 秒内就会被发现并接管判定。产线 CT 是毫秒级战场,安全机制也要按这个预算来设计。
七、踩坑四:现场"小迷糊",比黑客常见一百倍
防住了黑客,还要接住现场。授权体系的日常使用中,真实发生的状况:
- 文件名忘改:签发时为了区分客户,文件叫 `license-XXXXXXXX.xml`,现场拷过去忘了改名,软件找不到 `license.xml`。现在的处理是自动兼容扫描同目录的 `license*.xml`,省掉一轮"发我看看报错截图"的往返。
- 报错自带机器码:所有授权失败的提示语末尾都自动附上本机机器码——现场人员拍照发过来,你直接签发,不需要再让他教一遍"怎么查机器码"。
- 提示说人话:"签名无效(文件被篡改)""授权绑定其他电脑""有效期至 XX"——三种失败原因分开说,现场自己就能判断是拷错文件还是真过期了。
黑客一年遇不到一次,现场小迷糊天天有——授权体系的用户体验,是给后者设计的。
八、效果与边界
这套体系上线以来的状态:
- 授权文件三字段 + RSA2048,单文件交付,离线验证,不依赖任何网络;
- 四点守卫 + 失败即全剔,绕过启动闸拿到的只有"全判 NG 空壳";
- 换机器、加机器 = 用新机器码签发一个新 xml 文件,几分钟的事。
也说边界,不吹"绝对防破解":没有防不住人的锁,只有不断提高成本的门。这套体系的目标是把破解成本抬到"高于买一套正版",同时对"全剔不放行"的业务底线做数学级保障——对买断制、离线部署的工控软件,这就够了。
写在最后
授权体系的三层递进:机器码绑定"在哪台跑",RSA 签名解决"谁说的算",多点守卫 + 失败即剔回答"绕过怎么办"。最后这一层最容易被忽略,也最体现工控软件和普通软件的分野——安全设计的方向,必须和业务的安全方向一致。
下一篇继续踩坑系列:都 2026 年了客户还在用 Win7?自包含发布踩坑全记录——一包适配全系统的发布方案是怎么炼成的。
如果你的产线也有喷码、外观、定位类检测的难题,或者正被自研软件的授权/交付问题卡住,欢迎留言或私信交流。关注后回复【视觉】,送你一份《产线视觉检测改造自查清单》。















































































