RSA 指纹如何防止 MITM 攻击?

信息安全 密码学 验证 SSH 中间人
2021-09-02 19:35:53

我了解 RSA 指纹用于验证您是否真的直接连接到您想要连接的人,而不是冒充该站点的其他人。

就像你做 a 一样git push,它会显示一个 RSA 密钥,然后你可以去一个网页,看看你得到的密钥是否与他们网页上的密钥匹配。

但是,如何阻止其他人找出该站点正在使用的公共 RSA 密钥,然后使用相同的密钥进行回复,以假装是该站点?

4个回答

其他答案中也有一些很好的信息,但要直接回答您的问题:

但是,如何阻止其他人找出该站点正在使用的公共 RSA 密钥,然后使用相同的密钥进行回复,以假装是该站点?

攻击者可以这样做,他们可以欺骗您使用公钥加密您的数据并将其发送给他们。但是,如果没有相应的私钥,这些信息对他们来说将毫无用处,因为他们将无法解密它。

公钥就是这样 - 公开的,用于分发。拥有公钥的副本不允许您自己伪装成密钥的所有者。它使您能够使用与公钥对应的私钥,以只有所有者才能解密的方式加密您发送给所有者的数据。它还允许您解密使用私钥加密的数据,证明数据来自私钥的所有者,这就是这里的用途 - 您的公钥副本允许您合理确定您的服务器正在与之通信的是值得信赖的(在您可以信任私钥的所有者来维护该私钥的保密性的范围内)。

如果所有者将私钥保密,系统就会按预期工作。

Wikipedia 关于公钥密码学的文章很好地介绍了 RSA、DSA 等的工作原理。

指纹是根据关联的公钥计算得出的,并且可以由您的计算机计算出来。如果指纹符合您的预期,那么您加密的密钥就是适合您目标的密钥。

虽然可以报告错误的指纹,但可以根据实际拥有的密钥独立计算它们这一事实几乎没有用,除非用于指纹识别的散列足够小以至于实际上可能发生冲突。如果没有冲突,任何数据交换仍将被加密为适当的公钥(因为您验证了您使用的那个与预期的哈希匹配)并且如果没有相应的私钥就无法解密。

短的

MITM 需要服务器的私钥来伪装成服务器并解密您发送到服务器的私人消息。服务端的公钥是用来验证服务端签名的消息和发送私信给服务端的,所以你还是需要验证它的指纹。如果 MITM 也有公钥也没关系。这意味着 MITM 还可以验证来自服务器的消息并将私人消息发送到服务器。

一般来说,如果每个人都知道所有公钥,那么任何人都可以验证任何人的签名,并且任何人都可以向任何人发送私人消息。私钥控制签名和解密,因此理想情况下,没有人可以伪装成另一个人,也没有人可以阅读发送给另一个人的私人消息。

长的

注意:以下仅为教育目的的简化模型,旨在说明公钥指纹的要点。有关更多 SSH 详细信息,请参阅此其他问题

审查。为简单起见,考虑一个公共软木板,而不是通过计算机网络的 SSH,代理可以在其中发布文本注释。一开始,棋盘是空白的。代理AS希望进行通信,并希望保护其消息的隐私和完整性免受恶意代理的侵害M假设私钥只有它们各自的所有者知道。

  1. A帖子A_pubS帖子S_pub
  2. A用 加密消息S_pub,用 签名A_priv,然后发帖。
  3. S使用解密消息S_priv,使用 验证签名A_pub
  4. S用 加密回复A_pub,用 签名S_priv,然后发帖。
  5. 我想你知道A这里是做什么的。

代理M无法解密这些消息。M 可以将加密消息发布到SA但是,伪造的尝试会失败。使用或签名的消息 M_priv不会通过验证A_pubS_pub

现在介绍公钥指纹的功能。假设M创建 M_pubM_priv,并试图A通过发布M_pub为来愚弄S_pub

Dear A,

My public key is

   [contents of M_pub]

Love,
S

如果 A相信这个谎言,A加密消息以便 可以解密它们,并且可以伪造消息作为使用但是,如果 有 的指纹则可以将其与 的指纹进行比较 并发现谎言。因此将拒绝用于对来自 的消息进行加密和对来自 的消息进行身份验证SM_pubMMSM_privAS_pubAM_pubAM_pubSS

因此,当 SSH 发出关于公钥指纹未知或已更改的警告时,这意味着您可能成为 MITM 攻击的受害者。如果您继续,MITM 将能够解密您的消息并作为服务器伪造响应。如果指纹检查成功,则您非常有信心不是 MITM 的受害者,假设您拥有的指纹是服务器的真实指纹,私钥(您的和服务器的)确实是私有的,SSH 的实现是正确的,并且公钥加密数学不会受到影响。