从这个问题阅读为什么 SSL/TLS 握手有一个客户端和服务器随机?,OP问他为什么不能直接使用premaster secret,接受的答案是:
...防止任何重放攻击。
我不明白为什么如果我直接使用premaster,它不能防止重放攻击。
premaster 由服务器的公共证书加密。如果没有服务器的私钥,中间人无法解密预主密钥。所以我认为这将是安全的。
我误解了什么吗?
从这个问题阅读为什么 SSL/TLS 握手有一个客户端和服务器随机?,OP问他为什么不能直接使用premaster secret,接受的答案是:
...防止任何重放攻击。
我不明白为什么如果我直接使用premaster,它不能防止重放攻击。
premaster 由服务器的公共证书加密。如果没有服务器的私钥,中间人无法解密预主密钥。所以我认为这将是安全的。
我误解了什么吗?
我认为您误解了重放攻击是什么。您是正确的,MitM 将无法看到 premaster 机密,但是即使攻击者无法解密任何内容,他们仍然可以造成麻烦。
假设您向服务器发出订购小部件的请求。你和服务器之间有一个中间人,但请求是完全安全的,他们不能解密任何东西。不幸的是,这是一个直接使用预主密码的替代宇宙。
MitM 看到您已向store.example.com
. 他们看不到请求是什么,但他们可以看到它是 to store.example.com(由于 IP 地址或由于 SNI)。他们看不到任何解密的通信,但他们可以看到所有的加密流量。只是为了好玩,他们把你发送到服务器的所有加密流量,然后再发送一次,10 次。
现在,您的卡又被收取了 10 次费用,几天后,您最终得到了 11 个小部件,而不是 1 个。
现在,如果攻击者在我们的宇宙中尝试这样做会发生什么?(非常简化)
ServerHello.random
ServerHello.random
都不匹配这里的关键点是服务器上有一些状态,ServerHello.random
每个连接都不同,主密钥取决于这个状态。
这里在问题中讨论了两种类型的攻击,
中间人攻击:有人试图窃取您发送的信息,这可以通过在您发送之前使用您的公钥加密信息来保护,任何拥有相应私钥的人,他们只能解密信息。
重放攻击:假设您正在发送一些请求(即使对请求进行加密)并从服务器/客户端接收一些响应。现在重放攻击是,未经授权的人获得响应,复制您的请求并获得相同的响应!!。这可以通过为请求保留一些序列号并签署请求本身来防止。因此,每个请求都应使用包含的新序列号进行签名。现在服务器/客户端可以验证请求的签名并验证序列号。即使有人试图发送复制的消息,它也会被对方拒绝,因为序列号没有增加。这里提到的序号机制只是为了说明。