假设我已经安全地与另一台计算机交换密钥(也许使用Diffie-Hellman),这是我的暂定解决方案:
包号+加密数据+消息验证码(MAC)
数据包编号是从0开始递增的数字。之后是加密数据本身,然后是两者的MAC。如果有人尝试进行MITM攻击,则MAC应该无法计算。如果他们尝试重播攻击,收件人会注意到它已收到该数据包号码。
我的推理是否有任何缺陷?
答案 0 :(得分:1)
假设我已经安全地与另一台计算机交换密钥(可能使用Diffie-Hellman)
这是您面临最大危险的地方 - 如果中间人设法控制密钥交换(例如,通过与客户端及其自身建立一个密钥,并与服务器及其自身建立另一个密钥) ,然后MITM可以解密(并重新加密)一切。一旦建立了安全密钥交换,就应该对MITM攻击无懈可击。但困难的是确保密钥交换真正安全。
请参阅弗格森和施奈尔的Practical Cryptography(或Amazon),了解相关信息。
答案 1 :(得分:0)
你并没有描述中间人的攻击,而是重播攻击。
通过MITM攻击,密钥交换被截获,并且您说您已经安全地交换了密钥 - 所以这不是问题。
重播攻击很容易减轻,你包含一个唯一的消息ID,然后在接收端检查它的唯一性。通常,每条消息都有一个到期日期和时间,因此您无需保留不断增长的消息ID列表以进行验证。
答案 2 :(得分:0)
我对防止重播攻击的方法对我来说似乎是合理的。您实际上是在描述一个名为timestamping的方法。您的数据包编号是“虚拟时间”,收件人使用该时间来验证之前是否未发送该消息。
答案 3 :(得分:0)
一旦密钥被交换,数据就不会被第三方截获或欺骗。 (除非你的数据包#clock循环。假设来自旧窗口的数据包可以被重播为来自新窗口。)这个问题的解决方案是时间戳(正如其他人所提到的那样)。但是,再次,如果这可以被破坏攻击者能够以某种方式妥协系统时间。 (如果他们是中间的人,他们可以假设模仿NTP服务器,并以这种方式修改客户的系统时间。)
然而,窃听者可以做的是将自己插入双方之间并破坏频道。这可能会导致发生新的密钥交换,这可以被观察到。为了使密钥交换真正安全,您必须使用第三方验证或只有两个沟通者知道的预共享密钥。