DTLS-PSK算法抓包解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 一、DTLS -PSKPSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化、高效的优点;而目前 PSK方案应用也比较广泛。 关于DTLS协议可以看看前面的文章 DTLS要点解析本次通过模拟的DTLS程序,对DTLS-PSK 握手流程进行抓包分析,以期加深对协议本身的理解。

一、DTLS -PSK

PSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化、高效的优点;
而目前 PSK方案应用也比较广泛。 关于DTLS协议可以看看前面的文章 DTLS要点解析

本次通过模拟的DTLS程序,对DTLS-PSK 握手流程进行抓包分析,以期加深对协议本身的理解。

二、完整握手

流程

         Client                                               Server
         ------                                               ------
         1.ClientHello                 -------->

                                     <--------    2..HelloVerifyRequest
                                                   (contains cookie)

         3.ClientHello                  -------->
         (with cookie)
                                                         4.ServerHello
                                      <--------      5.ServerHelloDone
         6.ClientKeyExchange
         7.ChangeCipherSpec
         8.Finished                     -------->
                                                    9.ChangeCipherSpec
                                      <--------             10.Finished

         Application Data             <------->     Application Data

步骤解析

~1. Client 发送ClientHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: localhost/127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 0
Length: 82
Fragment:
    Handshake Protocol
    Type: CLIENT_HELLO (1)
    Peer: localhost/127.0.0.1:5684
    Message Sequence No: 0
    Fragment Offset: 0
    Fragment Length: 70
    Length: 70
        Version: 254, 253
        Random: 
            GMT Unix Time: Mon Jan 30 22:45:32 CST 2017
            Random Bytes: 4B 8B 3C CF 0F 62 57 99 94 E9 86 0A 46 68 BF 44 00 D1 34 45 FC 81 C3 AC BC 55 7E DB
        Session ID Length: 0
        Cookie Length: 0
        Cipher Suites Length: 4
        Cipher Suites (2 suites)
            Cipher Suite: TLS_PSK_WITH_AES_128_CCM_8
            Cipher Suite: TLS_PSK_WITH_AES_128_CBC_SHA256
        Compression Methods Length: 1
        Compression Methods (1 method)
            Compression Method: NULL
        Extensions Length: 24
            Extension: elliptic_curves (10)
                Length: 8
                Elliptic Curves Length: 6
                Elliptic Curves (3 curves):
                    Elliptic Curve: secp256r1 (23)
                    Elliptic Curve: secp384r1 (24)
                    Elliptic Curve: secp521r1 (25)
            Extension: ec_point_formats (11)
                Length: 2
                EC point formats length: 1
                Elliptic Curves Point Formats (1):
                    EC point format: uncompressed (0)
            Extension: server_certificate_type (20)
                Server certificate type: RAW_PUBLIC_KEY

===============================================================

此时没有携带Cookie,SessionID未生成;
Cipher Suites 携带了用于协商的算法集。

~2. Server 回复HelloVerifyRequest

    Handshake Protocol
    Type: HELLO_VERIFY_REQUEST (3)
    Peer: localhost/127.0.0.1:5684
    Message Sequence No: 0
    Fragment Offset: 0
    Fragment Length: 35
    Length: 35
        Server Version: 254, 253
        Cookie Length: 32
        Cookie: 77 25 7E 96 9E BD 39 42 94 5F 27 6C 8A 6D 9D D2 1A C9 A3 B8 62 1A 34 86 76 1D D7 AA F4 28 98 6D

Request中携带了32字节的Cookie。

