主模式(预共享密钥身份认证)

主模式阶段一 (SA的协商)

HDR, SA             -->
              Ci  SAi
                                  <--    HDR, SA

                                           Ci Cr  SAr

HDR就是指协议的首部,其中SA就是通信双方协商的安全联盟,我比较喜欢叫它安全套件,因为SA就是多个安全内容的集合,Ci,Cr就是通信双方的Cookie值,或者说就是SPI值

主模式阶段二(三个密钥的产生)

 HDR, KE, Ni         -->
              Ci  Cr  K   Ni
                                  <--    HDR, KE, Nr
                                           Ci Cr  K  Nr

第二阶段双方交换KEY值以及随机数于是求出K值,Ni和Nr就是随机数,双方的K值相同,是DH算法通过双方交换的KE值计算出来的共享内容,KE是包含了用于Diffie-Hellman交换的公共信息的密钥交换负载

 SKEYID = prf(pre-shared-key, Ni|Nr) //共享密钥验证模式下,基准密钥的计算公式
 SKEYID_d = prf(SKEYID, K | Ci | Cr | 0) //推导密钥用于后续IPsec sa相关密钥的产生
 SKEYID_a = prf(SKEYID, SKEYID_d | K | Ci | Cr | 1) //用于快速模式相关数据完整性验证以及源的验证,所谓数据的验证就是对数据信息进行签名,然后根据签名来确定信息是否被篡改
 SKEYID_e = prf(SKEYID, SKEYID_a | K | Ci | Cr | 2)  //用于快速模式相关数据的加密

主模式阶段三(身份信息的确认)


HDR*, IDii, HASH_I  --> 
   Ci Cr  
                                  <--    HDR*, IDir, HASH_R

HRD*代表本次数据是经过加密的,IDii和IDir代表着发送方和接收方的身份标识,在主模式中需要使用对端的IP地址去找出相对应的预共享密钥,所以如果对端的IP地址是动态分配的,那么如果还是使用主模式将无法正常完成主模式的第二阶段,因为主模式的第二阶段是需要使用预共享密钥计算基准密钥,如果没有计算出基准密钥那么就无法进行主模式的第五第六个阶段,于是它们就无法交换对方的身份信息,这就使得双方无法确认对端是否是我们所希望的那个人。所以由此出现了野蛮模式,野蛮模式在第一次报文的交互的时候不仅发送了SA,DH的KEY以及随机数,还发送了身份标识,所以双方只要依靠身份标识就可以确认对方的身份,但是身份的标识的泄露也代表着相关信息的泄露。

 HASH_I =   prf(SKEYID ,K| Ci | Cr| SAi | IDi )
 HASH_R =  prf(
SKEYID , K| Ci | Cr | SAr | IDr )

上面HASH_I和HASH_R是对上面协商过的内容进行确认,同时也是身份确认的一种方式,可是明明根本没有出现任何身份信息为什么说进行身份验证?我们看上面的公式中出现了基准密钥SKEYID,它是由预共享密钥生成的,而对于哈希函数来说,一个比特的改动都会导致所有内容发生巨大的变动,于是上面出现的HASH值可以视作是身份信息的另一种表达方式

快速阶段

其中KE是用于DH算法,且是一个可选的内容,其主要用于PFS完美向前保密功能,在快速阶段进行新一轮的相关密钥的生成,将该阶段生成的密钥与上一轮完全断离了关系,使得加密更加安全。IDi2和IDr2是双方的感兴趣流。SA,Ni,KE,IDi2和IDr2最后会被主模式第二阶段计算出的 SKEYID_a密钥对其进行hash运算,然后将该hash值作为数字签名携带在该报文中,用于保证数据的完整性,接收方如果解密后进行hash计算后发现与携带的hash值不同则知道该报文出现了错误,上面的HASH(1)和HASH(2)就是这样的值。

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

分割线

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

主模式(数字签名认证)

使用数字签名就是利用非对称密钥的不可否认性,即如果使用你的公钥可以将内容解出,那么就说明该信息是你发出的。

主模式阶段一 (SA的协商)

HDR, SA             -->
              Ci  SAi
                                  <--    HDR, SA

                                           Ci Cr  SAr

HDR就是指协议的首部,其中SA就是通信双方协商的安全联盟,我比较喜欢叫它安全套件,因为SA就是多个安全内容的集合,Ci,Cr就是通信双方的Cookie值,或者说就是SPI值

数字签名认证下,主模式的第一阶段也还是一样的交互

主模式阶段二(三个密钥的产生)

 HDR, KE, Ni         -->
              Ci  Cr  K   Ni
                                  <--    HDR, KE, Nr
                                           Ci Cr  K  Nr

第二阶段双方交换KEY值以及随机数于是求出K值Ni和Nr就是随机数,双方的K值相同,是DH算法通过双方交换的KE值计算出来的共享内容,KE是包含了用于Diffie-Hellman交换的公共信息的密钥交换负载

 SKEYID = prf(Ni | Nr, K)  //数字签名密钥验证模式下,基准密钥的计算公式,这里是和预共享密钥不同的地方,它们生成基准密钥的公式不同
 SKEYID_d = prf(SKEYID, K | Ci | Cr | 0) //推导密钥用于后续IPsec sa相关密钥的产生
 SKEYID_a = prf(SKEYID, SKEYID_d | K | Ci | Cr | 1) //用于快速模式相关数据的验证,所谓数据的验证就是对数据信息进行签名,然后根据签名来确定信息是否被篡改
 SKEYID_e = prf(SKEYID, SKEYID_a | K | Ci | Cr | 2)  //用于快速模式相关数据的加密

