ISAKMP - 认证

         认证,指的是通过认证的过程来验证通信对方是否是它所期望的实体,而不是假冒者。

        

         举一个例子,公司派你独自一人去美国出差,糟糕的是你并不认识美国公司的任何一个同事。经过10多个小时的飞行,飞机终于降落在美国土地上。你刚下飞机,赫然看见有人举着牌子,上面写着你的名字。然后你过去打招呼,说我就是Bruce。对方很高兴的说,终于等到你了,咱们走吧。结果,你猜怎么着,对方是黑手党的……

 

         所以说,无论做什么事情,首先要弄明白对方的身份,尤其是跟对方素未谋面的时候。所有的认证协议都使用一个通用的模型:Alice首先发起认证过程,她给Bob或者可信的KDC发送一条消息。接下来,在各个方向上继续交换其他一些消息。当这些消息被发送出去以后,Trudy可能截获、修改或者重放这些消息以便欺骗Alice和Bob,或者纯粹捣乱他们的工作。

 

         然而,当协议完成的时候,Alice确认她是在跟Bob通话,而Bob也确认他是在跟Alice通话。而且,在绝大多数协议中,二者也将建立起一个秘密的会话密钥,以便接下来的会话过程。

 

         想要认证对方,双方应当有一些共享的秘密信息,而且这些信息只被参与通信的双方所了解。如果双方对于彼此一点了解也没有,显然是无法认证对方的。就好比你在美国下飞机了,如果你不知道接机人的身份信息,很容易就会被人欺骗。

 

         基于共享密钥的认证通常使用质询-回应协议。Alice首先选择一个随机数RA,然后发给Bob。Bob使用共享密钥对随机数做一系列变换,然后送回给Alice。Alice在本地对随机数做相同的变化,然后同Bob发来的结果进行比较,如果相同,说明对方是Bob。由于任何第三方不可能获取共享密钥,因而无法生成变换结果来欺骗Alice。

 

         但是,这种认证有一种致命的缺陷。在某种情况下,Trudy可以利用一种被称为反射攻击的技术使得协议失败。继续上面的例子,假如Trudy截获了Alice发给Bob的质询消息。然后重新开启一个会话,声称自己是Bob,并给Alice发送随机数RA,要求Alice证明自己的身份。于是Alice对RA进行变换,把结果发给Trudy。然后Trudy用这个结果来回应Alice最初的质询,于是成功的欺骗了Alice。

 

         由此可见,设计一个正确的认证协议要比表面上复杂的多。下面的4条一般性原则通常会有所帮助:

         1.      让发起者首先证明自己是谁,然后轮到应答方。

         2.      让发起方和应答方使用不同的密钥做证明。不过,这意味着要有两个共享密钥。

         3.      让发起方和应答方从不同的质询集合选择随机数。比如,发起方必须使用偶数,应答方必须使用奇数。

         4.      使协议可以抵抗这种牵扯到第二个并行会话的攻击。

 

         以上原则只要有一条违反了,则协议通常会被攻破。

 

         一个可行的认证协议是使用HMAC。在此协议中,通信双方都会生成一个随机数,然后将双方的随机数、双方的表示和共享的秘密密钥一起做HASH运算,得到的结果是一个HMAC。

 

         过程如下:

         1.      Alice随机选择一个RA,用明文发送给Bob。

         2.      Bob随机选择一个RB,并连同计算出的HMAC(RA,RB,A,B,Key-AB)一起发回给Alice作为质询。要求Alice用这个随机数证明自己。

         3.      Alice回应HMAC(RA,RB,Key-AB)。

 

         显然,Trudy无法伪造Bob的应答,因为它不知道Key-AB。

 

         ISAKMP对于它的认证和密钥交换模块有一些基本的安全需求,以防止DOS、重放/反射、中间人攻击和连接劫持攻击。

 

         DOS攻击:

         ISAKMP防范DOS攻击的主要方式是cookie。在ISAKMP交换中,最占用资源的部分便是DH交换,因为DH交换需要做大量的幂运算。如果一个攻击者在前两个消息之后,通过伪造的Ip不断的发送Key Exchange消息,便可能让对端陷入大量的幂运算,从而耗尽cpu资源。所以通过cookie将一个实体跟ip/port对绑定,并结合ISAKMP的状态机,可以抵御此类的攻击。

 

         重放/反射和连接劫持攻击:

         主要通过ISAKMP的状态机进行防范。

 

         中间人攻击:

         中间人攻击包括窃听、插入、删除和修改消息,或者将消息反射回发送方,或者重播一条旧的消息,或者重定向消息。ISAKMP阻挡了这些攻击,使之不能成功。

 

         ISAKMP的各个消息交换之间的关联可以阻挡消息插入。如果在两次交换间插入其他消息会导致交换失败。

 

         ISAKMP的状态机保证了当一条消息被删除时,不会导致安全关联的部分建立。也就是说,如果某一条期待的消息没来时,安全关联不会生效。同时,状态机会清空所有状态,回到空闲状态。

 

         状态机同样阻挡了反射消息,防止它造成破坏。

 

         对于每一个新建立的SA,ISAKMP要求有一个带时间变量信息的新的cookie,这样就可以防止重放旧的消息。

 

         ISAKMP的强认证机制保证了它不会与其他第三方建立SA。

 

         消息可能被重定向到一个不同的目的地址,或者被修改。但是这种变化可以被检测出来,从而防止与伪造的第三方建立起一个SA。

 

         ISAKMP文档定义了异常处理出现的地方,并且推荐向合适的一方通知异常。

 

         DH算法最大的一个缺陷在于,它无法防止中间人攻击。如下图所示:

                   Alice                                               MITM                                   Bob

                           (g,g^x)| -------------------------> |

                                                                              |(g, g^m) ---------------> |

                                                                              |  <------------------------| (g, g^y)

                                       | <----------------(g,g^m)|

        

         Alice想和Bob交换密钥。于是选择(p,g,x),并发送公开密钥g^x(modp)给Bob。但是中间人MITM拦截了此对话,并把自己伪装成Alice跟Bob通信。MITM向Bob发送自己的公开密钥g^m(mod p),从而跟Bob建立起了共享密钥g^my(mod p)。同时,它又冒充自己是Bob,跟Alice建立起共享密钥g^xm(mod p)。这样,当Alice向Bob发送消息时,消息首先到达MITM。MITM用g^xm(mod p)来解密,然后用g^my(mod p)来加密,从而成功的欺骗了Alice和Bob。

 

         中间人攻击之所以能够成功的关键在于,通信双方没有对对方进行认证,从而无法确定对方的真实身份。所以,防范中间人攻击就必须进行双向认证。在ISAKMP体系中,通信双方首先交换DH值,最后进行身份认证。一旦有中间人,认证必然失败。

        

         以数字签名认证为例,双方使用公钥签名(DSS或RSA)来验证对等体。公钥通常是通过证书获得的。在第三次和第四次消息交换中,发起方和应答放请求对方提供证书,同时向对方发送临时值(Ni和Nr)以及DH公开值。在第五和第六次消息交换中,相互交换了证书。虽然证书是可选的,但是这已经成为一种标准实现。创建数字签名的方法如下:

         SIGi= PrivateKeyi (Hashi)

         SIGr= PrivateKeyr (Hashr)

 

         在这里,使用相应的私钥对HASHi和HASHr进行了签名,得到消息摘要SIGi和SIGr。而签名是不可伪造的,所以中间人不可能替换Hashi和Hashr,因为替换之后,它无法产生正确的签名。而Hashi的生成使用了通信双方的共享密钥,所以现在有两个Hashi。一个是Alice和MITM直接的HashiA,一个是MITM和Bob之间的HashiB。

 

         现在,Alice要向Bob证明自己,于是它用自己的私钥对HashiA进行签名。MITM截获到此消息后,如果它不做任何处理,直接把消息交给Bob。Bob用Alice的公钥解密此签名,最后会发现HashiA和HashiB的不一致,从而认证失败。

 

         MITM为了继续欺骗,于是决定修改此消息。它先解密此消息,然后将Alice的证书替换成自己的证书,并用自己的私钥对HashiB进行签名。这样,Bob就不会发现Hashi的不一致。但是,Bob在向CA验证证书的时候发现对方并不是Alice。

 

         如果使用Pre-SharedKey。Hashi和Hashr的生成会用到预共享密钥的信息。如果采用主模式,发起方会在第五个消息首先发送Hashi。而此时,它还没有获取应答方的IDir。因此,只能用ip地址来确定应答方的身份和选择预共享密钥。这种情况下,通常采用Aggressive模式。因为Aggressive模式的第一个消息中,发起方向应当方表明了自己的身份,然后应答方根据发起方的身份选择预共享密钥,并生成Hashr。第三个消息中,应当方用Hashi来证明自己。

 

         如果使用公开密钥加密来进行认证。由于双方都已经获取了对方的公开密钥,并对随机值和ID进行加密,所以可以保证中间人无法伪造随机值和ID。如果中间人存在,由于Alice和Bob持有的DH值不同,因而无法生成相同的HASHI,认证失败

你可能感兴趣的:(加密,算法,dos,解密,文档,Exchange)