【问题标题】:What is the best way to secure UDP server with HMAC?使用 HMAC 保护 UDP 服务器的最佳方法是什么?
【发布时间】:2018-05-13 18:53:01
【问题描述】:

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

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

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

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

我的问题

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

【问题讨论】:

  • 嗯,SSL / TLS 协议不涉及连接吗?
  • 如果人们有动力,任何这样的解决方案都很容易破解。看一下 RTMPE 流的例子:Flash Media Server 会拒绝任何无法验证为 Flash Player 的东西,但是一旦欺骗 Flash Player(盗版 Hulu 等网站的流)有一定价值,人们就会立即想到弄清楚如何做(首先只是从 Flash 中重放流,但不久之后通过提取密钥)。
  • 如果你愿意参加军备竞赛,找到新的方法来混淆每次破解后的密钥隐藏和握手——连同以其他方式检测被黑客户端的启发式方法,并积极禁止那些被抓住——这可能很实用(假设价值足够高),但并不容易。
  • 我认为大多数走这条路的游戏都将其与反盗版身份验证联系起来——如果每个用户已经拥有一个唯一的密钥,该密钥必须通过客户端上的验证算法并且还存储在服务器(并且可能绑定到特定的机器),然后你有其他东西可以争先恐后地握手,现在你只需在两次军备竞赛中至少一次保持领先。
  • @CristiFati 您可以在 UDP 和您自己的带外连接管理之上构建与 TLS 平行的东西。事实上,SIP 已经做到了,你可能只是借用 DTLS(如果你对它的连接概念感到满意的话。但是 (D)TLS 并不能解决 OP 的问题。它的目的是防止人们意外连接到欺骗服务器,或者被中间人攻击;它不会阻止人们故意与欺骗客户端连接(甚至对它们有概念——证书附带的公钥意味着任何人都可以轻松检索)。

标签: python ssl udp


【解决方案1】:

要回答我自己的问题!

不,这不是最好的方法

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

这意味着当我将凭据从客户端发送到服务器时,它会在线路上或缓冲区中未经加密地发送到服务器。一旦服务器接受此身份验证,它将对密码进行哈希处理,存储它,然后将 nonce 发送回客户端,这也是不加密的。

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

解决方案

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

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

【讨论】:

  • 加密不提供完整性,您可以更改密文,并且接收者对更改没有任何线索。一些加密算法(如 AES-GCM、AES-Poly1305)可以提供完整性,因为它当然有 MAC。
猜你喜欢
  • 2011-01-17
  • 1970-01-01
  • 2010-09-22
  • 2020-09-26
  • 2021-04-10
  • 2019-07-25
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多