~3. Client 再次发送ClientHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: localhost/127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 1
Length: 114
Fragment:
    Handshake Protocol
    Type: CLIENT_HELLO (1)
    Peer: localhost/127.0.0.1:5684
    Message Sequence No: 1
    Fragment Offset: 0
    Fragment Length: 102
    Length: 102
        Version: 254, 253
        Random: 
            GMT Unix Time: Mon Jan 30 22:45:32 CST 2017
            Random Bytes: 4B 8B 3C CF 0F 62 57 99 94 E9 86 0A 46 68 BF 44 00 D1 34 45 FC 81 C3 AC BC 55 7E DB
        Session ID Length: 0
        Cookie Length: 32
        Cookie: 77 25 7E 96 9E BD 39 42 94 5F 27 6C 8A 6D 9D D2 1A C9 A3 B8 62 1A 34 86 76 1D D7 AA F4 28 98 6D
        Cipher Suites Length: 4
        Cipher Suites (2 suites)
            Cipher Suite: TLS_PSK_WITH_AES_128_CCM_8
            Cipher Suite: TLS_PSK_WITH_AES_128_CBC_SHA256
        Compression Methods Length: 1
        Compression Methods (1 method)
            Compression Method: NULL
        Extensions Length: 24
            Extension: elliptic_curves (10)
                Length: 8
                Elliptic Curves Length: 6
                Elliptic Curves (3 curves):
                    Elliptic Curve: secp256r1 (23)
                    Elliptic Curve: secp384r1 (24)
                    Elliptic Curve: secp521r1 (25)
            Extension: ec_point_formats (11)
                Length: 2
                EC point formats length: 1
                Elliptic Curves Point Formats (1):
                    EC point format: uncompressed (0)
            Extension: server_certificate_type (20)
                Server certificate type: RAW_PUBLIC_KEY

===============================================================

本次携带了服务端返回的Cookie值。

~4. Server 回复ServerHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:64688
Version: 254, 253
Epoch: 0
Sequence Number: 1
Length: 82
Fragment:
    Handshake Protocol
    Type: SERVER_HELLO (2)
    Peer: /127.0.0.1:64688
    Message Sequence No: 1
    Fragment Offset: 0
    Fragment Length: 70
    Length: 70
        Server Version: 254, 253
        Random: 
            GMT Unix Time: Mon Jan 30 22:45:32 CST 2017
            Random Bytes: AB AB 69 55 C4 2E 1F B0 8D B7 FE 7F EA 36 E5 18 6A FD 4D C8 19 4C 73 63 D3 19 B5 E0
        Session ID Length: 32
        Session ID: 58 8F 51 8C 2A 2A B5 DC 14 9C AB D3 F2 EE BA 25 78 80 47 25 A7 93 35 34 00 D5 CD 53 2C EC B3 D4
        Cipher Suite: TLS_PSK_WITH_AES_128_CCM_8
        Compression Method: NULL
        Extensions Length: 0
===============================================================

此时生成了32字节的 SessionID;
CipherSute 指明了即将采用的密钥算法集;

~5. Server 回复ServerHelloDone

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:64688
Version: 254, 253
Epoch: 0
Sequence Number: 2
Length: 12
Fragment:
    Handshake Protocol
    Type: SERVER_HELLO_DONE (14)
    Peer: /127.0.0.1:64688
    Message Sequence No: 2
    Fragment Offset: 0
    Fragment Length: 0
    Length: 0

===============================================================

Server 通知ServerHello结束。

~6. Client 发送ClientKeyExchange

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: localhost/127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 2
Length: 23
Fragment:
    Handshake Protocol
    Type: CLIENT_KEY_EXCHANGE (16)
    Peer: localhost/127.0.0.1:5684
    Message Sequence No: 2
    Fragment Offset: 0
    Fragment Length: 11
    Length: 11
        PSK Identity: 012345678

===============================================================

PSK Identity 用于标识终端ID,后续双方根据该ID找到终端预置的PSK用于计算密钥;

~7. Client 发送ChangeCipherSpec

==[ DTLS Record ]==============================================
Content Type: Change Cipher Spec (20)
Peer address: localhost/127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 3
Length: 1
Fragment:
    Change Cipher Spec Message

===============================================================

Client 表示已经确认算法和密钥。

