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

时间:2018-05-13 18:53:02

标签: python ssl udp

我希望这不太自以为是,因为我正在寻找一个有限的答案。

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

在使用UDP进行身份验证时,我感到很茫然。我的计划是让游戏客户端和游戏服务器对每个用户和游戏会话进行身份验证。这意味着客户端上有一个类似公钥的东西,服务器端可以验证客户端的私钥是否被批准。

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

我的问题

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

1 个答案:

答案 0 :(得分:0)

回答我自己的问题!

不,这不是最佳方法

这不是最佳方法的原因是因为即使使用此过程,我对公钥/私钥的使用也是不正确的。我没有提到在客户端和服务器之间加密数据,我指的是创建一个nonce,在客户端上有一些与服务器上的密码匹配的密码。

这意味着我将凭据从客户端发送到服务器的那一刻,它将在线路上或缓冲区中没有加密的情况下发送到服务器。一旦服务器接受了这种身份验证,它就会对密码进行哈希处理,然后将其存储起来,然后将其发送回客户端,客户端也将没有加密。

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

<强>解决方案

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

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