季海涛,张芳敏,黄柳胜,孙孟玉,黄炳洁
(1.上海电力大学电子与信息工程学院,上海 200000;2.江苏林洋能源股份有限公司,江苏 启东 226200)
智能电表作为电网中的终端设备,将信息流、业务流、电力流高度融合一体化,实现分布式计量、达到客户与电表终端双向互动服务。计量信息涉及用户与供电部门的利益,数据安全防护至关重要。信息安全解决方案在AMI 联网抄表系统及智能电网基础设施中得以广泛部署[1-2],从各国的智能电网系统环境结合电表通信的规划和应用分析,各批次智能电表因存储空间及CPU 等资源的局限性,更好地实现电表安全也因此受到限制。当下主流的安全方案也渐渐成为智能电表的需求。文献[3]研究了一种新的基于分布式区块链的保护方案,以增强电表抵御网络攻击的能力。IPsec 安全协议必须处理可靠性和分片的问题[4]。TLS 协议是应用最为广泛的安全通信协议,新一代TLS 协议1.3 版本的安全性和高速性得到很大提高[5-7]。TLS1.3 协议采用高强度的加密及认证机制实现了信息的安全防护。
由于主流安全协议的复杂性和处理开销,无法更好地应用于智能电表。该文从电力系统基础设施、电表所用芯片性能、成本及通信安全强度等方面进行综合考虑,在传统智能电表通信网络协议栈中嵌入TLS1.3 协议,设计了一套TLS1.3 协议在电表上的应用方案,实现电表的高强度安全通信,使电表更好地融入智能电网。
当前智能电表愈加智能化和网络化,多数已知的安全漏洞都与通信媒介及协议相关[8-9]。电表作为电力信息采集的计量设备,一般采用RS485串口通信协议或其他方式连接终端设备,基于电表在智能电网中的实际应用,从以下方面分析电表安全协议需求。
基于电表硬件性能的限制,在电表与主站系统的信息处理方面存在一定的不足,其业务处理能力受制于电表采用的微控制单元MCU 的性能。TLS1.3协议涉及密钥协商、数字签名、签名验证、公钥生成等算法[10-11]。在电表上采用TLS1.3 协议,需要考虑电表运行安全协议的速度,即电表对主站系统的响应时间。电表需要按规定时间响应主站系统的消息请求,当电表选择运行不同的密码套件、椭圆曲线类型或者握手子消息时,电表耗时差距很大,若电表MCU 主频较低时,TLS1.3 握手耗时长,可能出现超时处理,造成网络连接失败等。TLS1.3 协议在智能电表中的处理流程如图1 所示。
图1 TLS1.3协议在智能电表中的处理流程
安全强度高的加密算法对电表MCU 的计算性能要求高。若MCU 主频较低,电表使用复杂的安全算法,虽然安全强度更高,但加密运算时间过长,无法及时应答主站,将会导致网络瘫痪等后果。方案基于电表MCU 性能,选择合适的TLS1.3 加密套件,结合TLS1.3 协议子消息的设计,使电表在保证传输安全的同时,及时响应主站请求。TLS1.3 协议根据已发生的攻击行为,删除了一些不安全的加密算法[12-14]。支持的加密套件,每个都有明显的优势,智能电表可根据算法的安全强度和硬件资源进行选择。方案选择密码套件的依据如下:
1)AES_128_CCM_8_SHA256 密码套件。CCM模式的标准认证标签为16 个字节,CCM_8 模式的密码套件将标签减少到8 个字节,从而节省了8 个字节的开销,但代价是更高的伪造概率。
2)若电表支持加密和认证硬件加速,优先选择AES_128_GCM_SHA256 加密套件,安全强度高且运算速度快。若电表只支持AES 硬件加速,优先选择TLS1.3 加密套件AES_128_CCM_SHA256,CCM 模式没有GCM 模式的输入大小限制,比GCM模式更容易实现。
3)智能电表若没有硬件加速资源,加密和认证算法采用纯软件来实现,AEC_GCM/CCM 算法运算速度慢,优先选择CHACHA20_POLY1305_SHA256套件。
4)若电表采用性能较高的MCU,追求更高的安全强度,可以选择TLS1.3 协议加密套件AES_256_GCM_SHA384,对于Grover 算法攻击有更高的抵抗力,可以使电表通信更加安全,但提高了成本,且对电表要求较高。
TLS1.3 标准协议较为复杂,由握手协议和记录协议组成[15-16]。握手协议旨在通过认证密钥交换机制来协商密钥,负责电表与集中器协商会话状态的密钥参数。为了提高该电表安全方案的拓展性、复用性和灵活性,着重设计了TLS1.3 的握手协议。握手协议由众多子消息组成,可根据实际应用进行裁剪。记录协议负责加解密及封装数据,可依据协议标准进行设计,此处不做赘述。该方案的电表握手过程如图2 所示。
图2 电表握手流程
握手步骤可总结如下:
1)为与终端设备GateWay 密钥进行协商,智能电表解析了ClientHello 数据帧。ClientHello 数据帧中扩展extension 还会带有supported_groups 扩展,这个扩展表明了GateWay 支持的用于密钥交换的命名组,按照优先级从高到低,电表按照支持组件supported_groups 中得到的匹配项,匹配共享密钥key_share扩展中的类型。电表选择GateWay支持的椭圆曲线类型,使用椭圆曲线的基点计算电表的公钥。
2)电表提取ClientHello 中的key_share 扩展对应的公钥,计算主秘钥放在ServerHello 的key_share 扩展中,密钥协商计算完成后,电表以ServerHello 作为响应数据帧,向GateWay 传输电表协商成功的相关信息。该方案禁止电表重协商,若电表完成协商后又收到ClientHello 数据帧,将立即告警并断开连接。电表TLS1.3 握手协议中,ServerHello 需要携带supproted_versions 扩展,且包含自己supproted_versions 中选择的TLS 协议版本号。电表不作降级处理,GateWay 请求TLS1.3 协议连接,则电表以TLS1.3 协议响应,否则将断开连接。
3)在该方案中,电表从ClientHello 数据帧中获得密钥协商的相关信息,结合电表参数,完成椭圆曲线密钥协商,之后将使用握手层密钥加密握手信息。为保证电表的扩展信息安全,可将一些重要的协商参数放在加密扩展EncrypytedExtensions 帧中进行传输,但影响握手速度,增加了系统开销,因此可设置为空。
4)方案采用证书进行双向认证,为了加快身份认证,当电表向GateWay 发送证书请求消息时,同时从EEPROM 读取自己的证书并发送。该方式避免GateWay 向电表发送证书请求,减少设备认证耗时。
5)为防止上述信息被篡改,电表对之前的握手数据进行计算签名,并通过Certificate Verify 数据帧发送。该消息必须在Certificate 消息之后、Finished消息之前发送。
6)电表发送Finished 数据帧作为电表身份认证阶段的最后一条信息。若GateWay 通过验证电表的Certificate Verify 数据帧和Finished 数据帧,将发送应用层数据。
7)若终端验证电表证书成功,将响应电表的请求并发送证书。电表验证证书和Finished 数据帧成功后,握手完成。智能电表导出记录层所需的密钥材料,以交换通过认证加密保护的应用层数据。
GateWay基于主站系统组网要求,发送TLS1.3协议握手请求,为了与电表协商握手信息,ClientHello数据帧将携带大量的扩展信息。智能电表收到ClientHello 消息后,按照次序逐个解析扩展信息,依据电表的需求,处理并响应相关扩展,其余扩展为了降低电表开销而不作处理。
基于该方案设计的TLS1.3 握手流程,电表须响应的扩展类型信息如表1 所示,选择响应的扩展信息并作出响应。
表1 电表扩展信息类型
基于PKI 体系的证书认证方式无法适用于电力基础设施薄弱的地区,如公司某海外项目。为了使电表完成TLS1.3 协议中的设备认证,在一定程度上简化了电表认证实现的复杂度。电表建立通信时,执行证书初始化,通过密钥协商生成加密密钥,主站系统向电表传输电表和GateWay 的两张证书及其对应私钥,电表解密成功并写入EEPROM。在证书预装过程中使用通信开销较低的对称加密和哈希函数,证书初始化完成后,电表与GateWay 进行TLS1.3 连接。
为降低系统开销,电表在TLS1.3 握手双向认证时,不完全解析GateWay 发送的证书,只与预装的GateWay 证书作比较,若一致则认证成功。
该方案已用于公司项目,电表所用MCU 为FM33A048,主频最高达40 MHz,RAM 容量为32 kB,电表应用层为SML 协议,自动抄表系统底层通信协议为链路层。电表所用的MCU 性能较低。安全方案应用于项目的关键信息如下:
1)在保证安全强度的前提下,电表选择支持TLS1.3 协议AES_128_GCM_SHA256 加密套件和CHACHA20_POLY1305_SHA256套件,为减少电表与GateWay建立TLS1.3握手的耗时,电表执行TLS1.3密钥协商,优先选择CHACHA20_POLY1305_SHA256加密套件。
2)智能电表支持的曲线类型:secp256r1、secp384r1、BrainpoolP384r1。可根据客户方的电网需求进行选择。
3)电表对收到的证书未全面解析,只将其中的公钥取出,未作抄表客户端证书验证,只与证书初始化中传递过来的SGW 证书作比较。
4)智能电表的数据流采用内存复用方案,即采用应用层SML、TLS 层、物理层HDLC 三层数据流共用一个空间的形式来减少内存空间的使用,电表应用层将数据放入数据流时,根据TLS1.3 握手协商出的安全套件预留出不同的TLS1.3 头尾空间,以便TLS 层进行应用层数据加密。
该电表安全方案采用纯软件来实现,TLS1.3协议中的ECC 算法运算量大、耗时较长,算法中使用不同类型的椭圆曲线,通过涉及的Compute Shared Secret、Key Generation、Public Key Validation、Signature Generation 和Signature Verification 算法运行过程耗时来体现,为了使电表及时响应和减少所需空间,通过调整window size、编译器优化等级和ECC 算法单次执行比特位stepNum 的大小,测试电表的最佳运行状态。
算法性能与密钥长度关系很大,由表2 中的信息分析可得,签名验证算法在电表运行中耗时最长,使用椭圆曲线BrainpoolP384r1 签名验证平均耗时约20 s。根据主站系统的响应时间要求选择ECC 曲线类型。
表2 windows size=2电表耗时
为了使电表运行在最佳状态,须确定ECC算法中滑动窗口的大小,以TLS1.3 协议Signature Generation算法为例进行说明,签名使用的椭圆曲线类型为BrainpoolP384r1,其他测试环境变量不变。由表2 和表3 的数据进行分析,相比电表在windows size=4,单次执行k的位数stepNum=10 的运行环境下,当选择的windows size=2 时,单次运行算法平均耗时增加约0.89 s,TLS1.3 总体握手协议运行时间增加约为10 s,但优势是空间节省了0.87 kB。
表3 windows size=4电表耗时
综上所述,电表密钥协商、签名生成及验证使用NIST P-256(secp256r1)、NIST P-384 (secp384r1)和BrainpoolP384r1 三条曲线进行测试。在本公司的项目中,滑动窗口大小设置为4 bit。编译器IAR 开启高级优化,经过批量测试,程序运行稳定;ECC 算法标量乘单次执行比特位StepNum 为10 bit,执行结束退出ECC 运算,并保存当前运算数据,在其他任务完成后再次进入退出时的断点继续进行运算,该数值依据MCU 的主频进行设置,若主频较高,可以增大单次执行比特位。经过长期大量测试,电表运行稳定。
在电网的建设中,接入大量性能各异的智能电表,随着电力公司对电表通信安全的要求不断提高,某些海外地区要求电表升级支持TLS1.3 协议,以对抗网络攻击。由于TLS1.3 协议庞大复杂,一些智能电表因节省成本而采用低端且无硬件加密的芯片,处理速度及硬件资源成为实施TLS1.3 协议的瓶颈。因此,该文对TLS1.3 协议进行二次开发,在安全强度、公私钥尺寸和计算速度等方面作出平衡,在电表上以纯软件实现TLS1.3 协议,设计TLS1.3 握手协议和认证机制以兼容现有的电力基础设施。该方案已用于德国智能电表,结果表明其满足实际安全需求,电表接入当地智能电网安全、稳定。