为什么在 SSH 中身份验证之前生成共享会话密钥?

为什么在 SSH 中身份验证之前生成共享会话密钥?

我想了解 SSH 的具体工作原理,然后我偶然发现了这篇文章:https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process

作者写道,SSH 会话分两个阶段建立:

  1. 客户端和服务器建立加密以保护通信
  2. 客户端身份验证Client authentication

在第一阶段,双方参与生成用于加密消息的共享会话密钥。该密钥在身份验证阶段使用:

  1. 客户端将解密后的数字与共享会话密钥用于加密通信,并计算该值的 MD5 哈希值。

我的问题是:如果身份验证过程失败,为什么要经历生成共享会话密钥的过程?无论如何,消息都是通过公钥加密和私钥解密来保护的,那么另一层安全性是否真的有必要,或者它只是为了确保安全而采取的安全措施?

如果客户端首先经过身份验证,然后生成共享会话密钥,这对我来说更有意义。

答案1

非对称(公共/私有)操作成本高昂(操作越少越好),而对称加密成本低廉。SSH 首先在客户端和服务器之间建立完全对称加密,然后开始讨论身份验证方法。

作为协商的一部分,可以提供和拒绝多个密钥(您的建议会使这更加昂贵)。然后可以尝试其他身份验证方法。您希望让任何窃听者尽可能少地了解此阶段,因此为此设置完整的端到端加密是有意义的。

附加论点:您的建议使失败的尝试更便宜,我们实际上并不想要这样,它们至少应该与成功的尝试一样昂贵。

答案2

不,这是基本的加密层。没有其他层。

无论如何,这些消息都是通过公钥加密和私钥解密来保护的

事实并非如此。出于各种原因(例如,非对称算法的性能比对称加密差很多,或者缺乏前向保密性,或者只是协议使用适合签名但不适合加密的算法),公钥加密/解密从未用于保护所有流量。

相反,SSH 和 TLS/SSL 都使用“混合”模型,其中公钥/私钥对仅用于协商会话密钥(或更常见的是,仅用于确保协商安全),并且之后根本不使用。

此外,如果客户端不加密数据,服务器如何加密数据?密钥对?请记住,SSH 有多种客户端(用户)身份验证方法,例如需要以某种方式加密的简单密码。(相比之下,在一般的 TLS/SSL 使用中,客户端根本不经过身份验证。)理想情况下,身份验证过程不会向外部人员透露WHO目前正在验证。

只为身份验证细节设置一个加密层,其余会话则切换到另一个加密层,这将是可能的但不必要地复杂——因为毕竟它甚至无法避免您提到的“问题”(必须在身份验证之前进行密钥交换)。

相关内容