保护 UDP 连接

问题描述 投票:0回答:2

对于个人 MMO 游戏项目,我正在 java 中实现一个自制的可靠的基于 UDP 的协议。鉴于我当前的设置,我相信窥探者劫持会话相对简单,因此为了防止这种情况,我借此机会学习一点密码学。非常有趣。

我可以使用 Diffie-Hellman 密钥交换(一个非常聪明的概念)在客户端和服务器之间成功创建共享密钥,但现在我需要使用它来保证数据包的真实性。到目前为止,我的初步测试表明,我尝试过的几种不同的密码会使数据量稍微膨胀,但我希望保持数据尽可能小和快。

考虑到我只是想验证数据包,而不是隐藏整个有效负载,我的想法是,我可以将从密钥生成的 8 字节会话 ID 放入数据包标头中,加密整个数据包,然后对其进行哈希处理回到 8 字节。我取出未加密的数据包并将 8 字节哈希值放入会话 ID 的位置,然后将其发送出去。

这安全吗?加密整个数据包然后不加密地发送它感觉有点不雅 - 有没有更好/更快的方法来实现我的目标?请注意,我想自己做这件事,因为它的经验很好,所以我对第 3 方库或其他协议选项不太感兴趣。

udp security
2个回答
4
投票

如果两个对等方都可以访问共享秘密(他们应该这样做,因为您正在谈论 Diffie-Hellman),您可以简单地将数据报的哈希值存储在其标头中。接收器检查是否匹配。

作为一项附加的安全措施,您还可以在数据报中添加一个“挑战”字段,并在哈希过程中的某个位置使用它来防止重播。

所以这个哈希应该涵盖:

  • 共同的秘密
  • 挑战
  • 数据报的内容

编辑

“挑战”是一个严格递增的数字。您将其添加到数据报中只是为了在每次发送新消息时更改哈希值。如果有人截获消息,则无法重新发送:接收者确保不接受该消息。


0
投票

最简单的选择是使用预共享加密密钥。

  • 无需进一步认证
  • 没有中间人攻击

其余的执行常规措施,您建立上述不可靠协议:

  • 消息计数器
  • 丢弃消息检测
  • 重新发送
  • 删除重复项

如果关联的协议工件也被加密,那么应该没问题。


如果您更喜欢 Diffie-Hellman:

无论如何都需要端点的身份验证。选项有

  • 使用预共享私钥验证所有消息
  • 通过具有或不具有可信权威的证书进行身份验证
  • 将 IP 地址纳入身份验证评估,并从 TURN 服务器检索公共地址以及协议握手中的附加步骤。

© www.soinside.com 2019 - 2024. All rights reserved.