【网络安全技术】IPsec——IKE (Internet Key Exchange)

一、IKE简介

IKE是要建立一个Security Association (SA)用于IPsec,也就是传后面的AH、ESP包。

IKE使用了一种很独特的设计,他先建立第一个ISAKMP SA安全通道,这是阶段一,然后阶段二在这个已经建立的安全通道下,协商用于IPsec的SA。这种设计理念我目前还不能完全理解。

网上找的这个图很形象

第一个SA里面包含了一系列的参数,例如认证算法、加密算法、密钥等等。用来保护IKE本身的通信。

二、IKE过程

下面看看过程

1.Phase 1

主要分为三个步骤,1协商SA,2交换密钥,3认证

分两种模式,主模式和激进模式,主模式每个步骤双方各发一条消息,共6条消息,激进模式有将信息合并,一共三条消息。

分四种认证方法

a.Authenticated With Signatures

b.Authenticated With Public Key Encryption

c.Authenticated With a Revised Mode of Public Key Encryption

d.Authenticated With a Pre-Shared Key

还有几个其他的模式不看了,用的时候再去查RFC2409

下面梳理下一阶段的过程

1.发送者发送一个协商请求,附上自己的SPI(Security Parameter Index),SPI是单向的,就类似于自己的安全通信策略数据库的一个索引,通过SPI来在自己的数据库里索引唯一的一组参数,认证算法、加密算法、密钥等等。

这个消息里还会有DOI(Domain of interpretation),这个字段指明了一个规则,表明接下里的参数协商使用什么样的规则。比如这个字段可能是1,代表是下面的参数协商使用IPsec的规则。

接下来他会一个或多个Transform Payload,每个Transform载荷是一组安全参数,发送过去供接收方选择。

这是一个例子,里面的参数有加密算法:AEC-CBC,密钥长度128位,哈希算法SHA,Group-Description指定了某一个DH组,里面有DH的两个参数,大素数和本原根,下一个是认证方式,预共享密钥,这个也可能是数字证书PKI,后面两个参数规定了这次协商出来的SA的时间。

2.接收方收到之后,会附上自己的SPI,选一个transform组,回回去。

3.这样参数都有了,三四步就可以开始交换密钥了。

这里看文档(RFC 2409),我理解的是,先用基本的DH来交换以获得一个共同秘密,这里并没有做认证,所以面临中间人攻击,但是他在后续做了认证。在获得这个共享秘密(g^xy)之后,用这个共享秘密和双方的其他认证信息来生辰一个密钥SKEYID,数字签名、公钥算法、提前分享的密钥三种认证方式生成密钥的方式不同,如下所示:

For signatures:            SKEYID = prf(Ni_b | Nr_b, g^xy)
For public key encryption: SKEYID = prf(hash(Ni_b | Nr_b), CKY-I | CKY-R)
For pre-shared keys:       SKEYID = prf(pre-shared-key, Ni_b | Nr_b)

有了这个SKEYID之后,在根据这个和共享秘密等在生成真正的三组加密不同信息的密钥:

SKEYID_d = prf(SKEYID, g^xy | CKY-I | CKY-R | 0)
SKEYID_a = prf(SKEYID, SKEYID_d | g^xy | CKY-I | CKY-R | 1)
SKEYID_e = prf(SKEYID, SKEYID_a | g^xy | CKY-I | CKY-R | 2)

这三组密钥用来加密不同的信息,e用来加密正常消息,a用来认证,d用来处理非ISAKMP的SA。

4.最后两条消息是双方验证身份,这里就是用刚才生成的密钥加密的通信了

这里看一个使用签名的例子,如果是要用签名来认证,那么一开始的两条就需要交换公钥,比如通过证书。

 Initiator                          Responder
 -----------                        -----------
 HDR, SA                     -->
                             <--    HDR, SA
 HDR, KE, Ni                 -->
                             <--    HDR, KE, Nr
 HDR*, IDii, [ CERT, ] SIG_I -->
                             <--    HDR*, IDir, [ CERT, ] SIG_R

前两条就是协商SA,第三四条交换密钥,KE就是要交换的DH公钥,两个N就是随机数,这两个随机数看上面有用于计算接下来的密钥。

