1.DTLS介绍

1.1 DTLS的作用

互联网先驱们最开始在设计互联网协议时主要考虑的是可用性,安全性是没有考虑在其中的,所以传输层的TCP、UDP协议本身都不具备安全性。SSL/TLS协议是基于TCP socket,利用加密、基于数字证书的身份验证等机制在传输层和应用层之间构建了一个端到端的安全通道,保证了传输数据的加密性。

但是SSL/TLS协议并不能用于UDP协议,而UDP也有安全传输的需求,于是产生了DTLS协议(Datagram TLS)。

即DTLS的作用为给UDP提供端到端的安全通道,就像SSL/TLS对TCP的作用一样。并且DTLS尽可能参考了SSL/TLS协议的安全机制,在具体实现上复用了70%的TLS代码。

1.2 DTLS的特点

UDP协议是不面向连接的不可靠协议,且没有对传输的报文段进行加密,不能保证通信双方的身份认证、消息传输过程中的按序接收、不丢失和加密传送。

而DTLS协议在UDP提供的socket之上实现了客户机与服务器双方的握手连接,并且在握手过程中通过使用PSK或ECC实现了加密,并且利用cookie验证机制和证书实现了通信双方的身份认证,并且用在报文段头部加上序号,缓存乱序到达的报文段和重传机制实现了可靠传送。

在握手完成后,通信双方就可以利用握手阶段协商好的会话密钥来对应用数据进行加解密。

1.3 DTLS协议层次

DLTS协议分为两层,下层为记录层(record层),record包的内容分为头部和载荷两部分。record包的载荷即为上层的内容。DTLS上层的包的类型分为三种,分别是握手消息,警告消息,应用数据;如图一所示。

图一.DTLS协议的层次

在整个DTLS协议的通信过程中,通信双方构造报文段的过程都是先产生上层的载荷消息(如握手消息,应用数据,警告消息),然后添加头部,构成完整的上层消息。接着再以此作为记录层的载荷,最后添加记录层的头部,构成完整的记录报文段,最后调用UDP的socket接口,发送给另一方。

加密过程是只对记录层的载荷(即上层消息,此协议中被加密的消息是finished消息和应用数据两种)进行加密,所以接收方在收到记录消息后,首先要做的也是判断记录消息是否被发送方加密,若是,则应先解密才能读取出明文数据以进行后面的处理。

2.client/server建立DTLS连接的握手过程

2.1 整个握手阶段的交互过程

DTLS的传输阶段分为两个:握手阶段和握手建立之后的传输应用数据阶段。

DTLS的握手阶段如下图二所示:

图二.DTLS协议客户机与服务器握手阶段的交互过程

客户机向服务器发起连接,服务器可以根据配置选择是否验证客户机的cookie和证书(即是否向客户机发送client_hello_verify和certificate_request报文段)。

2.2 DTLS的cookie验证机制

由于DTLS是基于UDP的,所以可能会遭受两种形式的拒绝服务攻击。一种是类似于对TCP的资源消耗攻击,另一种是放大攻击,即恶意攻击者仿造被攻击者的IP地址发通信初始化报文段给服务器,而服务器会返回一个体积大很多的证书给被攻击者,超大量证书有可能造成被攻击者的瘫痪。

cookie机制要求客户机重复发送服务器之前发送的cookie值来验证通信方的源IP地址确实可以通信,由此可以减少拒绝服务攻击的危害。

cookie验证身份的具体机制为:

协议规定客户机发送的第一个报文段client_hello中含有cookie的值这一项(有可能为空)。服务器检验收到的该报文段中的cookie值,如果cookie为空,则说明之前没建立过连接,服务器根据客户机的源IP地址通过哈希方法随机生成一个cookie,并填入client_hello_verify中发送给客户机。

客户机再在第二次发送的client_hello报文段中填入服务器之前发过来的cookie,服务器第二次收到该报文段之后便检验报文段里面的cookie值和服务器之前发给该主机的cookie值是否完全相同,若是,则通过cookie验证,继续进行握手连接;若不是,则拒绝建立连接。

2.3 client_hello报文段和server_hello报文段的内容

client_hello报文段的内容除cookie外,还有客户机产生的32字节的随机数,其中前4字节为时间戳,后28字节为系统产生的随机数。此外,该报文段的内容还有客户机支持的加密方式(PSK或者ECC)和压缩方式,供服务器进行选择。

在通过cookie校验后,服务器发送server_hello报文段给客户机。该报文段包含有服务器产生的32字节的随机数,和服务器选中的用来进行之后的会话的加密方式和压缩方式。

2.4 certificate报文段的内容

在服务器发给客户机的证书报文段中,包含有服务器证书的公钥;客户机接收到该报文段后,按照协议规定,从报文段的对应位置中读取出服务器证书的公钥存入相关变量中。

