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 实际项目中的选择建议

我直接给结论吧,省得你们纠结:

  1. 新项目首选:Basic256Sha256。这是目前最广泛支持、安全等级也够用的策略。几乎所有主流OPC UA SDK都支持。
  2. 高性能场景:Aes128_Sha256_RsaOaep。如果你用的是ARM Cortex-M级别的芯片,AES-128的加解密速度比AES-256快约40%。
  3. 最高安全要求:Aes256_Sha256_RsaPss。比如核电、军工、金融级数据交换。但要做好性能测试,我见过一个项目因为用了这个策略,PLC的CPU负载从30%飙到了85%。
  4. 遗留系统: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位。

好了,安全策略这块就讲这么多。下一节咱们聊证书管理——那才是真正让人头疼的地方。