鉴于以下内容摘录(从tylerl的答案中):
我拿出两个素数g和p告诉你它们是什么。
然后选择一个秘密数(a),但您不告诉任何人。相反,您可以计算ga mod p并将结果发送回给我。 (我们将其称为A,因为它来自a)。
我做同样的事情,但是我们将我的机密数字b和计算出的数字称为B。所以我计算gb mod p并将结果发送给您(称为“ B”)
现在,您使用我发送给您的电话号码,并对其进行完全相同的操作。这就是Ba mod p。
我对您发送给我的结果执行相同的操作,因此:Ab mod p。
以下是Alpha控制网络的5个步骤:
您尝试将
g
和p
发送给我,但Alpha拦截并了解了g
和p
您想出了
a
并尝试向我发送了结果ga mod p
(A
),但是Alpha截获并学习A
Alpha提出了
b
,并向您发送了gb mod p
(B
)的结果。您运行
Ba mod p
Alpha在整个过程中运行
Ab mod p
Alpha假装自己,并使用相同的方法与我创建共享的机密。
现在,您和Alpha和Alpha和我每个人都有成对的共享机密。
您现在认为秘密地与我交谈是安全的,因为当您向我发送用您的机密加密的消息时,Alpha会使用您创建的机密对它们进行解密和Alpha,令人着迷使用Alpha和我创建的机密向他们发送消息,然后将其发送给我。当我回复您时,Alpha会做相反的事情。
我在这里错过了什么吗?
#1 楼
Diffie-Hellman是一个密钥交换协议,但与身份验证无关。有一种高层的,概念性的方式可以看到这一点。在计算机网络和加密世界中,您所看到的实际上是零和一并通过某些线路发送的。实体只能通过零和可以发送或不发送的零来区分。因此,用户“鲍勃”实际上仅由其计算非鲍勃无法计算的事物的能力来定义。由于每个人都可以购买同一台计算机,因此Bob只能通过Bob知道Bob知道的一些价值才能成为Bob。
在您提出的原始Diffie-Hellman交易所中,您与某个实体进行了交谈。应该即时生成一个随机秘密值并使用它。每个人都可以做这样的随机生成。协议中没有任何地方只有特定的Bob可以做的任何操作。因此,该协议无法实现任何形式的身份验证-您不知道与谁交谈。如果不进行身份验证,则模拟是可行的,并且包括同时双重模拟(通常称为中间人)。最好的情况是,原始的Diffie-Hellman提供了一个较弱的功能:尽管您不知道与谁交谈,但您仍然知道您在整个会话中都与同一个实体交谈。
单一的加密算法不会帮助您。任何重要的通信协议都将组装几种算法,从而实现一定的安全性。一个典型的例子是SSL / TLS。另一个是SSH。在SSH中,使用了Diffie-Hellman密钥交换,但是服务器的公共部分(其gb mod p)由服务器签名。客户端知道它正在与正确的服务器通信,因为客户端(从先前的初始化步骤中)记住了服务器的公共密钥(通常为RSA或DSA类型);在上面解释的模型中,合法服务器是通过其对与客户端记住的公共密钥相对应的签名私有密钥的了解来定义的,并与模仿者区分开。该签名提供了身份验证;然后Diffie-Hellman会生成一个共享密钥,该密钥将用于加密和保护该连接的所有数据交换(使用一些对称加密和MAC算法)。它本身可以完成您需要做的所有事情,它仍然提供有用的功能,即密钥交换,您不会从数字签名中获得该功能,并且提供了加密实际交换的数据所需的临时共享机密。
评论
我绝对喜欢这种描述:“因此,用户“鲍勃”实际上仅是由他计算非鲍勃无法计算的事物的能力来定义的。”这是一种很好的,简洁的解释身份的方法,但并不总是直观的。
–约翰·费米内拉(John Feminella)
2015年6月16日在2:33
好答案。我要包括的一个细节是,未经身份验证的DH仍可以提供一定的安全性。 DH使您的通信免受被动侦听的影响,因此对手将不得不切换到主动MITM。如果仅对很小一部分连接进行了身份验证,那么就会注意到任何大规模的活动MITM,即使对于未经身份验证的连接也可以提供一定的安全性。这依赖于经过身份验证和未经身份验证的连接与被动对手是无法区分的。
–卡巴斯德
15年6月16日在5:04
#2 楼
汤姆(Tom)为Diffie-Hellman为什么无法抵御中间人提供了很好的解释。现在,这回答了OP的原始问题,但可能使一些读者有(合理的)后续问题:为什么我们不仅仅使用公共密钥(非对称)密码来确保消息的机密性,并完全丢弃D-H?有一些理由不这样做:有一些算法仅支持签名,但不加密消息(例如ECDSA)。
对称加密和解密很多比非对称方式更快。<br />最重要的是,我们要确保向前保密。毕竟,您的一个通信合作伙伴的私钥在某个时刻被泄露并非不可能。现在,如果您仅依靠非对称加密,则攻击者可以回想起曾经发送给该伙伴的所有消息。相反,如果我们使用Diffie-Hellman-更确切地说,是短暂的Diffie-Hellman,我们将为每个通信会话生成一个新的DH密钥对,然后将其丢弃(=不存储),这意味着无法解密我们稍后的消息。
#3 楼
进行DH密钥交换后,双方都知道他们计算了什么密钥。如果没有中间人渗透到该连接,则双方将具有相同的密钥。如果连接已断开,则它们将具有不同的密钥。如果有一方可以询问另一方正在使用什么密钥的方法,则中间人只有能够以与合法方相同的方式做出响应,才能被发现。虽然通常使用数字签名来回答问题,但要使模拟变得困难,但也可以通过诸如语音通信之类的问题来询问/回答问题。如果语音应用程序向参与者显示了当前的加密密钥,并且参与者任意选择了一个范围和一个受欢迎的电影明星(例如Marilyn Monroe),并要求对方以他们最好的Marilyn Monroe语音读取第15至第25位数字,拥有数字的真正参与者将能够快速,流畅地这样做,并且在没有MITM攻击的情况下,数字将与第一方看到的数字匹配。中间人攻击者可以毫无问题地发现问题,并且在一定时间内可以伪造玛丽莲·梦露(Marilyn Monroe)的语音来模仿合法通讯员的语音文件,但会用适当的数字很难像真正的那样快。简而言之,如果每个参与者都知道另一参与者将比攻击者更有效地处理某事,那么DH本身就可以抵抗MITM攻击。但是,其他协议通常与DH结合使用,因为它对于自动完成身份验证过程很有用,并且大多数不依赖加密的身份验证形式(例如语音,短语等)都需要人工验证。此外,实体经常有必要征求陌生人的通讯。如果要与Acme Bank代表交谈,则中间人冒名顶替者可以建立一个假的“ Acme Bank”办公室来接我的电话,让别人在假冒的客厅里将我所说的一切转告给真实的人。 Acme Bank,没有人会更明智。如果我不知道真正的Acme Bank员工能够模仿Marilyn Monroe的好坏,我将无法得知冒名顶替者的模仿是不同的。
#4 楼
DH通常不能抵抗中间人攻击。如果Alice和Bob(A <-> B)可以设置共享机密。然后,弗兰克可以与爱丽丝(A <-> F)设置共享密钥。同时,弗兰克可以与鲍勃(F <-> B)设置第二个(不同的)共享密钥。然后,Frank可以解密A-> F消息,然后重新加密并将其发送到bob F-> B,反之亦然。
*因此,您需要某种方式来确保消息实际来自(已签名)由)爱丽丝。使用先前共享的机密(通过其他渠道提供)或使用证书颁发机构(代理信任)。或其他某种方法。
如果您只稍微信任CA,则Alice可以与Bob设置DH共享密钥,并使用来自CA的证书对消息进行签名。鲍勃检查邮件是否由CA签名。弗兰克(Frank)无法伪造消息,因为它们没有必需的证书。
现在,爱丽丝和鲍勃有了一个共同的秘密。弗兰克无法伪装成中间人。但是,CA不参与创建共享密钥(仅对沿途发送的部分进行签名),因此CA也不能扮演坏角色。即使弗兰克用5美元的扳手威胁了他们。
*稍微简单一点,但这是普遍的想法。
#5 楼
我必须在汤姆·里克(Tom Leek)的回答中说得更准确一点:“在SSH中,使用了Diffie-Hellman密钥交换,但是服务器的公共部分(其gb mod p)是由服务器签名的。”实际上,整个DH密钥交换都已签名。仅签名gb mod p是不够的:仅通过连接SSH服务器并稍后重播[SSH-TRANS]数据包就可以欺骗SSH服务器。那不能证明对当前会话数据的了解。它省略了ga mod p,SSH ID字符串和协议协商。
双方交换了SSH ID字符串和协议协商消息后,便进行了身份验证,并且客户端发送了Diffie-Hellman密钥交换消息。
服务器计算gb mod p并哈希所有重要信息:
H = hash(context || sig_pub || ga mod p || gb mod p || gab mod p)
with context = SSH ID字符串||协议协商消息。
然后签名握手哈希:sig =签名(sig_priv,H),然后将(sig_pub,gb mod p,sig)发送回客户端。
没有人可以欺骗任何东西,除非他们破坏了签名算法。
评论
正如您所描述的,Diffie-Hellman密钥交换容易受到MITM攻击是完全正确的。是的,但是如果您用另一种方式描述它,那么它将不会受到mitm的攻击。<br />
还相关:观察到正在建立的HTTPS连接的人们怎么可能不知道如何解密它?