~8. Client 发送Finish

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: localhost/127.0.0.1:5684
Version: 254, 253
Epoch: 1
Sequence Number: 0
Length: 40
Fragment:
    Handshake Protocol
    Type: FINISHED (20)
    Peer: localhost/127.0.0.1:5684
    Message Sequence No: 3
    Fragment Offset: 0
    Fragment Length: 12
    Length: 12
        Verify Data: BC 00 D7 F6 6F E5 A4 B4 0D 8B 5C 8A

===============================================================

Client 表示握手完成,其中Verify Data是由动态密钥计算得出的摘要,用于Server端验证。

~9. Server 发送ChangeCipherSpec

==[ DTLS Record ]==============================================
Content Type: Change Cipher Spec (20)
Peer address: /127.0.0.1:64688
Version: 254, 253
Epoch: 0
Sequence Number: 3
Length: 1
Fragment:
    Change Cipher Spec Message

===============================================================

Server 表示已经确认算法和密钥。

~10. Server 发送Finish

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:64688
Version: 254, 253
Epoch: 1
Sequence Number: 0
Length: 40
Fragment:
    Handshake Protocol
    Type: FINISHED (20)
    Peer: /127.0.0.1:64688
    Message Sequence No: 3
    Fragment Offset: 0
    Fragment Length: 12
    Length: 12
        Verify Data: EC C9 5E 4E 24 BE 77 78 CB F5 20 54

===============================================================

Server 表示握手完成,其中Verify Data是由动态密钥计算得出的摘要,用于Client端验证。

至此,完整的PSK 握手流程已经结束,接下来执行会话恢复的场景。

三、会话恢复

流程

         Client                                               Server
         ------                                               ------
         1.ClientHello                 -------->

                                       <--------    2..HelloVerifyRequest
                                                     (contains cookie)

         3.ClientHello                 -------->
         (with cookie)
                                                         4.ServerHello
                                                         5.ChangeCipherSpec
                                       <--------         6.Finished

         7.ChangeCipherSpec
         8.Finished                    -------->

         Application Data              <------->     Application Data

步骤解析

~1. Client 发送ClientHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 0
Length: 115
Fragment:
    Handshake Protocol
    Type: CLIENT_HELLO (1)
    Peer: /127.0.0.1:5684
    Message Sequence No: 0
    Fragment Offset: 0
    Fragment Length: 103
    Length: 103
        Version: 254, 253
        Random: 
            GMT Unix Time: Tue Jan 31 00:02:05 CST 2017
            Random Bytes: B6 28 F7 76 FE C1 B9 7A 87 CE D9 81 2D C3 9A AA 07 F8 69 2D 36 A3 B3 A2 1F 47 E1 FF
        Session ID Length: 32
        Session ID: 58 8F 63 71 DE B4 87 9A C0 0B 67 BB 16 7F 33 1C B6 FF E2 74 74 D9 EB 58 D4 78 44 BA 4C 22 42 38
        Cookie Length: 0
        Cipher Suites Length: 4
        Cipher Suites (2 suites)
            Cipher Suite: TLS_NULL_WITH_NULL_NULL
            Cipher Suite: TLS_PSK_WITH_AES_128_CCM_8
        Compression Methods Length: 2
        Compression Methods (2 method)
            Compression Method: NULL
            Compression Method: NULL
        Extensions Length: 24
            Extension: elliptic_curves (10)
                Length: 8
                Elliptic Curves Length: 6
                Elliptic Curves (3 curves):
                    Elliptic Curve: secp256r1 (23)
                    Elliptic Curve: secp384r1 (24)
                    Elliptic Curve: secp521r1 (25)
            Extension: ec_point_formats (11)
                Length: 2
                EC point formats length: 1
                Elliptic Curves Point Formats (1):
                    EC point format: uncompressed (0)
            Extension: server_certificate_type (20)
                Server certificate type: RAW_PUBLIC_KEY

===============================================================

此时SessionID已经存在,但Cookie为空,仍然需要经过一次HelloVerify。