2.5 基于ECC加密方式的ECDH秘钥交换协议和ECDSA数字签名算法

若协议所选加密方式为ECC(椭圆曲线加密),则在server_key_exchange报文段的构造过程中会使用ECDH(椭圆曲线秘钥交换协议)和ECDSA(椭圆曲线数字签名算法)。ECDH和ECDSA分别是ECC和DH(diffie-hellman)秘钥交换协议、DSA(数字签名算法)的结合。

在server_key_exchange报文段中,包含有所选用的椭圆曲线E,阶N和基点G的x,y坐标,客户机在收到这个报文段后,进行对应的格式检验,并读取数据,因此服务器和客户机共同获得约定好的用来进行ECDH秘钥协商交换协议的参数,从而可以共同协商出相同的对话秘钥用于加密之后的会话内容。

同时,为了防范中间人攻击,服务器还在server_key_exchange报文段的末尾对整个报文段进行了ECDSA数字签名。具体签名过程为先用client_hello报文段和server_hello报文段中的2个32字节的随机数作为函数参数,利用sha256哈希算法对server_key_exchange报文段本身的载荷产生摘要,然后再用服务器的私钥和sha256哈希算法进行ECDSA数字签名,得到签名结果r和s,并写入server_key_exchange报文段的末尾。

客户机在收到server_key_exchange报文段后,先进行各数值项格式的校验,然后提取出报文段末尾的签名值r和s。之后,用已经读取出的服务器的公钥的x,y坐标值来对server_key_exchange报文段进行ECDSA签名验证,若结果和报文段中的r和s值一致,则报文段通过验证。

2.6 基于PSK加密方式的身份认证过程和会话秘钥产生过程

整个DTLS协议的加密方式可选用ECC或PSK(预共享秘钥,PreSharedKey)两种。若为ECC,则通过ECDH协议来进行通信双方的秘钥协商;若为PSK,则直接以通信双方事先就已经约定好了的秘钥为基础来进行加密通信。

对于PSK加密通信来说,验证对方的通信身份非常关键。所以通信双方会在本地存取对方的psk_id(即身份标志)和psk_id_length(身份标志长度),通过比较收到的报文段中的psk_id,psk_id_length和本地存储的是否完全一致来进行对方身份的验证。

在整个通信过程中,采用PSK与ECC的区别主要体现在server_key_exchange报文段、client_key_exchange报文段的内容不同和双方计算得到预主秘钥方式的不同。

当采用PSK加密时,server_key_exchange报文段和client_key_exchange报文段的内容分别是服务器与客户机各自的psk_id和psk_id_length,由此双方可以互相知道对方的psk_id和psk_id_length。

之后,双方都会对收到的报文段进行检验,只有psk_id和psk_id_length与本地存储的完全一致才会进行后面的通信。

当双方都通过身份验证后,双方再各自用相同的函数产生预主秘钥,而函数的参数包括之前通信阶段中双方各自产生的32字节的随机数,由此可以保证虽然本地存储的psk秘钥不变,但每次临时通信时的会话秘钥还是会一直变化的,从而增强了抗攻击性。

双方产生预主秘钥后,再调用和使用ECC加密的相同方式来产生主秘钥,即用于之后会话通信的对称秘钥,该过程中依然会用到双方产生的32字节的随机数。

由此,通信双方使用PSK加密方式来实现了身份认证和会话秘钥的产生。

2.7 server_hello_done报文段和client_key_exchange报文段的内容

服务器发送的server_hello_done报文段的载荷部分为空,只是发给客户机来作为标志,表示服务器当前阶段的报文段已经发送完毕。

客户机在收到server_hello_done报文段后,发送client_key_exchange报文段给服务器,里面包含了用于秘钥协商的基点的x,y坐标,并且不同于server_key_exchange报文段,客户机并没有在报文段的末尾进行ECDSA数字签名。

2.8 客户机产生会话秘钥

之后,客户机再通过ecdh_pre_master_secret函数来产生用于之后会话的预主秘钥。其中函数的参数包括客户机自己的私钥,和服务器共享的用于ECDH秘钥协商算法的基点的x,y坐标。

产生预主秘钥后,再根据之前阶段客户机和服务器分别产生的32字节的随机数产生主秘钥master_secret,此时主秘钥为对称秘钥,用于之后会话的加解密。

2.9 change_cipher_spec报文段和finished报文段的内容

客户机计算出会话秘钥后,发送change_cipher_spec报文段给服务器,这个报文段的有效载荷为空,用来作为标志通知服务器,表示客户机已经算出主秘钥,之后发送的报文段会采用主秘钥加密。

握手阶段中客户机发送的最后一个报文段为finished报文段,载荷内容为MAC值(消息验证码),用于给服务器做认证。并且值得注意的是,finished报文段作为记录层的载荷部分在发送时已经用上一步产生的会话秘钥进行加密编码。

