APP下载

一种增强的DTLS 密钥交换协议*

2022-03-16黄劲松

通信技术 2022年2期
关键词:公钥攻击者报文

黄劲松,代 霞

(中国电子科技集团公司第三十研究所,四川 成都 610041)

0 引言

近年来像视频会议、Internet 电话和在线游戏等使用用户数据报(User Datagram Protocol,UDP)协议传输的应用程序越发流行。这些应用不仅延迟敏感,并且有安全传输需求。数据报安全传输(Datagram Transport Layer Security,DTLS)[1]协议,提供了UDP传输场景下的安全解决方案,能解决消息被窃听、篡改和身份冒充等问题[2]。DTLS 协议在UDP 提供的套接字(socket)之上实现了客户端与服务器双方的握手连接,并利用cookie 验证机制和证书等实现了通信双方的身份认证,此外,通过在报文段头部加上序号,缓存乱序到达的报文段和重传机制实现了可靠传送[3-4]。DTLS 提供了椭圆曲线迪菲-赫尔曼(Elliptic Curve Diffie–Hellman,ECDH)和预共享密钥(Pre-Shared Key,PSK)两种密钥交换协议[5-6]。ECDH 密钥交换协议有效地防止了前向安全和后向安全攻击,但是涉及非对称计算和证书传输时,该协议对设备性能和网络带宽有较高要求[7-8]。PSK 密钥交换协议具备轻量、高效的优点,但是每次计算结果固定,一旦PSK 泄露将丧失对信息的安全保护能力。

本文提出了一种增强的密钥交换协议,即通信双方将PSK 存储在密钥池中,使用时通过身份标识动态选取,使用后采取相同变换方式滚动更新PSK。该增加协议不仅具备了PSK 密钥交换协议的优点,而且还实现了前向安全和后向安全,为应用数据在UDP 上提供了安全可靠的传输保障。

1 背景知识

1.1 DTLS 简介

DTLS 设计思想是构建数据报传输之上的传输层安全性协议(Transport Layer Security,TLS),具备与TLS 同样的安全机制和防护等级。DTLS 的优势:在握手和数据传输过程中均采用UDP 通道,使应用程序能轻松地管理套接字;采用一种简单轻量级重传机制实现会话建立的可靠性;提供公正、保密的数据传输通道保证数据的机密性和完整性,能够检测出被替代的数据包;部署在用户空间,不依赖于操作系统;语义上借鉴TLS 优点,接口上模仿UDP API;集成TLS 特性,尽量避免引入未知脆弱性[9]。

如图1 所示,DTLS 协议分为两层:上层包括握手、警告和应用数据3 种协议;下层为记录层,该层承载上层协议信息。

图1 DTLS 协议层次

记录层从上层接收数据后,首先进行分片、压缩、添加头部构成完整记录报文段,其次根据头部数据类型判断是否计算消息认证码(Message Authentication Code,MAC)和加密,最后调用UDP的socket 接口发送给对方。记录层仅对应用数据加密保护,因此,接收方在收到消息后,应先判断头部数据类型是否为应用数据:如果是,则进行解密并校验成功后再将明文数据传送到上层协议进行处理;如果不是,则直接将数据传送到上层协议进行处理。

1.2 DTLS 握手流程

DTLS 握手流程和TLS 基本上保持一致。与之相比,DTLS 面临如下问题:

(1)握手消息必须按照定义好的顺序传输和接收,任何一步没有跟上步调都会导致失败,这是因为DTLS 运行在不可靠的数据报通信之上,不能保证数据传输过程中的按序接收和不丢失。

(2)握手消息的长度可能超过传输的最大传输单元(Maximum Transmission Unit,MTU)值,将导致在IP 层分片;

(3)相对传输控制协议(Transmission Control Protocol,TCP)来说,UDP 连接对拒绝服务(Denial of Service,DoS)攻击更加敏感[10-11]。

为了解决这些问题,DTLS 提供的防护机制具体如下文所述。

