3、OPC UA安全策略(SecurityPolicy):基础128、基础256、AES与SHA系列算法选择
好,咱们进入第三个核心话题——安全策略。说白了,这就是OPC UA通信时,到底用什么加密算法、什么哈希算法来保护你的数据。我见过不少项目,工程师上来就选“基础128”,问为什么,答曰“默认的”。嗯,这其实是个坑。
3.1 安全策略到底是什么?
安全策略(SecurityPolicy)不是一张纸,而是一套算法组合。它规定了三件事:
- 对称加密算法:用什么加密报文?AES-128还是AES-256?
- 签名算法:用什么哈希来保证完整性?SHA-1还是SHA-256?
- 密钥协商算法:握手时怎么交换密钥?
你想想看,如果客户端和服务端选的安全策略不一致,连接直接就断了。我在现场调试时,最常碰到的报错就是“SecurityPolicy mismatch”。
核心原则:客户端和服务端必须使用完全相同的SecurityPolicy URI,否则握手失败。
3.2 官方定义的几种安全策略
OPC UA规范里定义了这么几种。我按推荐程度排个序:
| 安全策略名称 | 对称加密 | 签名哈希 | 我的评价 |
|---|---|---|---|
| None | 无 | 无 | 仅用于测试,千万别上生产 |
| Basic128Rsa15 | AES-128 | SHA-1 | 遗留系统兼容,不推荐新项目 |
| Basic256 | AES-256 | SHA-1 | 加密强度够,但哈希已过时 |
| Basic256Sha256 | AES-256 | SHA-256 | 当前最推荐,没有之一 |
| Aes128_Sha256_RsaOaep | AES-128 | SHA-256 | 新规范,适合资源受限设备 |
| Aes256_Sha256_RsaPss | AES-256 | SHA-256 | 最高安全等级,性能开销大 |
注意:Basic128Rsa15和Basic256用的都是SHA-1。SHA-1在2017年就被Google成功碰撞了。我曾经在某个汽车零部件产线上发现,PLC和上位机还在用Basic128Rsa15,吓得我赶紧让他们升级固件。
3.3 算法选择背后的逻辑
为什么会有这么多选择?说白了就是安全等级 vs 性能开销的权衡。
AES-128 vs AES-256
AES-128的密钥是128位,AES-256是256位。从数学上讲,AES-256的安全边际更高。但在实际工业场景中,AES-128已经足够抵御目前所有的已知攻击。我个人的习惯是:
- 如果控制器CPU性能一般(比如老式PLC),选AES-128
- 如果是新项目,直接上AES-256,省得以后审计时被问
SHA-1 vs SHA-256
这个没什么好纠结的。SHA-1已经退休了。你想想看,连微软都停止了对SHA-1证书的支持。我在2019年做过一个合规性审查,客户要求所有OPC UA通信必须用SHA-256。从那以后,我所有新项目都只用Basic256Sha256。
Rsa15 vs RsaOaep vs RsaPss
这是密钥传输时的填充方式。Rsa15是PKCS#1 v1.5,老标准,有已知的侧信道攻击风险。RsaOaep和RsaPss是更安全的替代方案。嗯,这里要注意:如果你的设备固件比较老,可能只支持Rsa15。这时候就得权衡——是升级固件,还是承担风险。
3.4 实际项目中的选择建议
我直接给结论吧,省得你们纠结:
- 新项目首选:Basic256Sha256。这是目前最广泛支持、安全等级也够用的策略。几乎所有主流OPC UA SDK都支持。
- 高性能场景:Aes128_Sha256_RsaOaep。如果你用的是ARM Cortex-M级别的芯片,AES-128的加解密速度比AES-256快约40%。
- 最高安全要求:Aes256_Sha256_RsaPss。比如核电、军工、金融级数据交换。但要做好性能测试,我见过一个项目因为用了这个策略,PLC的CPU负载从30%飙到了85%。
- 遗留系统:Basic128Rsa15或Basic256。如果实在没法升级,那就用。但建议在网闸或防火墙层面做额外防护。
我的小技巧:在开发阶段,把所有支持的安全策略都列出来,让客户端和服务端自动协商到最高等级。代码里可以这样写:
// 伪代码示例
List<SecurityPolicy> supportedPolicies = new List<SecurityPolicy>();
supportedPolicies.Add(SecurityPolicy.Basic256Sha256);
supportedPolicies.Add(SecurityPolicy.Aes256_Sha256_RsaPss);
supportedPolicies.Add(SecurityPolicy.Aes128_Sha256_RsaOaep);
// 按优先级排序,选第一个双方都支持的
SecurityPolicy selected = NegotiateHighestPolicy(supportedPolicies);
3.5 避坑指南
最后,分享几个我踩过的坑:
- 坑一:Basic256这个名字有误导性。它虽然叫Basic256,但签名用的还是SHA-1。别以为名字带256就安全。
- 坑二:有些OPC UA服务器在配置文件中写的是字符串,比如“http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256”。大小写、斜杠、井号,一个都不能错。我曾经因为多了一个空格,排查了整整一下午。
- 坑三:安全策略和证书的密钥长度要匹配。比如你用Basic256Sha256,但证书的RSA密钥只有1024位,那握手时会报错。建议证书密钥至少2048位。
好了,安全策略这块就讲这么多。下一节咱们聊证书管理——那才是真正让人头疼的地方。