在IPsec VPN中,如何对预共享密钥进行加密?


11

我在ASA 8.0上进行了IPsec VPN,对此我了解一些。发起方首先将其ISAKMP策略发送给响应方,然后响应方发回匹配的策略。此后,Diffie-Hellman密钥进行交换,然后将两者都将预共享的密钥发送给另一个进行身份验证。

现在我们有两个键:

  • 一个将通过AES加密生成
  • 一个将由Diffie-Hellman组生成

哪个密钥用于加密预共享密钥?

Answers:


16

你问了一个好问题。这个问题看似很简单,但实际上答案却有些复杂。我会尽力简洁地回答。另外,由于您提到了ISAKMP,因此我假设您对IKEv1感兴趣。IKEv2发生了一些变化(嗯,很多),但是我确实想提一下下面的答案仅与IKEv1相关。

阶段1可以通过两种不同的模式来完成:主模式和积极模式。在任何一种模式下,第一条消息都是由发起方发送的,第二条消息是由响应方发送的。这两个消息都包括在密码学界称为Nonce的消息。随机数只是用于密钥生成的随机生成的数字。 (术语Nonce来自使用_Once_的_N_umber)。因此,在消息1和消息2之后,双方都知道彼此的随机数。

Nonce与Pre-Shared-Key组合在一起以创建用于生成密钥的Seed值。IKE RFC的相对部分在这里:

 For pre-shared keys:       SKEYID = prf(pre-shared-key, Ni_b | Nr_b)

SKEYID是种子值,以后将用于生成其他秘密密钥。通过使用PRF或伪随机函数将预共享密钥和两个Nonce值(Ni_b是发起方的Nonce,Nr_B是响应方的Nonce)组合在一起。PRF类似于哈希算法,不同之处在于结果可以是所需的任意多的位。

现在,如果您最初是在进入主模式,则消息3和消息4分别共享发起者和响应者的Diffie-Hellman公钥。他们都使用这些值来生成Diffie-Hellman 共享密钥。如果您正在使用积极模式,则这些DH Public值也将包含在消息1和消息2中(以及随机数)。

然后,将Seed值与DH共享机密(以及其他一些值)组合在一起,以创建三个会话密钥:Derevative密钥,Authentication密钥和Encryption密钥。RFC声明如下:

主模式或积极模式的结果是三组经过身份验证的密钥材料:

 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)

SKEYID_d,_a和_e是上面提到的三个会话密钥。 SKEYID是种子值。 g^xy是DH共享秘密。CKY-I并且CKI-R是发起方和响应方Cookie,它们只是其他随机生成的值,这些值稍后将用于标识此特定的ISAKMP交换和安全关联。 0 1 2分别是文字数字0、1和2。“管道”符号|表示串联。

无论如何,所有这些值都使用创建三个会话密钥的PRF组合在一起:

  • 派生密钥 -ISAKMP 使用此密钥,而是将其交给IPsec,以便IPsec可以创建自己的秘密密钥
  • 身份验证密钥 -ISAKMP在其HMAC中使用此密钥(又名,由密钥保护的哈希算法)
  • 加密密钥 -ISAKMP使用此密钥对ISAKMP想要安全地加密的任何事物对称地加密到其他对等方。因此,如果为阶段1选择的加密算法是AES,则AES将使用此密钥对称地加密数据-AES不会生成自己的密钥材料。

身份验证密钥和加密密钥用于保护/加密随后的阶段2协商。在主模式下,阶段1的消息5和消息6也受这些键保护。此外,任何将来的ISAKMP信息交换(DPD,密钥更新事件,删除消息等)也受这两个密钥保护。

派生密钥已交给IPsec,并且IPsec从此密钥生成自己的密钥材料。如果您还记得,IPsec天生就没有包含密钥交换机制,因此它获取私钥的唯一方法是手动设置它们(这是过时的,现在再也没有做过),或者依赖于外部服务来设置。提供密钥材料,例如ISAKMP。

RFC这样说:

SKEYID_e是ISAKMP SA用于保护其消息的机密性的密钥材料。

SKEYID_a是ISAKMP SA用于验证其消息的密钥材料。

SKEYID_d是用于为非ISAKMP安全关联派生密钥的密钥资料。