1.2.1 超时和重传

DTLS 采用了简单的重传机制来确保握手消息正确到达对方,消息可以整合到一系列消息航程(Flight)中。虽然每次消息航程的传送可能由多个消息组成,但在超时和重传的角度上,它们应当被看作一个整体。例如,客户端第一次传输ClientHello 消息完毕后,就等待接收来自服务器的HelloVerifyRequest,如果服务器发送的消息丢失,客户端就知道ClientHello 或HelloVerifyRequest 丢失了,必须进行重传,当服务器收到重传的消息时,它必须重传自身发送的HelloVerifyRequest。服务器方不主动进行超时和重传,因为这样需要维护多个客户端的状态,会加重服务器的负担。

1.2.2 重排序

为保证握手消息按序传输,每个握手消息包含了一个序列号message_seq,当对端收到一个握手消息时,它能快速确定这个消息是否是所期望接收的下一个消息。如果是,它会进行处理;如果不是,它会将其放入队列中,在将来收到所有缺失的消息后再进行处理。[12]

1.2.3 消息分片与重组

理论上一个握手消息可能接近224-1 字节,而UDP 传输数据量往往限制于MTU 大小,一般为1 500 字节。DTLS 通过在握手格式中增加fragment_offset 和fragment_length 实现对握手消息分段处理。握手消息如果没有分片时,fragment_offset=0,fragment_length=length;如果分片,每个分片使用相同的message_seq。其中,fragment_offset 包含以前分片的长度,fragment_length 表示本分片的数据长度,接收方必须要实现数据包的缓存和重组。

1.2.4 DoS 攻击

DTLS采用和密钥交换协议(Internet Key Exchange,IKE) 一样的无状态cookie 技术,并且增加HelloVerifyRequest 用于服务器对客户端的二次校验,避免DoS 攻击。当客户端首次给服务端发送ClientHello 时,携带的cookie 为空值;然后,服务器接收到ClientHello,检验报文段中的cookie 值是否为空,如果为空,则说明之前没有建立过连接,服务器根据客户端的IP 地址通过哈希方法随机生成一个cookie,并填入HelloVerifyRequest 中发送给客户端,此时服务器不会执行分配缓冲区等操作;接着客户端将接收到的cookie 值填入ClientHello中,再次向服务器发送该报文;最后服务器检验ClientHello 里面的cookie 值是否和之前发给该客户端的cookie 值完全相同,若是,则通过cookie 验证,继续进行握手连接,若不是,则拒绝建立连接。

2 现有密钥交换协议

2.1 基于ECDH 的密钥交换协议

ECDH 密钥交换协议可以使通信双方在完全没有对方任何预先信息的条件下,通过不安全的信道创建一个密钥。即使密钥交换过程中被全程偷窥,攻击者也无法知道双方协商出的密钥。它虽然可以对抗偷窥,却无法对抗篡改,自然也就无法对抗中间人攻击(Man-in-the-MiddleAttack,MITM)。为了避免遭遇此类攻击,ECDH 需要与RSA、DSA、ECDSA 等签名算法配合,来进行身份认证。密钥交换流程如图2 所示。

图2 基于ECDH 的密钥交换流程

(1)服务器先在Certificate 报文中填写自己的证书;然后生成一个随机数作为自己的临时私钥并计算出临时公钥,在ServerKeyExchange 报文段中填写所选用的椭圆曲线参数和临时公钥,用摘要算法对ServerKeyExchange 报文段计算摘要,并用私钥和ECDSA 算法进行数字签名,将签名结果写入该报文段的末尾;最后将Certificate、ServerKeyExchange、ClientCertificateRequest 和ServerHelloDone 发送给客户端。

(2)客户端从Certificate 报文段中提取证书并验证服务器身份;从ServerKeyExchange 报文段中提取出签名结果,用服务器证书公钥进行ECDSA签名验证:若两次验证通过,继续进行握手连接;若没有验证通过,则终止握手连接。

