SSH 加密如何工作?

DrS*_*ove 36 encryption ssh public-key-encryption

我已经阅读了有关在客户端主机上生成 2 个密钥(私有和公共)并将公钥复制到服务器主机的信息。

据我了解,(如果我错了,请纠正我):服务器使用公钥加密数据并将其发送给客户端,客户端使用私钥对其进行解密。

但是如果我需要加密客户端上的数据以发送到服务器,它是如何发生的?

公钥加密客户端上的数据?但是如果服务器只有公钥,它如何解密呢?

SSH 加密如何工作?

use*_*686 36

建立 TCP 连接后,两个系统首先就会话密钥达成一致,使用DH 密钥交换ECDH或 GSSAPI等协议。这个密钥是对称的和临时的——双方使用相同的密钥来加密和解密数据,使用诸如AESRC4 之类的算法。

客户端密钥对从不用于加密数据,仅用于身份验证——“publickey”是几种可用方法之一,其中客户端提供自己的公钥以及私钥所有权的证明。同样,服务器密钥对仅用于在 DH 或 ECDH 密钥交换期间验证服务器;没有数据使用它加密。

SSH2 协议记录在多个 RFC 中,包括:

  • RFC 4253 – 安全外壳 (SSH) 传输层协议
  • RFC 4419 – Diffie-Hellman Group Exchange
  • RFC 4432 – RSA 密钥交换
  • RFC 4462 – GSSAPI 身份验证和密钥交换


Zor*_*che 14

我认为您首先需要了解的是,虽然许多加密协议(如 SSH 和 SSL)使用 PKI 进行身份验证,但这些系统几乎都不会使用 PKI 来实际传输有效负载。

PKI 过于占用 CPU,无法用于传输实际的有效载荷数据。发生的情况是,PKI 用于协商随机生成的密钥,以便与对称加密协议一起使用。要使用的协议也是经过协商的,应该是两个系统可以达成一致的最强协议。因此,一旦初始握手和协商完成,几乎所有东西都只是标准的对称密码学。

  • 为了进一步阅读,这基本上在 [RFC4253](http://www.ietf.org/rfc/rfc4253.txt),第 15 页中进行了解释。 (2认同)

Sco*_*ain 13

以下是一些实际示例,假设密钥 A 是保密的,因此是私钥,而密钥 B 发布在可公开访问的地方,因此是公钥。

因此,如果您想向所有人发送一条消息,并且希望他们验证它是否来自您并且在传递过程中没有被更改,那么您将发送您的消息并包含使用密钥 A 加密的消息的哈希值。然后任何人拥有密钥 B 可以解密哈希,将其与他们收到的消息进行比较,并验证消息是否来自您(因为只有拥有密钥 A 的人才能生成成功解密哈希的加密有效负载,并且因为您是唯一拥有密钥 A 的人,它只能来自您)。这称为签名

现在假设有人想向您发送秘密消息,但不想透露他们是谁。他们可以使用对称密钥来加密他们的消息(正如 Zoredache 提到的,对称要便宜得多),然后使用该密钥并使用密钥 B 对其进行加密并将其发送给您。因为只有密钥 A 可以解密用密钥 B 加密的内容,其他人无法看到发送给您的消息中的内容。这就是普通加密的工作原理以及 SSH 交换数据的方式。