综上所述,我们可以回头再提您的问题:使用什么密钥来保护预共享密钥?

在主模式下,消息5和消息6中验证了预共享密钥(PSK)。消息5和6受ISAKMP生成的会话密钥保护,如上所述。

在积极模式下,协商中的所有消息均未加密。并且在消息2和消息3中对PSK进行了验证。注意,在这两种情况下,我都说PSK已验证,而我从未说过已交换 PSK 。显然,如果没有加密积极模式下的任何内容,而您只是未经加密地通过网络发送了预共享密钥,则将存在巨大的安全漏洞。

对我们来说幸运的是,ISAKMP的作者已经想到了这一点。结果,他们创建了一种特殊的方法来验证每一方是否具有正确的PSK,而无需实际在线共享。有两个项目可用于向每个对等方验证它们是否都具有相同的PSK:身份方法身份哈希

VPN对等方可以选择通过多种方法来标识自己。通常,对等方将仅使用其源IP地址。但是他们可以选择使用FQDN或主机名。这些中的每一个,以及所选方法的相关值,都构成了身份方法。因此,例如,如果我拥有IP 5.5.5.5,并且我想使用自己的IP地址来标识自己,那么我的ID方法实际上就是[IP Address,5.5.5.5](注意:这两个值构成了整个ID方法)

然后将ID方法(使用PRF)与我们之前讨论的Seed值(SKEYID)以及其他一些值结合起来,以创建Identity Hash。回想一下,最初创建SKEYID的是Pre-Shared-Key。

然后通过电线发送ID方法和ID哈希,另一方尝试使用相同的公式重新创建ID哈希。如果接收方能够重新创建相同的ID哈希,则向接收方证明发送方必须具有正确的预共享密钥。

这在RFC中进行了描述:

为了验证任一交换,协议的发起者生成HASH_I,响应者生成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 )

IDii和IDir是ID方法。HASH_I和HASH_R是发起方和响应方哈希值。这两个都是在阶段1中共享的。从RFC:

在进行预共享密钥身份验证时,主模式定义如下:

         Initiator                        Responder
        ----------                       -----------
         HDR, SA             -->
                             <--    HDR, SA
         HDR, KE, Ni         -->
                             <--    HDR, KE, Nr
         HDR*, IDii, HASH_I  -->
                             <--    HDR*, IDir, HASH_R

带有预共享密钥的积极模式描述如下:

       Initiator                        Responder
      -----------                      -----------
       HDR, SA, KE, Ni, IDii -->
                             <--    HDR, SA, KE, Nr, IDir, HASH_R
       HDR, HASH_I           -->

现在,我们终于可以完全回答您的问题:

使用带有随机数的PRF和在协商中其他任何人都知道的其他值组合来组合预共享密钥。结果是,只有当双方以相同的值(也就是相同的预共享密钥)开始时,双方才能相互获得一个值。结果值是在线上共享的值,允许双方验证它们是否具有匹配的预共享密钥,而无需实际公开有关预共享密钥本身的任何信息。

通过对上述“结果值”的交换进行加密,“主模式”更安全了一步,这使得提取有关“预共享密钥”的任何有用信息变得更加困难。


(看来我很遗憾未能简洁回答)


最后一件事。aes加密如何不生成任何密钥,我正在学习ccnp vpn书籍,并且这本书中写有对称密钥算法生成并使用单个密钥的敌人加密,对称密钥算法的示例是aes,des
user3347934 2014年

如果AES随机生成密钥,则仍然存在通过网络安全地将该密钥传递给另一方的问题。这就是为什么您需要某种密钥交换方法的原因。AES本身不是密钥交换算法,它只是对称加密算法。通常,AES使用其他协议(例如ISAKMP)提供给它的密钥。至于AES的工作方式,我最喜欢这个Flash动画来解释它。PS:如果我的回答回答了您的问题,请将其标记为已接受的答案。
艾迪

非常感谢,它确实帮助我了解了vpn如何与预共享密钥真正一起工作
user3347934 2014年

我有一个问题,也请看一看这也networkengineering.stackexchange.com/questions/13484/...
user3347934

实际上,我并没有理解要使用什么密钥来创建区分密钥共享密钥
user3347934 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.