QUIC协议(握手过程)简要介绍

QUIC协议(握手过程)简要介绍

这篇博客可能更多的偏向于密码学方面来进行介绍(csdn关于网络层)。

为什么需要QUIC协议

随着当前网络对性能要求的越来越高,有部分公司已经觉得原来的TCP和UDP协议的握手阶段太长。因此就致力于开发一些新的协议进行连接。于是Goole在2013年就提出了一种新的协议——QUIC协议。

网络层的QUIC

关于QUIC在网络层的介绍,csdn已经存在很多介绍了,这里就不再赘述,这篇博客我们主要从握手协议里用到的密码学技术来进行简要介绍。

密码学元件

Public Key Infrastructure(PKI)

简要来说就是找一个有公信力的第三方为公钥分配一个证书,主要作用就是证明某个公钥是属于某个人的。更详细的解释可以参照博客
https://blog.csdn.net/inthat/article/details/112955419?ops_request_misc=&request_id=&biz_id=102&utm_term=PKI&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-112955419.nonecase&spm=1018.2226.3001.4187

数字签名方案

一个数字签名方案包括三个函数 S S = ( K g , S i g n , V e r ) SS = (Kg, Sign, Ver) SS=(Kg,Sign,Ver),
其中Kg是密钥生成函数 ( p k , s k ) ← K g ( λ ) (pk, sk) \leftarrow Kg (\lambda) (pk,sk)Kg(λ),其中 λ \lambda λ表示安全参数,pk表示公钥, sk表示私钥。
Sign是签名函数: σ ← S i g n ( s k , m ) \sigma \leftarrow Sign(sk, m) σSign(sk,m), 其中sk表示用户的私钥,m是要签名的消息, σ \sigma σ是签名之后的结果。
Ver是验证函数, b ← V e r ( p k , m , σ ) b \leftarrow Ver(pk, m, \sigma) bVer(pk,m,σ).其中b是输出结果,为1或者0。1的话表示验证通过,0的话表示验证失败。

关联数据的认证加密方案AEAD

在介绍AEAD之前,先简要说一下(Authenticated Encryption)AE方案。
我们都知道,加密技术保证了机密性,消息认证码保证了完整性。然而,在很多情景下,我们既需要保证加密型,又需要保证完整性。因此就提出了认证加密方案(AE方案)。
其实我们还可能存在这样一种需求,就是我们并不是对所有的数据都需要保密性,但是我们又需要对所有数据的完整性进行校验。
比如说:在网络数据传输的时候,我们只需要加密我们传输的数据。但是我们知道网络传输的数据包不仅仅有数据,也有原IP,目的IP之类的额外信息。这些信息在路由的时候需要用到,因此就不能进行加密。这种需求就引出了AEAD,相关数据的认证加密技术。
AEAD是对其中一部分数据进行加密,但是对所有数据进行认证的一种技术。 A E A D = ( E , D ) AEAD = (E,D) AEAD=(E,D).
E是加密函数 c ← E ( k , I V , H , m ) c \leftarrow E(k, IV, H, m) cE(k,IV,H,m),其中k表示密钥, IV表示初始向量,一般是一个公开的随机数, H表示相关数据,即不需要加密的那一部分数据, m表示需要加密的消息。
D是解密函数 m ← D ( k , I V , H , c ) m \leftarrow D(k, IV, H, c) mD(k,IV,H,c)

离散对数问题

对于一个群,他具有生成元g,任意给出群中元素 g a g^a ga,敌手很难得到 a a a具体是多少。

Diffie-Hellman密钥交换算法

在QUIC中,一般使用diffie-hellman协议进行密钥交换,因此我们需要首先回顾一下diffie-hellman协议。
diffie-hellman协议利用了离散对数问题。
用户A随机选取一个随机数a,计算 y 1 = g a y_1 = g^a y1=ga, 并把 y 1 y_1 y1发送给用户B
用户B随机选取一个随机数b, 计算 y 2 = g b y_2 = g^b y2=gb, 并把 y 2 y_2 y2发送给用户A
然后用户A可以计算 k = y 2 a = g a b k = y_2^a = g^{ab} k=y2a=gab, 用户B可以计算 k = y 1 b = g a b k = y_1^b = g^{ab} k=y1b=gab

QUIC协议流程简介

