为什么直接使用 premaster secret 容易受到重放攻击?

信息安全 tls
2021-09-02 20:27:38

从这个问题阅读为什么 SSL/TLS 握手有一个客户端和服务器随机?,OP问他为什么不能直接使用premaster secret,接受的答案是:

...防止任何重放攻击。

我不明白为什么如果我直接使用premaster,它不能防止重放攻击。

premaster 由服务器的公共证书加密。如果没有服务器的私钥,中间人无法解密预主密钥。所以我认为这将是安全的。

我误解了什么吗?

2个回答

我认为您误解了重放攻击是什么。您是正确的,MitM 将无法看到 premaster 机密,但是即使攻击者无法解密任何内容,他们仍然可以造成麻烦。

假设您向服务器发出订购小部件的请求。你和服务器之间有一个中间人,但请求是完全安全的,他们不能解密任何东西。不幸的是,这是一个直接使用预主密码的替代宇宙。

MitM 看到您已向store.example.com. 他们看不到请求是什么,但他们可以看到它是 to store.example.com(由于 IP 地址或由于 SNI)。他们看不到任何解密的通信,但他们可以看到所有的加密流量。只是为了好玩,他们把你发送到服务器的所有加密流量,然后再发送一次,10 次。

现在,您的卡又被收取了 10 次费用,几天后,您最终得到了 11 个小部件,而不是 1 个。


现在,如果攻击者在我们的宇宙中尝试这样做会发生什么?(非常简化)

  1. 攻击者发送一份它保存的受害者流量的副本
  2. 在 Server Hello 中,服务器以不同的方式回复 ServerHello.random
  3. 攻击者发送的所有基于原始值的值ServerHello.random都不匹配
  4. 当服务器收到Finished消息并尝试验证时,会失败,因为服务器计算的master secret不同(即使premaster secret相同)
  5. 服务器将中止连接

这里的关键点是服务器上有一些状态,ServerHello.random每个连接都不同,主密钥取决于这个状态。

这里在问题中讨论了两种类型的攻击,

  1. 中间人攻击:有人试图窃取您发送的信息,这可以通过在您发送之前使用您的公钥加密信息来保护,任何拥有相应私钥的人,他们只能解密信息。

  2. 重放攻击:假设您正在发送一些请求(即使对请求进行加密)并从服务器/客户端接收一些响应。现在重放攻击是,未经授权的人获得响应,复制您的请求并获得相同的响应!!。这可以通过为请求保留一些序列号并签署请求本身来防止。因此,每个请求都应使用包含的新序列号进行签名。现在服务器/客户端可以验证请求的签名并验证序列号。即使有人试图发送复制的消息,它也会被对方拒绝,因为序列号没有增加。这里提到的序号机制只是为了说明。