(3)客户端生成一个随机数作为自己的临时私钥并计算出临时公钥;在ClientKeyExchange 报文段中填写自己的临时公钥。

(4)客户端使用自己的临时公/私钥、自己的证书公/私钥、服务器证书公钥和服务器临时公钥计算预主密钥;使用伪随机函数(Pseudo Random Function,PRF),以预主密钥和双方产生的随机数为参数计算会话密钥。

(5)客户端将Certificate(包含有自己的证书)、ClientKeyExchange 和Finished 报文发送给服务器。

(6)服务器从Certificate 报文段中提取证书并验证客户端身份:若验证通过,继续进行握手连接;若不是,则终止握手连接。然后从ClientKeyExchange 中提取出客户端临时公钥;使用自己的临时公/私钥、自己的证书公/私钥、客户端公钥、客户端临时公钥计算预主密钥;以相同方式计算会话密钥;验证客户端Finished 报文成功后再发送自己的Finished 报文。

2.2 基于PSK 的密钥交换协议

PSK 方式是最古老的一种密钥交换和认证方式。它预先让通信双方共享一些密钥。这些密钥在DTLS 连接尚未建立之前,就已经部署在通信双方的系统内了。

对于PSK 密钥交换协议来说,验证对方的通信身份非常关键。所以通信双方会在本地存取对方的身份标识,如psk_id、psk_id_length,并通过比较收到的报文段中的psk_id 和psk_id_length 与本地存储的是否完全一致来进行身份的验证。密钥交换流程如图3 所示。

图3 基于PSK 的密钥交换流程

(1)服务器在ServerKeyExchange 报文段填写自己的psk_id 和psk_id_length 后发送给客户端。

(2)客户端在ClientKeyExchange 报文段填写自己的psk_id 和psk_id_length 后发送给服务器。

(3)客户端和服务器分别验证对方身份,只有psk_id 和psk_id_length 与本地存储的完全一致才会进行后面的通信。

(4)双方以PSK 和双方各自产生的随机数为参数计算预主密钥,使用PRF,再以双方随机数和预主密钥为参数计算会话密钥。

(5)双方通过Finished 报文完成身份验证,验证成功才会进行后面的业务数据通信。

2.3 两种密钥交换协议分析

在面临网络偷窥攻击时,ECDH 方式网络上传输的是ECDH 算法参数、双方证书和临时公钥。攻击者可以通过监视网络得到这些信息,但是由于无法推算出双方私钥,也就无法推算出会话密钥。PSK 方式网络上传输的是PSK 身份标识,攻击者即使监视了全过程,也无法知晓PSK 密钥数据。因此,这两种方式都有效地防范了信息被偷窥。

在面临篡改攻击时,如果攻击者在ECDH 方式的ServerKeyExchange 报文中篡改了算法参数或服务器临时公钥,会被客户端发现,这是因为这些信息已经由服务器的证书私钥签名。如果攻击者在ECDH 方式的ClientKeyExchange 报文中篡改了客户端临时公钥,虽然这一步没有进行客户端证书私钥签名,服务端收到数据后暂时不会发现信息被篡改,但是,攻击者的篡改会导致服务端与客户端生成的会话密钥不一致,在后续的Finished 步骤中验证失败。如果攻击者在PSK 方式的ClientKeyExchange报文中篡改了身份标识(psk_id,psk_id_length),服务端要么发现ID 无效,要么得到的ID 与客户端不一致,在后续的Finished 步骤中验证失败。因此,这两种方式都有效地防范了信息被篡改。

在面临前向和后向攻击时,ECDH 方式的通信双方都临时产生了一对临时公/私钥,并且自己的临时公/私钥和对方的临时公钥都作为了ECDH 算法参数,所以每次产生的预主密钥均不一样,且各个计算结果之间没有相关性。因此,ECDH 方式能够抵御对前向和后向攻击。PSK 方式的通信双方共享的PSK 数据长期稳定不变。如果攻击者拿到了PSK,就可以用这个密钥得到会话密钥,然后用会话密钥加解密整个会话阶段的应用数据。因此,PSK 方式无法解决前向和后向攻击问题。一旦PSK泄露,历史的通信数据将面临严重的安全风险。如果攻击者持续进行网络监听,未来的通信数据也将完全暴露于攻击者。