~2.Server 发送HelloVerifyRequest

    Handshake Protocol
    Type: HELLO_VERIFY_REQUEST (3)
    Peer: /127.0.0.1:5684
    Message Sequence No: 0
    Fragment Offset: 0
    Fragment Length: 35
    Length: 35
        Server Version: 254, 253
        Cookie Length: 32
        Cookie: 67 6B 86 62 06 F6 A4 3D 31 59 B1 82 80 39 23 76 C6 2C E2 FC E1 7F 41 E8 EE 13 6C 12 A6 76 7B C5

Server 发送了32字节的Cookie值

~3. Client 再次发送ClientHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 1
Length: 147
Fragment:
    Handshake Protocol
    Type: CLIENT_HELLO (1)
    Peer: /127.0.0.1:5684
    Message Sequence No: 1
    Fragment Offset: 0
    Fragment Length: 135
    Length: 135
        Version: 254, 253
        Random: 
            GMT Unix Time: Tue Jan 31 00:02:05 CST 2017
            Random Bytes: B6 28 F7 76 FE C1 B9 7A 87 CE D9 81 2D C3 9A AA 07 F8 69 2D 36 A3 B3 A2 1F 47 E1 FF
        Session ID Length: 32
        Session ID: 58 8F 63 71 DE B4 87 9A C0 0B 67 BB 16 7F 33 1C B6 FF E2 74 74 D9 EB 58 D4 78 44 BA 4C 22 42 38
        Cookie Length: 32
        Cookie: 67 6B 86 62 06 F6 A4 3D 31 59 B1 82 80 39 23 76 C6 2C E2 FC E1 7F 41 E8 EE 13 6C 12 A6 76 7B C5
        Cipher Suites Length: 4
        Cipher Suites (2 suites)
            Cipher Suite: TLS_NULL_WITH_NULL_NULL
            Cipher Suite: TLS_PSK_WITH_AES_128_CCM_8
        Compression Methods Length: 2
        Compression Methods (2 method)
            Compression Method: NULL
            Compression Method: NULL
        Extensions Length: 24
            Extension: elliptic_curves (10)
                Length: 8
                Elliptic Curves Length: 6
                Elliptic Curves (3 curves):
                    Elliptic Curve: secp256r1 (23)
                    Elliptic Curve: secp384r1 (24)
                    Elliptic Curve: secp521r1 (25)
            Extension: ec_point_formats (11)
                Length: 2
                EC point formats length: 1
                Elliptic Curves Point Formats (1):
                    EC point format: uncompressed (0)
            Extension: server_certificate_type (20)
                Server certificate type: RAW_PUBLIC_KEY

===============================================================

此时Cookie和SessionID都不为空。

~4. Server 发送ServerHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:54595
Version: 254, 253
Epoch: 0
Sequence Number: 1
Length: 82
Fragment:
    Handshake Protocol
    Type: SERVER_HELLO (2)
    Peer: /127.0.0.1:54595
    Message Sequence No: 1
    Fragment Offset: 0
    Fragment Length: 70
    Length: 70
        Server Version: 254, 253
        Random: 
            GMT Unix Time: Tue Jan 31 00:02:05 CST 2017
            Random Bytes: 6B 21 0D B0 A3 33 A3 49 65 0E D9 D1 DB 0E 62 74 51 EE 1B E1 CC 37 1E FD 8C 67 39 00
        Session ID Length: 32
        Session ID: 58 8F 63 71 DE B4 87 9A C0 0B 67 BB 16 7F 33 1C B6 FF E2 74 74 D9 EB 58 D4 78 44 BA 4C 22 42 38
        Cipher Suite: TLS_PSK_WITH_AES_128_CCM_8
        Compression Method: NULL
===============================================================

~5. Server 发送ChangeCipherSpec

==[ DTLS Record ]==============================================
Content Type: Change Cipher Spec (20)
Peer address: /127.0.0.1:54595
Version: 254, 253
Epoch: 0
Sequence Number: 2
Length: 1
Fragment:
    Change Cipher Spec Message