2.10 服务器产生会话秘钥

服务器在收到客户机发送过来的finished报文段后,也会和客户机用ECDH秘钥协商算法经过相同的流程,调用相同的函数先产生预主秘钥,再产生主秘钥。

2.11 握手阶段的结束

最后,服务器产生经会话秘钥加密后的finished报文段给客户机,标志整个握手阶段的结束。

客户机收到服务器发过来的finished报文段后,便可发送应用数据。并且应用数据会一直用会话秘钥加密,从而实现了UDP所不具备的安全性。

java dtls server_DTLS协议中client/server的认证过程和密钥协商过程相关推荐

  1. java dtls server_DTLS协议(基于UDP)中client/server的认证过程和密钥协商过程

    我的总结:DTLS的握手就是协商出一个对称加密的秘钥(每个客户端的秘钥都会不一样),之后的通信就要这个秘钥进行加密通信.协商的过程要么使用非对称加密算法进行签名校验身份,要么通过客户端和服务器各自存对 ...

  2. TLS协议中的握手协议

    TLS 握手协议(handshake protocol) 握手是TLS协议中最精密复杂的部分.在这个过程中,通信双方协商连接参数(沟通双方各有什么加密算法,选择一个最合适的算法),并且完成身份验证.根 ...

  3. C语言KDF密钥源代码,区块链中的数学-SM2算法与KDF密钥导出函数

    本节讲了SM2算法的KDF函数,从一般用途到SM2特定实现 ## 写在前面 上一节说了[sm2概述和加密过程](https://learnblockchain.cn/article/1516)实现, ...

  4. H264视频传输、编解码----RTP协议对H264数据帧拆包、打包、解包过程

    H264帧需要通过RTP协议进行传输,这其中就涉及到H264数据帧的封包.拆包和解包等过程. RTP协议格式 下面是 RFC 3550 中规定的 RTP 头的结构: 0 1 2 3 40 1 2 3 ...

  5. java使用ecdh密钥协商

    项目中刚好用到了ecdh进行密钥协商. java系列的文章比较少.记录下 首先密钥协商的大致过程: 双方A,B都使用EC算法(椭圆曲线算法)生成对应的公私钥.即A_PUB,A_PRI,B_PUB,B_ ...

  6. java中的multipart_基于JAVA中Jersey处理Http协议中的Multipart的详解

    那么Http协议中的Multipart是个什么东东?下面是摘抄http协议1.1的一段话: 在multipart entity(多部分实体)的例子中,一个或多个不同的数据集合并在一个单一的body(体 ...

  7. 用户自定义协议client/server代码示例

    用户自定义协议client/server代码示例 代码参考链接:https://github.com/sogou/workflow message.h message.cc server.cc cli ...

  8. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...

  9. Java Client/Server 上传文件到服务器与保存文件到本地

    新年第一章,祝大家新年快乐. ----------------------------------------------------------------------- 这个是我们的Java期末考 ...

最新文章

  1. python3.5怎么安装pip-python3.5.2安装pip管理工具
  2. 2018蓝桥杯B组:猴子分香蕉(C++/JAVA)
  3. 【转载】异步调用与多线程的区别
  4. Office 2016中修改正文默认字体
  5. R:首次尝试线性回归
  6. 别让生气毁了你的生活(深度好文)
  7. 低学历者已无法生存 程序员尤其明显
  8. 基于QT和Node.js的八叉树算法提取图片主题色
  9. 西门子PLC快速查找数据算法
  10. C语言中 以追加只写方式打开文本文件,C语言文件操作
  11. 大学计算机实验教程制作电子小报,word使用教程:制作电子小报
  12. win8.1 如何查看com端口号
  13. JAVA微信公众号开发之自动回复消息与图片
  14. 鹏程万里------HIM开发中遇到的问题
  15. 政务中台研究目的建设目标,建设意义,技术创新点,技术效果
  16. 微信订阅号无法使用网页授权解决方案
  17. 2018年蓝桥杯C/C++B组赛——调手表
  18. xcode中gdb调试命令
  19. OpenAI ChatGpt API参考
  20. 缩略词含义(实习记录)

热门文章

  1. python实现CRITIC方法
  2. 从零开始的企业级Java漏洞实战丨联合漏洞银行免费公开课
  3. 阿里云注册流程和实名认证方法(图文教程)
  4. SIP协议的NAT穿越技术
  5. request的基本用法
  6. JUnit4 与 JUnit 5 常用注解对比
  7. 2006-02-12星期日-有云 [99-06年家中手机变化]
  8. 22张图,带你入门分布式一致性算法Raft
  9. linux 头文件 位置
  10. win10文件浏览器多标签功能