在性能和资源消耗方面,ECDH 方式的通信双方需要传输各自的证书,如果该证书存在多级根证书的话,就需要传输根证书,这将导致传输开销非常大,此外,ECDH 算法和签名算法由于其复杂性,不仅运行速度慢而且对CPU 性能要求高。ECDH 方式适用于安全级别高、网络带宽大和设备性能好的场景。PSK 方式的服务器为客户端预置了密钥,仅凭一个ID信息便可快速完成信息交换和身份认证,极大简化了密钥交换过程。PSK 方式节省了设备运行和数据传输开销,具备一定的通用性,适用于对资源要求低或者耗时敏感的场景。

3 增强的密钥交换协议

本文在PSK 密码交换协议基础上,考虑在通信双方部署不同的PSK 密钥池,客户端动态选取PSK与服务器完成身份认证和密钥交换,通信双方对每次使用后的PSK 采用相同的变换方式产生新的密钥数据。该增强的密钥交换协议既有效地防范了网络偷窥、身份假冒等攻击,又具备CPU 耗时少、网络资源占用小的特点。

3.1 增强密钥交换流程

增强的密钥交换流程如图4 所示。

图4 增强的密钥交换流程

和基于PSK 的密钥交换协议相比,该协议在如下几个方面有所增强:

(1)服务器在ServerKeyExchange 报文段填写支持的身份标识列表后发送给客户端;

(2)客户端提取出服务器身份标识列表,与自己密钥池进行比较验证服务器身份,验证成功后,在服务器身份列表中动态选取一个PSK,将其身份标识填写到ClientKeyExchange 报文段中后发送给服务器;

(3)客户端和服务器双方在计算出会话密钥后,采用相同的方式滚动变换PSK 密钥数据。

3.2 密钥池存储

为了防止密钥池中的数据被窃取和篡改,需要进行加密和完整性保护。一般情况下,采用对称算法实现加密,采用杂凑算法实现完整性功能。对称算法最早有电子密码本(Electronic Code Book,ECB)、密码分组链接(Cipher Block Chaining,CBC)、密码反馈(Cipher Feed Back mode,CFB)、输出反馈(Output Feed Back Mode,OFB)等几种分组模式,但都陆续被发现有安全漏洞,现在基本都不再使用。最新的分组模式被称为带有关联数据的认证加密(Authenticated Encryption with Associated Data,AEAD),在加密的同时增加了认证功能,常用的是伽罗华/计数器模式(Galois/Counter Mode,GCM)、密码块链消息认证码(Counter with Cipher Block Chaining-Message Authentication Code,CCM)和Poly1305[13]。通信双方可以使用对称算法的AEAD 模式对密钥池进行加密认证,这样既节省了再次使用杂凑算法带来的开销,又避免了BEAST、Lucky 13 和POODLE 等攻击,具备较强的安全性。用于密钥池加密认证的密钥Key 只有客户端和服务器知道。服务器可以为不同的客户端设置不同的Key,这样即使某个客户端Key 发生泄露,只会对该客户端PSK 信息造成安全隐患,这种隐患不会波及整个密钥池。如果客户端与用户绑定,可以通过用户指纹、面容等生理特征产生密钥Key;如果客户端与设备绑定,可以通过设备硬盘序列号、网口介质访问控制(Media Access Control,MAC)地址等特征产生密钥Key。该密钥Key 只能在使用时产生,不能保存在本地,且只能用于密钥池加密,不能再有其他用途。

3.3 PSK 动态选取

