一、DTLS

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

二、握手流程

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

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

   ------                                          ------

   ClientHello             -------->                           Flight 

                           <-------    HelloVerifyRequest      Flight 

   ClientHello             -------->                           Flight 

                                              ServerHello    \
Certificate* \
ServerKeyExchange* Flight
CertificateRequest* /
<-------- ServerHelloDone / Certificate* \
ClientKeyExchange \
CertificateVerify* Flight
[ChangeCipherSpec] /
Finished --------> / [ChangeCipherSpec] \ Flight
<-------- 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 ServerHello \
[ChangeCipherSpec] Flight
<-------- Finished / [ChangeCipherSpec] \Flight
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 技术要点解析的更多相关文章

  1. Java程序员需要突破的技术要点

    一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...

  2. Tapdata 数据库实时同步的技术要点

    Tapdata 是由深圳钛铂数据有限公司研发的一款实时数据处理及服务的平台产品,企业可以使用 Tapdata 快速构建数据中台和实时数仓, Tapdata 提供了一站式的解决方案,包括实时数据采集.数 ...

  3. Android安全攻防战,反编译与混淆技术完全解析(下)

    在上一篇文章当中,我们学习了Android程序反编译方面的知识,包括反编译代码.反编译资源.以及重新打包等内容.通过这些内容我们也能看出来,其实我们的程序并没有那么的安全.可能资源被反编译影响还不是很 ...

  4. Android安全攻防战,反编译与混淆技术完全解析(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/49738023 之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值 ...

  5. React.js 常用技术要点

    最近在公司的一个移动端WEB产品中使用了React这个框架(并不是React-Native),记录一下在开发过程中遇到的各种问题以及对应的解决方法,希望能对读者有所帮助. React原则 React不 ...

  6. K2 Blackpearl开发技术要点(Part2)

    转:http://www.cnblogs.com/dannyli/archive/2012/09/14/2685282.html K2 Blackpearl开发技术要点(Part2)  

  7. K2 Blackpearl开发技术要点(Part1)

    转:http://www.cnblogs.com/dannyli/archive/2012/09/14/2685260.html K2 Blackpearl开发技术要点(Part1) 预知后事如何,请 ...

  8. R语言统计分析技术研究 特征值选择技术要点

    特征值选择技术要点                          作者:王立敏 文章来源:  网络 1.特征值 特征值是线性代数中的一个重要概念.在数学,物理学,化学,计算机等领域有着广泛的应用. ...

  9. Excel阅读模式/单元格行列指示/聚光灯开发 技术要点再分享

    1. 引言 文题中所谓技术要点再分享,本意是想在大神Charltsing Liu的博文“简单介绍Excel单元格行列指示的实现原理(俗称聚光灯功能)”的基础上写一点个人开发体会.写本文的初衷有三点,一 ...

随机推荐

  1. 如何用PC标签在列表页中调出文章内容 phpcms

    如何用PC标签在列表页中调出文章内容 phpcms v9 moreinfo=”"参数说明 {pc:content action="lists" catid="$ ...

  2. C# 开发系列(一)

    1.开发环境搭建: win7 32位系统,然后安装 visual studio 2012. 2.将 .net_framework 加入到windows 的环境变量当中. C:\Windows\Micr ...

  3. myEclipse 8.5下SVN环境的搭建

    myEclipse 8.5下SVN环境的搭建 在应用myEclips 8.5做项目时,svn会成为团队项目的一个非常好的工具,苦苦在网上寻求了一下午,终于整合好了这个环境,在这里简单介绍下,希望能为刚 ...

  4. 不小心删掉root目录......

    1.先保存还剩下的的东西,比如说桌面的文件,保存在/下面其他目录 2.执行命令 cp -R /etc/skel/.[!.]* ./ 3.reboot

  5. OC语言的特性(一)-消息传递与调用函数的表现形式

    我们在初学Objective-C时,都会觉得ObjC中的消息传递和其他语言的调用函数差不多,只是在OC中,方法调用用消息传递这一概念来代替. 那么到底怎样区别OC中的消息传递与其他语言的调用函数呢. ...

  6. mysql问题: alter导致速度慢

    1 如何并行执行. 数据库里有一个数据量非常大的表,当对这个表进行alter的时候,这时候该表是只读的,由于数据量很大alter时间很长,如果这时候有insert或update操作,有什么办法在这期间 ...

  7. iOS KVC setValuesForKeysWithDictionary的使用

    Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property ac ...

  8. 【亲测】Python:解决方案:Python Version 2.7 required, which was not found in the registry

    好久不更新随笔了,今天因为数据可视化作业,想抓取一些人人网好友关系数据,于是开始尝试python,用到numpy模块,安装的时候提示: 'Python Version 2.7 required, wh ...

  9. winscp 秘钥登录

    如题 如果不想用密码登录,可以选择用秘钥文件登录winscp 原理和linux分发ssh公钥是一个道理 1:在被管理的机器上分发公钥 ,出现 authorized_keys才可以 完成服务端配置 2: ...

  10. MQ-2烟雾传感器启动

    MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2).当传感器所处环境中 存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大.使用简单的电路即可将电导率的 变化 ...