DTLS 技术要点解析_0

2024-04-02 07:08
文章标签 技术 解析 要点 dtls

本文主要是介绍DTLS 技术要点解析_0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、DTLS

DTLS 是指 Datagram Transport Level Security,即数据报安全传输协议; 
其提供了UDP 传输场景下的安全解决方案,能防止消息被窃听、篡改、身份冒充等问题。 
DTLS作为UDP版本的TLS,具备了同样的安全机制和防护等级,在版本上存在对应关系,如DTLS 1.2版本对应于 TLS1.2。

二、握手流程

前面的文章介绍过TLS的相关算法流程,对于传输层安全来说,密钥交换机制和数据加密及签名算法决定了整个方案的安全等级。 
而密钥协商都必须通过握手流程完成,因而这是理解DTLS的关键要点。

根据RFC6347定义,一个DTLS握手流程如下所示:

   ------                                          ------
ClientHello             -------->                           Flight 1
<-------    HelloVerifyRequest      Flight 2
ClientHello             -------->                           Flight 3
ServerHello    \
Certificate*     \
ServerKeyExchange*      Flight 4
CertificateRequest*     /
<--------      ServerHelloDone    /
Certificate*                                              \
ClientKeyExchange                                          \
CertificateVerify*                                          Flight 5
[ChangeCipherSpec]                                         /
Finished                -------->                         /
[ChangeCipherSpec]    \ Flight 6
<--------             Finished    /
 
    流程与TLS概念上是一致的,其中Flight对应一次通过网络发送的数据包;
 
    HelloVerifyRequest 用于服务端对客户端实现二次校验;
    Certificate是交换的证书,由协商后的算法确定是否需要传输;
    当服务端要求验证客户端身份时,发起CertificateRequest,此时客户端需要发送证书;
    ChangeCipherSpec是一个简单的标记,标明当前已经完成密钥协商,可以准备传输;
    Finished消息表示握手结束,通常会携带加密数据由对端进行初次验证。
 

三、关键算法

DTLS 由于网络IO机制的限制,其支持的算法为TLS的子集。 
这里将DTLS算法描述为一种算法可能并不恰当,因为一个完整的DTLS过程中,所涉及的算法是很多的,比如 
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,这其中涉及的算法包括:

1 密钥交换算法 ECDHE_RSA,这是由ECC和DH密钥交换算法衍生出来的算法; 
2 动态密钥算法 AES_128_GCM,用于实现数据包的加解密; 
3 MAC算法 HMAC_SHA256,用于创建加密数据块的摘要; 
4 伪随机函数 PRF,TLS1.2 定义其与MAC算法一致。

因此将一个DTLS过程中协商使用的算法列表称谓算法套件,即CipherSuite,个人认为这个定义还是比较好理解的。

以下是几个常用的 CipherSuite

TLS_PSK_WITH_AES_128_CBC_SHA256
TLS_PSK_WITH_AES_128_CCM_8
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8

 

算法的选择

不同算法带来的数据传输及计算性能开销是不同的,尤其在UDP场景下,我们可能更关注的是网络IO的不稳定性,MTU过载导致丢包等等问题。

非对称密钥加解密的性能是低下的,尤其在微型设备上,其计算资源十分有限,因此采用轻量级的密钥交换算法可能是最佳方案。 
PSK(Pre shared key) 算法中,服务端为终端预置了密钥,在交换过程中凭一个identity信息可快速完成信息交换,这个极大简化了密钥交换的工作。 
一个典型的PSK握手流程如下所示:

         Client                                               Server
------                                               ------
ClientHello                 -------->
<--------    HelloVerifyRequest
(contains cookie)
ClientHello                  -------->
(with cookie)
ServerHello
*ServerKeyExchange
<--------      ServerHelloDone
ClientKeyExchange
ChangeCipherSpec
Finished                     -------->
ChangeCipherSpec
<--------             Finished
Application Data             <------->     Application Data

 

PSK方案的缺陷在于其无法较好的防止PSF(Perfect Forward Secrecy)攻击问题,一旦PSK泄露,将丢失安全性。