在密钥交换过程中,客户端动态选取该次连接使用的PSK。动态选用应该做到随机性和平均性。rand 函数可以用来产生随机数,但是这不是真正意义上的随机数,是根据一个随机种子为基准以某个递推公式推算出来的一系列数。当这个系列数很大的时候,就符合正态分布,从而相当于产生了随机数。但这是个伪随机数,当取数的次数大于随机数周期时,得到的结果就会重复出现。为了增加随机性,可以先使用当前时钟为参数调用srand 函数产生不同的随机种子,因为每次运行程序的时间都不相同。无论什么时候,都可以给srand 提供一个新的种子,从而进一步随机化rand 输出结果。客户端为每个PSK 增加使用次数属性,首先通过时钟、srand 和rand 函数产生PSK 在密钥池中的索引,其次查看该索引对应的密钥使用次数,判断该密钥是否被频繁使用:如果是,则重新产生索引;如果不是,就使用该密钥,使用次数加1。

3.4 PSK 滚动更新

每次计算出会话密钥后,客户端和服务器将以相同的方式对PSK 密钥数据进行滚动变换,将变换后的数据保存在密钥池中。由于UDP 数据报对时间敏感,滚动变换过程不能过于复杂,需要满足耗时少、开销小的要求。因此,可以使用当前的PSK密钥数据、握手信息和特定盐值为参数,调用不可逆函数PRF 进行计算,截取部分结果作为新密钥。

3.5 安全性分析

假设攻击者窃取了某次连接的PSK 和存储了通信的历史数据,包括握手阶段和业务通信阶段的数据。若两次连接选用了不同的预置密钥(身份标识ID 不相同),则他无法通过手中的PSK 得到历史PSK,也就无法解密历史数据;若两次连接选用了相同的预置密钥(身份标识ID 相同),由于他手中的PSK 是历史PSK 通过不可逆函数计算得来的,反向推算出历史PSK 的可能性很小,仍然无法解密历史数据。因此,该增强密钥交换协议实现了先前安全性。

假设攻击者窃取了某次连接的PSK 且继续进行网络窃听,在某次新连接中,客户端和服务器采用了与失泄连接相同ID 的预置密钥。由于新连接的PSK 已经在失泄连接的PSK 基础上进行了滚动变换,只要特定盐值(SALT)不丢失,攻击者手中的PSK 就无法计算出正确的新PSK,也就无法解密新连接中的通信数据。因此,该增强密钥交换协议降低了后向安全攻击的风险,具有一定的后向安全性。

4 结语

DTLS 是用于UDP 传输过程的加密协议,保证了采用数据报传输的应用程序间的数据安全性。本文详细描述了基于ECDH 和PSK 两种密钥交换协议,分析了这两种协议在安全性和适用性方面的优缺点,虽然它们都能够有效地防止偷窥、身份假冒攻击,但是都存在一些缺陷。基于ECDH 密钥交换协议在预主密钥计算中引入了随机数,因而具有前向安全和后向安全性;但是涉及非对称计算和证书传输,因而速率慢、资源消耗大。基于PSK 密钥交换协议仅交换身份标识,因而速度快、资源消耗小;但是密钥数据长期不变,无法防范前向和后向安全攻击。本文提出的增强密钥交换协议具备了PSK 密钥交换协议的优势,同时采取了密钥池存储多个PSK、使用时动态随机选取和使用后滚动更新的措施,解决了前向安全和后向安全攻击问题。由于本协议对服务器存储能力有较高要求,可以在下一步的工作中解决密钥池高效存储问题。

猜你喜欢

公钥攻击者报文
基于J1939 协议多包报文的时序研究及应用
低轨星座短报文通信中的扩频信号二维快捕优化与实现
CTCS-2级报文数据管理需求分析和实现
浅析反驳类报文要点
神奇的公钥密码
正面迎接批判
正面迎接批判
国密SM2密码算法的C语言实现
P2X7 receptor antagonism in amyotrophic lateral sclerosis
有限次重复博弈下的网络攻击行为研究