===============================================================

Server 表示已经确认算法和密钥。

~6. Server 发送Finish

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:54595
Version: 254, 253
Epoch: 1
Sequence Number: 0
Length: 40
Fragment:
    Handshake Protocol
    Type: FINISHED (20)
    Peer: /127.0.0.1:54595
    Message Sequence No: 2
    Fragment Offset: 0
    Fragment Length: 12
    Length: 12
        Verify Data: D7 8F CA EC 97 B7 96 A3 CD 5E 5C 97

===============================================================

Server 表示握手完成,其中VerifyData 用于Client端验证。

~7. Client 发送ChangeCipherSpec

==[ DTLS Record ]==============================================
Content Type: Change Cipher Spec (20)
Peer address: /127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 2
Length: 1
Fragment:
    Change Cipher Spec Message

===============================================================

Client 表示已经确认算法和密钥。

~8. Client 发送Finish

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: /127.0.0.1:5684
Version: 254, 253
Epoch: 1
Sequence Number: 0
Length: 40
Fragment:
    Handshake Protocol
    Type: FINISHED (20)
    Peer: /127.0.0.1:5684
    Message Sequence No: 2
    Fragment Offset: 0
    Fragment Length: 12
    Length: 12
        Verify Data: 3F 86 FC 45 D8 41 A6 BE BD 54 C2 7A

===============================================================

Client 表示握手完成,其中VerifyData 用于Server端验证。

至此,会话恢复(Resuming)流程分析完毕。

四、相关参考

Scadium 是一个纯Java语言的DTLS实现,可支持DTLS 1.2版本。
目前其被纳入 Californium项目(Coap技术框架),项目地址为:
https://github.com/eclipse/californium/tree/master/scandium-core

关于DTLS的技术纪要:
http://www.cnblogs.com/littleatp/p/6358261.html

TLS_PSK 标准定义:
https://tools.ietf.org/html/rfc4279

img_9b09a36f6de95886f52ce82fa1e89c88.jpe

作者: zale

出处: http://www.cnblogs.com/littleatp/, 如果喜欢我的文章,请关注我的公众号

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接  如有问题, 可留言咨询.

目录
相关文章
|
27天前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
http数据包抓包解析
http数据包抓包解析
|
7天前
|
算法 调度
操作系统的心脏:深入解析进程调度算法
本文旨在深入探讨现代操作系统中的核心功能之一——进程调度。进程调度算法是操作系统用于分配CPU时间片给各个进程的机制,以确保系统资源的高效利用和公平分配。本文将详细介绍几种主要的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及优先级调度(PS)。我们将分析每种算法的基本原理、优缺点及其适用场景。同时,本文还将讨论多级反馈队列(MFQ)调度算法,并探讨这些算法在实际应用中的表现及未来发展趋势。通过深入解析这些内容,希望能够为读者提供对操作系统进程调度机制的全面理解。
|
17天前
|
网络协议 网络虚拟化
接收网络包的过程——从硬件网卡解析到IP
【9月更文挑战第18天】这段内容详细描述了网络包接收过程中机制。当网络包触发中断后,内核处理完这批网络包,会进入主动轮询模式,持续处理后续到来的包,直至处理间隙返回其他任务,从而减少中断次数,提高处理效率。此机制涉及网卡驱动初始化时注册轮询函数,通过软中断触发后续处理,并逐步深入内核网络协议栈,最终到达TCP层。整个接收流程分为多个层次,包括DMA技术存入Ring Buffer、中断通知CPU、软中断处理、以及进入内核网络协议栈等多个步骤。
|
1月前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
165 1
|
2月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
131 1
|
2月前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
82 1
|
2月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
53 1
|
2月前
|
XML 存储 JavaScript
xml介绍与解析,及xml库包使用
xml介绍与解析,及xml库包使用
26 0
|
2月前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
41 0

推荐镜像

更多
下一篇
无影云桌面