2

我正在实现一个处理 udp 数据包的网络服务器。我想避免重放攻击,攻击者可以复制 udp 数据包,并在稍后重放它们。我玩弄我可以散列数据包并将这个值存储在散列表中的想法。然后,我可以在每次收到数据包时执行相同的过程,然后在哈希表中查找它。如果它已经存在,那么我们拒绝该数据包,但是如果我们从未见过它(该条目不存在),我们将其存储以供将来使用。

现在,什么哈希算法适合这个?我需要哈希表以外的东西吗?由于收到了很多 udp 数据包,我希望它在 O(1) 中工作!!!!!!;-), 这可能吗?

显然,我“记住”哈希的时间越长,我需要分配的存储(状态)就越多,哈希表能否随时间动态增长和收缩?

我可能离这里很远,我可能根本不需要哈希表!我对想法持开放态度!

4

2 回答 2

3

您可以控制数据包的内容吗?如果是这样,请在内容中添加一个哈希并使用它 - 这会将哈希工作转移给发送者。您还可以包括一个有效期,以便a)您知道您可以在该时间之后丢弃数据包的任何记录,并且b)攻击者存储的数据包在该时间之后变得无用。您可能希望以某种方式加密时间戳,这样攻击者就不能只更新时间戳。

其他技术可以在Wikipedia上找到

于 2010-11-30T16:30:16.243 回答
1

对数据包使用哈希表可能会很昂贵,因为您必须重新哈希您的哈希表,即 O(n)。

在这种情况下,您应该在服务器和每个客户端之间协商一个共享密钥。然后使用此密钥 K 构造消息验证码。正在验证的消息应该是您在 UDP 数据包中传输的数据以及时间戳。序列 ID 是不利的,因为无法保证 UDP 数据包会到达,而且数据包可能会乱序到达。

应该注意的是,由于三路握手和序列 ID,使用 TCP 是不可能进行这种攻击的。在这种情况下,TCP 提供的安全性实际上可能比这个提议的安全系统更轻。

于 2010-11-30T17:12:08.637 回答