主模式第三阶段(身份验证)

HDR*, IDii, [ CERT, ] SIG_I -->

                                           <-- HDR*, IDir, [ CERT, ] SIG_R

其中IDii就是相关身份标识,CERT就是用户发出的证书,SIG_i,SIG_R就是用户发出的签名信息。如果一开始对方不知道对端的证书,那么在报文中会携带证书信息,如果知道了就不携带了,签名信息的作用就是用于身份标识,如果其中一端认可了对端的证书,且对签名信息进行验证,如果认可的证书可以将签名信息进行还原,那么就说明IPsec的对端是正确的,如果不能就说明是错误的。

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

分割线

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

主模式(公钥认证)

主模式阶段一 (SA的协商)

HDR, SA             -->
              Ci  SAi
                                  <--    HDR, SA

                                           Ci Cr  SAr

HDR就是指协议的首部,其中SA就是通信双方协商的安全联盟,我比较喜欢叫它安全套件,因为SA就是多个安全内容的集合,Ci,Cr就是通信双方的Cookie值,或者说就是SPI值

公钥认证下,主模式的第一阶段也还是一样的交互

主模式阶段二(密钥的生成)

HDR,KE,[HASH(1)],<IDii_b>PublicKey_r,<Ni_b>PublicKey_r --->

                               <---- HDR,KE,[HASH(1)],<IDii_b>PublicKey_r,<Ni_b>PublicKey_r

Ni和Nr是随机数。KE是包含了用于Diffie-Hellman交换的公共信息的密钥交换负载。其中<IDii_b>PublicKey_r表示使用对端的公钥对IDii_b进行加密,<Ni_b>PublicKey_r表示使用对端的公钥对Ni_b进行加密,而HASH(1)是公钥的哈希值,因为可能回应方不知道使用哪个公钥进行回应,所以直接将公钥的哈希值告诉对端,对端使用相应的公钥进行加密即可,因为只要拿着正确公钥对应着的私钥的人才能将身份标识以及随机数进行解密,所以不用担心身份信息和相关密钥材料信息的泄露

 SKEYID = prf(  hash(Ni_b|Nr_b) , CKY-I | CKY-R )  //证书验证模式下,基准密钥的计算公式,其中CKY-I和CKY-R代表着双方的Cookie值
 SKEYID_d = prf(SKEYID, K | Ci | Cr | 0) //推导密钥用于后续IPsec sa相关密钥的产生
 SKEYID_a = prf(SKEYID, SKEYID_d | K | Ci | Cr | 1) //用于快速模式相关数据的验证,所谓数据的验证就是对数据信息进行签名,然后根据签名来确定信息是否被篡改
 SKEYID_e = prf(SKEYID, SKEYID_a | K | Ci | Cr | 2)  //用于快速模式相关数据的加密

主模式阶段三(身份信息的确认)

HRD,HASH_I*--->

                         <--- HRD,HASH_R*

HASH_I=prf( SKEYID,g^xi | g^xr | CKY-I | CKY-R | SAi_b | IDii_b  )

HASH_R=prf( SKEYID,g^xr | g^xi | CKY-R | CKY-I | SAi_b | IDir_b  )

其中g^xi和g^xr是DH算法中的计算参数,是利用三,四报文交互得到的随机数和KE值得到的内容。SAi_b就是IKE的SA,I Dii_b和IDir_b是双方的身份信息

因为SKEYID=SKEYID = prf(  hash(Ni_b|Nr_b) , CKY-I | CKY-R ) 

也就是说基准密钥是使用前面用公钥加密后的随机数生成的,在上述的HASH函数中,除了SKEYID和IDii_b和IDir_b之外的参数都是固定的,而IDii_b和IDir_b这两个参数以及互相交互的随机数是只有拥有正确私钥的人才能解密的,所以最终HASH值得计算从间接证明了对端得身份

野蛮模式认证协商

嫌弃麻烦就拍照就完事了

在书中一直强调IDii和IDir是一种身份信息,身份标识,但是我觉得这个翻译并不准确,应该这个IDii和IDir应该是一种发送给对端之后,对端就可以使用该信息去查找相对应用于身份识别的工具的信息,为什么这么说,因为我们看见无论是野蛮模式还是主模式,它们在最后一次报文交互的作用都是用于身份的识别,那么现在问题来了,如果说在野蛮模式中已经在一次发包的时候就将身份信息进行了发送,那么为何还需要发送HASH_I和HASH_R,尤其是公钥身份认证和预共享密钥身份认证的情况下,所以IDii和IDir的主要作用其实是方便对端查找用于验证身份的一个信息,在预共享密钥的主模式中,就是因为变化的动态IP无法让对端查询到相应的预共享密钥,所以才出现野蛮模式,野蛮模式在第一次报文交互中就向对方发送IDii或者IDir,使得对端可以明确的知道要用什么预共享密钥,或者什么公钥去进行验证对端的身份。

参考书籍:网络安全协议 原理、结构与应用 88-93页

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