第一章:加密、算法和密钥

加密将可读明文转换为攻击者无法理解的不可读密文。

解密会进行反转转换,从明显的乱码中产生可读的文本。

现代计算机驱动的加密算法处理文本块,并执行复杂的转换。

大多数加密算法使用密钥;用于加密消息的文本、数字、符号或数据块。

密钥可以由用户选择或随机生成。

人们习惯性地选择容易猜到的密钥,因此OpenSSH甚至没有给用户创建自己的密钥的选项。

加密算法使用密钥对文本进行加密,使外部人员更难解密。即使你知道加密算法,如果没有密钥,也无法解密消息。

将加密算法视为一种锁,密钥是一个特定的钥匙。锁有很多不同的类型,每种锁都是用某种类型的钥匙。但即使类型相同,不匹配的钥匙也无法打开错误的锁。加密密钥的工作原理类似。

算法类型

加密算法有两种:对称(symmetric)和非对称(asymmetric)。

对称加密算法使用相同的密钥进行加密和解密。

对称算法包括但不限于高级加密标准(Advanced Encryption Standard——AES)和ChaCha20,以及较旧但现在不安全的算法,如3DES和blowfish。

儿童替换码是一种对称算法。一旦你知道A等于1等等,你就可以加密和解密消息。

对称算法(比简单的替换更复杂)可以非常快速和安全,只要只有授权人拥有密钥。

这就是问题所在:拿到密钥的局外人可以阅读你的信息,或者用自己的信息替换它们。

你必须保护密钥。在互联网上发送未加密的密钥是非常愚蠢的,任何听到密钥的人都可以阅读你的私人信息。

非对称算法使用不同的密钥进行加密和解密。你使用一个密钥加密消息,然后使用另一个密钥解密。这是有效的,因为密钥是非常大的数字,将非常大的数相乘比计算任何除法都要容易得多。

非对称加密只有在能够处理非常困难的数学的计算机广泛可用的情况下才流行起来,而且比对称加密慢得多,计算成本也更高。

有两个单独的密钥可以创造有趣的可能性。公开一个密钥,把它送出去,向全世界广播。将另一个密钥保密,并不惜一切代价加以保护。任何拥有公钥的人都可以加密只有私钥的人才能读取的消息。拥有私钥的人可以加密消息并将其发送到世界各地。任何人都可以使用公钥解密该消息,但公钥可以解密消息的事实向接收者保证消息发送者拥有私钥。

这是公钥加密的基础。公钥及其匹配的私钥称为密钥对(key pair)。

SSH如何使用加密

对称加密速度很快,但主机无法安全地交换密钥。非对称加密允许主机交换公钥,但速度慢且计算成本高。如何有效地加密以前从未通信过的两个主机之间的会话?

每个SSH服务器都有一个密钥对。每当客户端连接时,服务器和客户端都会使用此密钥对来协商仅在这两个主机之间共享的临时密钥对。

客户端和服务器都使用这个临时密钥来导出对称密钥,它们将在会话期间使用该对密钥交换数据,以及提供连接完整性的相关密钥。

如果会话长时间运行或交换大量数据,计算机将间歇性地协商新的临时密钥对和新的对称密钥。

SSH协议比这更复杂,包括防止许多不同加密攻击的保护措施,但加密密钥交换是协议的核心。

SSH支持许多对称和非对称加密算法。客户端和服务器在每次连接时协商双方都同意的算法。

虽然OpenSSH提供了一些选项,可以轻松更改支持的算法及其对每种算法的偏好。但不要这样做!OpenSSH提供的加密偏好是开发者经过深思熟虑、故障排除和痛苦后选定的,不要尝试改为其他算法。blowfish并不是最棒的加密算法,它只是被某些人吹捧而已。

人们改变加密算法的最常见原因是提高速度。SSH的主要目的是安全,而不是速度。

不要为了提高速度而放弃安全。