c_anirudh Asked: 2021-06-18 09:04:40 +0800 CST2021-06-18 09:04:40 +0800 CST 2021-06-18 09:04:40 +0800 CST 主机密钥检查如何防止中间人攻击? 772 我正在编写一个程序,试图建立与服务器的 SSH 连接(严格的密钥检查开启)。文档说,没有严格的密钥检查会让我容易受到中间人攻击。 我知道主机密钥验证检查我们尝试连接的服务器是否具有健全的主机密钥(存储在 中/etc/ssh)作为我们~/.ssh/known_hosts文件中的内容。 我对主机密钥验证的理解是否正确? 但是,由于主机密钥是公开可用的(ssh-keyscan <hostname>),任何人都可以通过复制和使用此主机密钥来欺骗服务器吗? ssh linux 1 个回答 Voted Best Answer Kamil Maciorowski 2021-06-18T09:51:41+08:002021-06-18T09:51:41+08:00 由于主机密钥是公开可用的,任何人都可以通过复制和使用此主机密钥来欺骗服务器吗? 不可以。服务器的公钥是公开的。要欺骗服务器,需要它的私钥。它们是不同的,它们在数学上是相连的,它们形成了一对。它们背后的数学使得从公钥中导出私钥非常非常困难(计算成本很高)。 知道服务器的公钥(在您的本地~/.ssh/known_hosts),您的 SSH 客户端可以构建一个“难题”供服务器解决。当且仅当服务器知道相应的私钥时,解决这个难题很容易。因此,如果服务器解决了这个难题,那么您的客户端就知道服务器拥有正确的私钥,因此它是真正的服务器。 反过来:当你想用你的私钥进行身份验证时,服务器(让你的公钥在~/.ssh/authorized_keys你想登录的用户中)为你的 SSH 客户端构建一个“难题”来解决。当且仅当客户端知道相应的私钥(即您的私钥)时,解决这个难题很容易。您的客户端确实知道它,它解决了难题并且服务器知道它是您。 潜在的欺骗者可以知道服务器的公钥。这允许他们检查真实服务器是否是真实的(通过构建一个谜题),但他们仍然无法冒充服务器,因为他们无法轻松解决其他人(例如您的)旨在验证服务器真实性的谜题。他们需要服务器的私钥来执行此操作。 同样,如果有人知道您的公钥但不知道您的私钥,则他们无法向您可以进行身份验证的服务器进行身份验证(使用您的私钥)。 私钥应保密。 此外,客户端和服务器使用会话密钥对通信进行加密。他们首先选择一些(随机)秘密和一些容易从秘密中获得的信息。他们交换派生的信息,并且都达到相同的秘密会话密钥。该过程背后的数学使得从交换的信息中获取会话密钥(或起始秘密)非常非常困难(计算成本很高)。外部观察者无法预测会话密钥。但是起始秘钥和从另一端接收到的信息足以让两端得到相同的密钥。密钥取决于两个起始秘密,因此没有结束可以强制使用某个特定密钥。 这发生在身份验证之前。事实上,认证程序使用会话密钥来构建“谜题”。由于这个中间人在客户端面前扮演服务器,在服务器前面扮演客户端,不能简单地传递谜题及其解决方案。他与客户端的通信将使用与服务器通信不同的会话密钥。他可以通过用一个密钥解密并用另一个密钥加密来中继数据。但是,如果他转达了一个谜题,则该谜题中内置的会话密钥将与另一端所期望的不匹配。身份验证将失败。中间的人需要真正解决难题以传递它们(或者更确切地说,将它们从一个会话密钥“翻译”到另一个)。或者他需要建立独立的谜题。 总而言之:在不知道服务器私钥的情况下,攻击者无法自行冒充服务器,也无法中继来自真实服务器的身份验证。
不可以。服务器的公钥是公开的。要欺骗服务器,需要它的私钥。它们是不同的,它们在数学上是相连的,它们形成了一对。它们背后的数学使得从公钥中导出私钥非常非常困难(计算成本很高)。
知道服务器的公钥(在您的本地
~/.ssh/known_hosts
),您的 SSH 客户端可以构建一个“难题”供服务器解决。当且仅当服务器知道相应的私钥时,解决这个难题很容易。因此,如果服务器解决了这个难题,那么您的客户端就知道服务器拥有正确的私钥,因此它是真正的服务器。反过来:当你想用你的私钥进行身份验证时,服务器(让你的公钥在
~/.ssh/authorized_keys
你想登录的用户中)为你的 SSH 客户端构建一个“难题”来解决。当且仅当客户端知道相应的私钥(即您的私钥)时,解决这个难题很容易。您的客户端确实知道它,它解决了难题并且服务器知道它是您。潜在的欺骗者可以知道服务器的公钥。这允许他们检查真实服务器是否是真实的(通过构建一个谜题),但他们仍然无法冒充服务器,因为他们无法轻松解决其他人(例如您的)旨在验证服务器真实性的谜题。他们需要服务器的私钥来执行此操作。
同样,如果有人知道您的公钥但不知道您的私钥,则他们无法向您可以进行身份验证的服务器进行身份验证(使用您的私钥)。
私钥应保密。
此外,客户端和服务器使用会话密钥对通信进行加密。他们首先选择一些(随机)秘密和一些容易从秘密中获得的信息。他们交换派生的信息,并且都达到相同的秘密会话密钥。该过程背后的数学使得从交换的信息中获取会话密钥(或起始秘密)非常非常困难(计算成本很高)。外部观察者无法预测会话密钥。但是起始秘钥和从另一端接收到的信息足以让两端得到相同的密钥。密钥取决于两个起始秘密,因此没有结束可以强制使用某个特定密钥。
这发生在身份验证之前。事实上,认证程序使用会话密钥来构建“谜题”。由于这个中间人在客户端面前扮演服务器,在服务器前面扮演客户端,不能简单地传递谜题及其解决方案。他与客户端的通信将使用与服务器通信不同的会话密钥。他可以通过用一个密钥解密并用另一个密钥加密来中继数据。但是,如果他转达了一个谜题,则该谜题中内置的会话密钥将与另一端所期望的不匹配。身份验证将失败。中间的人需要真正解决难题以传递它们(或者更确切地说,将它们从一个会话密钥“翻译”到另一个)。或者他需要建立独立的谜题。
总而言之:在不知道服务器私钥的情况下,攻击者无法自行冒充服务器,也无法中继来自真实服务器的身份验证。