【发布时间】: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 的问题。它的目的是防止人们意外连接到欺骗服务器,或者被中间人攻击;它不会阻止人们故意与欺骗客户端连接(甚至对它们有概念——证书附带的公钥意味着任何人都可以轻松检索)。