然而方案的选择并非力求完美,我们往往要找的是最适合需求的方案。PSK方案轻量级,节省开销,且具备一定的通用性; 
而对于安全级别特别高的场景,你或许可以选择ECDHE交换算法,而为了节省证书传输的开销,你可以采取一些扩展机制,如Raw Public Key。 
这是一种允许直接将公钥数据替代证书的方案,可一定程度节省CA证书传输及信任链校验的开销。

RFC7925 对物联网场景下的DTLS提供了一些扩展定义,可供参考。

 

四、防护机制

A. 握手流程

握手流程必须严格按顺序执行,因此有必要保证消息可靠到达,按序接收。

重传 
DTLS 采用了简单的重传机制来确保握手消息到达,流程如下:

         Client                                   Server
------                                   ------
ClientHello           ------>
X<-- HelloVerifyRequest
(lost)
[Timer Expires]
ClientHello           ------>
(retransmit)

 

顺序 
为保证握手消息按序传输,每个handshake消息包含了一个序列号; 
接收方直接处理属于当前步骤的消息,对于提前到达的消息则提供一个队列进行缓存;

分段 
理论上一个握手消息可能接近2^24-1字节, 而UDP 传输中往往限制于MTU 大小,一般为1500字节; 
因此 DTLS 要求针对握手消息实现分段,每一个握手消息都可能包含了fragment的offset 和长度,由接收端重新组装;

重复 
DTLS 定义了消息重放检测机制,由接收方维护一个bitmap用于记录一接收的数据包,用于检测重复数据包;建议解决方案实现对bitmap的自动老化。 
该做法借鉴了IPsec AH/ESP机制。

B. 数据包传输

加解密算法很可能依赖于上下文,如CBC组合算法中,当前数据包的解密依赖于上一个数据包,因此有必要保证数据包传输的可靠和有序; 
DTLS为每个加密数据包增加了MAC鉴权摘要,用于保证数据包的完整性;此外显式附带了一个SN号用于排序。

C. Dos攻击

攻击者很可能会利用一些已入侵的主机对服务器展开攻击(数据包转发),通过瞬时对DTLS服务器发送大量的握手消息导致服务器资源耗尽; 
DTLS定义了基于cookie验证的机制来预防攻击,如前面流程中涉及的HelloVerifyRequest便是用于进行cookie验证

      Client                                   Server
------                                   ------
ClientHello           ------>
<----- HelloVerifyRequest
(contains cookie)
ClientHello           ------>
(with cookie)
[Rest of handshake]

 

Cookie的算法:HMAC(Secret, Client-IP, Client-Parameters) 
其中Secret由server端内置,用于计算cookie值,client端需要在接收到VerifyRequest后提供同样的cookie值; 
server端根据发送方IP计算cookie值,一旦返现不一致则判定为非法数据。

D. 会话恢复

握手流程所占的开销是较大的,与TLS类似,DTLS也定义了会话恢复机制。

   Client                                           Server
------                                           ------
ClientHello             -------->                          Flight 1
ServerHello    \
[ChangeCipherSpec]     Flight 2
<--------             Finished    /
[ChangeCipherSpec]                                         \Flight 3 
Finished -------->

 

简单原理 
握手成功之后,Server端将生成SessionID 返回,客户端在下次连接时附带SessionID; 
若验证通过,可直接沿用原有的会话数据,包括协商算法和密钥。

五、与TLS的不同

最后,总结下与TLS的差异吧

  1. TLS 建立于TCP可靠的传输机制之上,而DTLS基于UDP,必须自建保障机制: 
    DTLS 必须检测MTU大小,当应用层数据包超过时报错; 
    为防止握手的IP数据包超载导致丢失,DTLS 针对握手消息实现fragment处理。

  2. TLS 在传输出错时会中断连接,而DTLS需兼容多种出错场景,出错时往往直接丢弃处理;

  3. DTLS不支持RC4流加密算法。

六、参考文档

DTLS1.2 定义 
https://tools.ietf.org/html/rfc6347 
DTLS -IOT extension 
https://tools.ietf.org/html/rfc7925#section-4.1 
TLS /SSL 原理解析 
http://seanlook.com/2015/01/07/tls-ssl/ 
关于TLS的隐式向量 
https://en.wikipedia.org/wiki/Initialization_vector 
老外写的关于PSF的文章 
https://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html

这篇关于DTLS 技术要点解析_0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869302

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、