QUIC协议一般认为有两方,一方是客户端(clint),另一方是是服务器端(server)。服务器会拥有自己的配置文件,并且配置文件会隔一段时间进行更新一次。配置文件更新过程如下:
QUIC服务器首先用签名方案中的密钥生成算法生成具体的公钥和私钥: ( p k , s k ) ← K g ( λ ) (pk, sk)\leftarrow Kg(\lambda) (pk,sk)Kg(λ), 生成 k s t k ← { 0 , 1 } 128 k_{stk} \leftarrow \{0, 1\}^{128} kstk{0,1}128, 其中的 p k pk pk就是服务器的公钥, s k sk sk k s t k k_{stk} kstk就是服务器的私钥。
然后服务器每隔一段时间就用下面的函数生成一个新的配置。
在这里插入图片描述
该函数输入包含私钥 s k sk sk, 时间段 τ t \tau_t τt(表示第几个时间段),以及安全参数 λ \lambda λ。需要注意的就是 x s x_s xs y s y_s ys就是diffie-hellman密钥交换协议中的 x x x g x g^x gx,然后把群生成元g,群的阶q,以及群中的任意一个元素 y s y_s ys放在一起记作 p u b s pub_s pubs, y的离散对数 x s x_s xs记作 s e c s sec_s secs。需要注意的是scid是把 p u b s pub_s pubs和时间日期 e x p y expy expy一起进行hash,得到scid。其中scid的作用就是把对应的公共配置和对应的时间有效期结合到一起。后面prof就是对 s c i d scid scid, p u b s pub_s pubs, 和 e x p y expy expy 进行签名。 其中公开的配置文件就是 s c i d , p u b s , e x p y scid, pub_s, expy scid,pubs,expy作为公开配置。所有配置就是公开配置加上签名prof和私钥 x s x_s xs.

具体的协议步骤如下:
在这里插入图片描述
该协议主要包括四个步骤。
第一个阶段进行了初始密钥协商,这个阶段就是客户端和服务器协商一个初始的密钥。
第二个阶段就是使用协商的密钥对交换的数据进行加密通讯。
第三个阶段进行新的密钥协商,生成新的临时密钥。
第四个阶段使用新的临时密钥对数据进行加密通讯。

下面我们详细了解一下这1RTT这四个阶段:

初始密钥协商
  1. 初始阶段客户端向服务器发送一个数据包m1,其中包括源IP,目的IP,源端口,目的端口,以及连接号(一个随机数,用来标识这次连接),和一个数字1(表示发送的第一个数据包)
  2. 服务器向客户端返回一个数据包,其中包括客户端发来的数据包m1,以及服务器公共配置文件 s c f g p u b t scfg_{pub}^t scfgpubt(公共配置中包含服务器的DH密钥), 对公共配置的签名, 以及一个令牌(该令牌的作用是在0RTT过程中,客户端可以直接发送令牌来进行连接,从而省去一次握手)。
  3. 客户端发送给服务器新的自己的DH密钥给服务器。这样双方就可以利用Diffie-hellman协议协商出来一个新的密钥。然后双方就可以利用这个新的密钥进而生成 k c k_c kc, k s k_s ks
初始数据交换

客户端和服务器分别使用对应的密钥加密和解密发送的消息

临时密钥协商
  1. 服务器生成新的临时的服务器配置。然后用协商好的初始密钥进行加密,发送给客户端。然后服务器和客户端就可以计算一个新的临时会话密钥。
数据交换

服务器和客户端使用新的临时密钥进行加密通讯。

接下来可以考虑一下为什么需要协商两次密钥,只使用第一次协商的密钥进行加密不就可以了吗?
不可以只进行一次密钥协商
原因:如果只协商一次密钥,敌手如果获得了服务器配置私钥 x s x_s xs, 这样的话敌手就可以获得对应的密钥,这样显然密码协议就不再安全了。
我们可以发现进行第二次密钥协商的时候,服务器选择了新的配置文件,这样的话就会进一步更改密钥,敌手就无法获得临时密钥。

上述流程中具体函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

0RTT:
在初始密钥协商的时候,客户端可以直接发送c_hello()给服务器。这样就可以直接生成临时会话密钥。然后后续步骤就和1RTT相同了。
在这里插入图片描述

QUIC协议存在的一些攻击

重放攻击:

  1. 服务器配置重放攻击:
    如果客户端向服务器发送连接请求的时候,攻击者截取了这个连接的请求。并返回服务器的公共配置给客户端。这个时候服务器是不知道客户端发送了连接请求的。因此这个时候如果客户端尝试给客户端进行交流的时候,服务器将无法辨别出客户端,因此就会拒绝他的数据包。
  2. 源地址token重放攻击:
    攻击者可以多次重放客户端的源地址token s t k stk stk代表客户端进行多次请求建立连接。这种行为会导致客户端建立初始密钥和最终的的会话密钥。这样的话敌手就通过建立多次握手行为完成Dos攻击,从而阻止服务器进行其他操作。
    包处理攻击:
    连接ID操作攻击:在这个攻击中,攻击者位于客户端和服务器中间,进行一个中间人攻击。更改客户端和服务器看到的cid,也就是连接号。使得客户端和服务器看到的连接号不同。这样操作并不会影响连接的建立。但是由于连接号是生成密钥函数的输入。因此,如果客户端和服务器生成的密钥就会不同,这样就会导致他们无法完成正常的信息交流。
    源地址token操作攻击:这个攻击中,攻击者仍然要位于客户端和服务器中间,敌手更改stk,使得客户端和服务器看到不同的 s t k stk stk值。然后攻击者就作为中间人进行一系列的操作,使得连接正常的建立。但是当客户端和服务器发送数据包的时候,客户端仍然无法正确的解密。因为stk也是密钥生成的一部分。
  3. 其他类型的攻击
    加密流偏移攻击:由于握手消息是QUIC逻辑流的一部分。因此,如果反转字节流数据,攻击者就能够破坏字节流,从而导致连接的建立失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值