使用 HMAC 保护 UDP 服务器的最佳方法是什么?



我希望这不会太固执己见,因为我正在寻找一个有限的答案。

我正在用 Python 3.x 开发一个使用 asyncio 的 UDP 服务器。服务器将与游戏引擎一起工作,处理玩家在游戏中进行的几乎所有交互。因此,我必须以某种方式向游戏服务器验证游戏客户端,并确保重播攻击不会发生在可能损害或欺骗游戏服务器的其他所有内容之上。

在使用UDP进行身份验证时,我不知所措。我的计划是让游戏客户端和游戏服务器对每个用户和游戏会话进行身份验证。这意味着在客户端上有一个公钥,在服务器端有一个私钥,服务器可以在其中对客户端进行身份验证。

在该身份验证期间,我将生成游戏服务器制作的对称密钥并将其传递给游戏客户端,以便可以使用 HMAC 使用该对称密钥验证发送的每个数据包。否则,将丢弃所有数据包。

我的问题

这是最好的方法吗?创建某种类型的公钥,其中每个会话生成令牌之类的内容,以确保进入 UDP 服务器的数据包来自经过身份验证的客户端?我在这里担心的是密钥仍然存储在Windows EXE文件中,仍然可能被破解和提取,还是我太偏执了?

要回答我自己的问题!

不,这不是最好的方法

这不是最佳方法的原因是,即使使用此过程,我对公钥/私钥的使用也是不正确的。我不是指加密客户端和服务器之间的数据,我指的是创建一个随机数,在客户端上具有某种类型的密码,与服务器上的密码相匹配。

这意味着当我将凭据从客户端发送到服务器的那一刻,它正在不加密地在线或缓冲区中发送到服务器。一旦服务器接受此身份验证,它将散列密码,存储密码,然后将随机数发送回客户端,客户端也将不加密。

用户名、密码和随机数将容易受到来自第三方和客户端本身的中间人攻击。这意味着他们可以嗅探数据包,阻止传输并破解用户或尝试重放,因为他们有随机数。

溶液

我的游戏客户端没有 SSL/TSL/DTSL 选项。这就是为什么我实际上发布了这个问题,但没有澄清这一点。我的服务器,因为它在 Python 中是自定义的,确实具有这种能力。但是,我昨晚发现了一个游戏引擎插件,它允许在所述缓冲区作为数据包发送到UDP服务器之前对写入缓冲区的数据进行AES加密,这意味着我可以加密这些数据包中的数据传递以安全的方式希望服务器可以使用合法的私钥解密。

这样做将是一个不错的选择,因为它可能是我唯一的选择。现在,当恶意用户嗅探流量时,他们将无法看到凭据或随机数。在那之后唯一的问题是破解 EXE,我现在很好。

相关内容

最新更新