是什么阻止黑客在非对称加密中伪装成 Server/Client 和 Public 密钥?

What Prevents Hackers from Pretending To Be A Server/Client With Public Keys In Asymmetric Encryption?

在非对称加密中,public 密钥可用于加密发送到具有匹配私钥的设备的消息。我知道这可以防止嗅探器知道消息的内容,但考虑一下:
是什么阻止黑客使用 public 密钥来加密消息并假装是某人 he\she 不是吗?假设我在亚马逊上购物,当亚马逊与我交换时,一名黑客设法捕获了亚马逊的 public 密钥。难道这个黑客不能通过简单地修改他的数据包的 headers 来假装是我,使它们看起来像是来自我的计算机吗?我知道这不会发生,所以我错过了什么?

请查看 TLS 握手协议,它清楚地说明了 TLS 中发生的事情:https://de.wikipedia.org/wiki/Transport_Layer_Security#TLS_Handshake_Protocol

  1. 您在连接到亚马逊时没有私钥或 public 密钥,因为您没有使用客户端证书进行身份验证。

  2. 如果黑客窃取了您的 public 密钥,这不是问题,因为您的 public 密钥只能用于向 您发送加密消息。只有 you 可以解密这些消息,因为只有 you 有匹配的私钥。这就是非对称密码学的意义所在!

Say I am shopping on Amazon, and a hacker managed to capture amazon's public key when Amazon exchanged it with me.

用亚马逊的 public 密钥加密的数据只能用亚马逊的私钥解密。

a hacker managed to capture amazon's public key

亚马逊的 public 键是 public。每个人都知道。 2018 年 5 月 3 日发布的开始 "A9 F4 4A 9B 29 84 20 A7 53 FF BA 01 B5 1E 0C 2A A7 53"。 public/private 密钥加密的全部要点在于 public 密钥不是秘密。所以捕获 public 键并不重要。

您的问题不是关于向您伪装成亚马逊(即与亚马逊的密钥有关)。这是关于伪装成你去亚马逊。那是完全不同的情况。您不会使用证书(称为 "client certificate")向 Amazon 表明自己的身份,因此证书和 public/private 密钥加密与此无关。是的;任何人都可以使用他们的 public 密钥向亚马逊发送加密的消息,但这不是证明你是你所说的人的方式。

相反,您使用凭据(通常是用户名和密码)向亚马逊表明自己的身份。当您这样做时,Amazon 会返回给您一个会话令牌,它只是一个很大的随机数,在数据库 table 中映射到您(或者有时会话令牌是有关会话的加密信息,因此数据库是'需要)。通过身份验证后,您会不断将会话令牌传回亚马逊以表示 "you already know and trust who I am."

那么,如果有人捕获了会话令牌怎么办?那将是一件大事。那绝对会允许您所描述的内容。只要会话令牌有效,它就必须受到保护。当我们使用 "prevents sniffers from knowing the content of a message" 的 TLS 将它传递给亚马逊时,我们会对其进行保护,因此攻击者有望无法发现会话 ID。

有许多窃取会话 ID 的攻击,广泛称为 "session hijacking." 其中比较有名的是 Firesheep, which relied on unsecured (HTTP) sessions. However, there are more advanced attacks against HTTPS, such as CRIME and BREACH。 TLS 的改进已经减轻了各种已知的攻击,但总是有可能出现新的攻击。

What keeps a hacker from using the public key to encrypt messages and pretend to be someone he\she is not? Say I am shopping on Amazon, and a hacker managed to capture amazon's public key when Amazon exchanged it with me. Couldn't this hacker pretend to be me by simply modifying the headers of his packets to look like they came from my computer?

很好的问题。 TLS 通过在握手协议期间在客户端和服务器之间创建会话密钥来防止这种情况。有两种类型的密钥:一种用于加密(通常为 AES),一种用于 message integrity / message authentication (MAC)(通常为 HMAC)。会话期间的所有通信都使用对称加密密钥加密,并使用 MAC 密钥进行 MAC。服务器不接受任何未使用 MAC 密钥正确签名的数据。因此,只有拥有这些密钥的人才能与该会话的服务器通信。

所以问题就变成了攻击者如何确定在初始 TLS 握手期间设置的加密和 MAC 密钥。请注意,在握手期间,服务器通过证书向客户端提供其 public 密钥,客户端验证证书是否有效——包括它属于证书中声明的域。这允许客户端验证它正在与正确的服务器对话,假设没有人可以绕过 PKI(即证书颁发机构正在做正确的事情并且没有人可以破解 public 密钥加密)。现在不同的客户端可以与服务器建立不同的会话,但它们都是使用每个客户端生成的私钥完成的,并且每个客户端都知道这个私钥。因此,每个客户端都使用只有他们自己知道的密钥以独特的方式设置其会话。

如果您想深入挖掘,整个设计还有更多内容,包括如何使用序列号来防止重放攻击。但我希望你能大致了解一下。