为什么默认情况下不加密 TCP 套接字?

信息安全 加密 tcp 嗅探
2021-09-07 11:26:28

我一直在想这个问题,只要我一直在编程,为什么默认情况下不加密 TCP 套接字?每个人都说使用原始套接字是危险的,因为所有发送的数据包都容易受到数据包嗅探的影响。

那么为什么 TCP 套接字的原始实现不包括一种基本形式的加密呢?到目前为止,我注意到的是,大多数语言要么不提供强制您使用第三方库的内置实现,要么让“菜鸟”很难在所有套接字上实现 SSL,而大多数语言都没有”甚至一开始就懒得这样做。

即使是简单的自签名证书也足以提供最基本的保护形式,新开发人员可以将其抽象出来。

3个回答

现代网络遵循七层 OSI 模型,该模型由于关注点分离的原则而成功。

关注点分离的价值在于简化计算机程序的开发和维护。当关注点分离得很好时,可以重复使用各个部分,也可以独立开发和更新。具有特殊价值的是以后改进或修改一段代码的能力,而不必知道其他部分的细节,也不必对这些部分进行相应的更改。

TCP/IP 是第 4 层(“传输”)

传输层提供了通过一个或多个网络将可变长度数据序列从源主机传输到目标主机的功能和程序手段,同时保持服务质量功能。

SSL/TLS 是第 6 层(“演示文稿”)

该层通过在应用程序和网络格式之间进行转换,提供与数据表示(例如,加密)的独立性。表示层将数据转换为应用程序接受的形式。该层对要通过网络发送的数据进行格式化和加密。它有时被称为语法层。

换句话说,这是一个有意识的设计选择。

此外,TCP 比 SSL 早了几十年。也就是说,SLL不断变化,因为发现了弱点;与此同时,TCP 基本保持不变。OSI 模型通过保持某些事物不变而改变其他事物,从而更容易地采用更改。如果我们将加密内置到 TCP 中,那么它将是一个不太稳定的协议。

为什么蜗牛邮件没有内置加密?

套接字是一个简单的概念,用于使多方之间的通信成为可能,即只是传输消息。到目前为止,它类似于蜗牛邮件,即您有一些发件人和收件人以及邮件,并且您可能有一些可以轻松绕过的最小保护(信封)。保护通信免受嗅探和篡改是一个更复杂的概念,实际需要哪种保护取决于具体的用例。例如,向本地系统上的另一个进程发送消息需要与向本地网络中的另一台主机或地球另一端的某个方发送消息不同的保护,其中一些路由器由政府组织控制。

因此,将消息交换与消息保护分开处理以简化通信并在实际需要的保护类型方面具有灵活性才有意义。

不同用例的一些示例应该更清楚地说明为什么将这些概念分开是有意义的:

  • UNIX 域套接字不需要加密,因为您需要具有内核权限才能实际嗅探数据,在这种情况下,您还可以在加密之前获取数据。
  • 如果您在一个具有完整 IPSec 部署的网络中,则网络中各方之间的所有通信都已加密,因此您无需在顶部添加其他加密。
  • 像 HTTPS 这样的互联网加密首先需要使用本地信任锚推出 PKI 基础设施,以便您可以在发送消息之前实际验证对等方。
  • 像使用 SMTP(邮件传递)一样的逐跳加密并不能保护邮件免受对跃点的嗅探,因此您还需要端到端加密(即 PGP、S/MIME)。
  • 单向或多播通信不能像 TLS 那样进行密钥交换,因为这需要双向通信。

性能开销

加密比基本网络需要更多的努力。首先,它需要计算能力——在 1980 年代,当 TCP 获得大规模采用时,通过类似 SSL 的通道运行所有流量是不切实际的,因为处理器比现在慢得多。

然而,更大的问题是小请求的 SSL 握手的网络开销。对于小消息,建立加密密钥的握手很容易比实际消息大几倍,并且需要更多的往返,并且可能会加倍延迟。这就是为什么即使在今天重新设计标准,让基本的网络套接字层不加密也是有意义的。