最后两条认证,ID就是身份信息,CERT证书可选,SIG是用以下算出来的HASH,对他签名,这个hash的计算包含了双方的DH公私钥,以及刚用DH公共秘密算出来的SKEYID,以及双方的cookie,SAi是整个SA载荷的body,ID就是身份。他们分别会对这些做hash,然后用自己的私钥签名,然后发给对方。

  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 )

现在设想有个中间人,他可以劫持前两条消息,获得两边的cookie,然后劫持第三四条消息,使用典型的中间人攻击,自己生成两个公私钥对,分别用他们和A和B交换秘密,也自己生成两个随机数,发给a和b,以计算接下来的那一串SKEYID。算出来两对密钥,那他们分别在第五六条和A和B做认证。身份信息可以伪造,签名是用私钥签名的哈希,中间人没法生成这个,对面比如A拿到后,用B的公钥解不开,那就发现不对了,那么中间人攻击就失败了。

上面说的是主模式,还有一种是激进模式,还是看个例子,使用签名的激进模式。

        Initiator                          Responder
       -----------                        -----------
        HDR, SA, KE, Ni, IDii       -->
                                    <--    HDR, SA, KE, Nr, IDir,
                                                [ CERT, ] SIG_R
        HDR, [ CERT, ] SIG_I        -->

直接在前两条消息就把DH的密钥交换了,而且接收方在第二条也发送了认证消息,这样第三条发送方发的认证消息就是最后一条了。

这样,一阶段就结束了。

2.phase 2

二阶段就是要在刚才建立的SA里建一条用于接下来传真正的ip包的SA

        Initiator                        Responder
       -----------                      -----------
        HDR*, HASH(1), SA, Ni
          [, KE ] [, IDci, IDcr ] -->
                                  <--    HDR*, HASH(2), SA, Nr
                                               [, KE ] [, IDci, IDcr ]
        HDR*, HASH(3)             -->
   HASH(1) = prf(SKEYID_a, M-ID | SA | Ni [ | KE ] [ | IDci | IDcr )
   HASH(2) = prf(SKEYID_a, M-ID | Ni_b | SA | Nr [ | KE ] [ | IDci |
   IDcr )
   HASH(3) = prf(SKEYID_a, 0 | M-ID | Ni_b | Nr_b)

首先发起者要发协商消息,第一个hash就是用之前协商好的SKEYID_a,和(这条消息的头里的message id和包里剩下所有内容的连接),做的HMAC,然后SA就是发起者提出的很多Transform,一个Transform就是一套规则,Ni是随机数,剩下两个KE是可选的,可以再进行一次密钥协商,后面那个没看懂,也是可选的。

响应者同样会回一个选好SA的包,只有一个Transform,这个包很类似,hash2里面还包含了刚才发来的随机数。

最后,发起者收到之后,会回一个类似ACK的东西,里面就是哈希过的message id和两个随机数。

注意这些消息都是加密的,除了ISAKMP的头不加密,剩下的内容都是用刚才的SKEYID_e来加密的。所以这些协商都提供了完整性和机密性保护。

这个SA里协商了之后AH和ESP需要的信息。

相关推荐

  1. 计算机网络 网络安全技术

    2023-12-08 04:08:03       81 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 04:08:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 04:08:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 04:08:03       87 阅读
  4. Python语言-面向对象

    2023-12-08 04:08:03       96 阅读

热门阅读

  1. ❀My学习Linux命令小记录(15)❀

    2023-12-08 04:08:03       39 阅读
  2. 设计多级菜单的数据结构(C语言实现)

    2023-12-08 04:08:03       60 阅读
  3. 简述本人项目中常用的Typescript的知识

    2023-12-08 04:08:03       57 阅读
  4. 括号匹配的检验(数据结构实训)

    2023-12-08 04:08:03       52 阅读
  5. K8s基础

    K8s基础

    2023-12-08 04:08:03      56 阅读
  6. chatgpt用到哪些算法

    2023-12-08 04:08:03       54 阅读
  7. ElasticSearch之cat nodeattrs API

    2023-12-08 04:08:03       64 阅读
  8. 将linux服务器 设置成 proxy.SOCKS5 服务器

    2023-12-08 04:08:03       50 阅读
  9. 算法基础之n-皇后问题

    2023-12-08 04:08:03       70 阅读