通过套接字对多人游戏进行身份验证


11

我正在为我正在开发的新多人游戏实现自定义二进制协议。它是基于回合制的策略游戏,因此计时实际上并不重要。目前,我已经完成了系统的基本数据同步部分,并且我想知道MMORPG游戏或类似游戏通常如何进行用户登录/注销和加密。

  • 您能推荐一种在登录时传输安全/秘密密码的方案吗?(Diffie-Hellman密钥交换吗?)
  • 如何对数据包实施强加密?(AES 128位?..或任何方案这一职位是指为“加密强于你很可能会破解”)
  • 是否有数据报格式方案可帮助加强游戏服务器以重放攻击,无效数据包等?

Answers:


15

答案

  • SRP-安全远程密码-这基于Diffie-Hellman。这个想法是,您可以进行相互密码检查,而无需实际传输密码或任何可用于派生密码的信息。即使通过网络是安全的,您仍然应该对密码进行哈希处理和加盐处理,因为服务器绝不能将其存储为纯文本格式
  • SRP的优势在于,一旦完成,它还会为您提供一个相互协商的加密密钥,攻击者将无法根据给定的数据推断出加密密钥。这意味着,一旦用户通过身份验证,您就可以自由使用对称加密算法(例如AES)。
  • 假设您使用的是UDP,并在其之上使用自己可靠的/有序的(面向连接的)实现:加密整个UDP播放负载-包括“数据包序列号”。如果您的系统设计正确,它将自动拒绝重播的消息,并且入侵者由于已加密而无法更改数据包序列号(因此可以重播-但会被自动忽略)。

思想

您的身份验证应该安全吗?绝对。遇到密码问题时,请在安全性上不妥协。因此,您绝对应该考虑我回答中的第一个项目符号。

您的数据应该安全吗?仅当它是游戏内购买/微交易时-然后为什么不使用HTTPS等经过尝试和真实的东西。出于以下原因,对游戏流量进行加密不太可能是可行的解决方案:

  • 这是完全的妄想症。
  • 除非您可以购买(昂贵的)硬件加密模块,否则这将增加服务器的CPU时间开销。
  • 您可以通过无线方式为数据提供多大的安全性无关紧要-有人可以劫持客户端进程并在消息被加密和发送之前立即拦截消息。这不仅是一种可能性,而且是无限可能的,因为与拦截数据包相比,注入代码实质上更容易。如果您这样做是为了防止作弊,那完全是在浪费时间。
    • 就密码安全性而言,不幸的是,对于被劫持的系统,您无法采取合理的措施,因为客户端已变得敌对。暴雪的WoW加密狗旨在解决此问题-但我不确定这样做的安全性(尤其是如果将其插入电源)。

请,如果你加密了作弊防范放弃它。您很快就会提出-如果您没有,我给了您信息。请记住,您可以通过数据包中的第一个字节有选择地对数据包进行加密,并指示其余数据是否已加密:尽管再次重申,如果您需要执行信用卡交易之类的操作,我会坚持使用HTTPS:它们极少发生并且HTTPS由专家设计-与您或我设计的东西不同。

综上所述,暴雪实际上确实在加密他们的魔兽流量。发生这种情况的主要原因是,可能是一个完全业余爱好者的某人决定尝试使用自己开发的加密算法。这很好地解决了。即使您确实使用了行业标准算法,也很有可能有人会对您的代码进行反向工程并对其进行仿真-一旦客户端输入密码,就不会告诉您连接了不受支持的系统。


2
+1表示加密数据包以防止作弊是没有用的。OP:做验证一切从客户端接收运行完整性检查,仔细检查,如果客户端请求的操作是可能的,检查武器范围,移动速度等,但不要浪费时间保护您的客户端,因为它遭到黑客入侵,如果您的游戏值得。一些MMO公司对他们的客户/协议进行加密和混淆,但这并不是为了防止作弊,而是为了使例如bot创造者更难获得良好的结果,即使这是由专门的专家团队完成的。
Gilead 2012年

1
关于第三个答案的一个小问题:仅加密数据包可能不足以防止篡改,因为许多加密方案至少具有一定的可塑性。为了保护消息的完整性,您需要MAC或经过身份验证的加密模式
Ilmari Karonen 2012年

+1感谢您提供非常完整的答案。目前正在研究实施SRP。您对用于密码的哈希函数有何建议?MD5?这种用例的OTR协议(记录外)如何?它对于auth / crypto而不是SRP会很好吗?如果我使用SRP,是否需要使用以下“经过身份验证的加密”模式之一?(OCB 2.0,Key Wrap,CCM,EAX,Encrypt-then-MAC和GCM)
Robinicks 2012年

1
@Jenko使用SHA系列算法(可能是SHA1)-这些天应该避免使用MD5。OTR确实不是您应该关注的内容-它的设计不是安全/晦涩的(实际上,它的设计目的是使人们可以轻松地伪造数据包),它还设计用于即时消息传递而不是机器通信。不需要这些模式,只需使用SRP:一旦有了相互协商的对称密钥,就能够加密某些东西就足以保证您正在与正确的第三方进行对话。同样,再次阅读我的最后两段。
乔纳森·迪金森

1
实际上,我有一个更好的建议:使用基于UDP的现有DTLS实现,不要尝试自己动手。这样可以节省您的时间,而且如果您尝试设计自己的数据报加密层,则有很多小而关键的细节很容易出错。
Ilmari Karonen 2012年

2

我认为我对乔纳森本来很好的答案的最后评论值得扩展成它自己的答案:

如果您没有太多的加密经验,那么如果可以避免的话,您不应该尝试设计自己的加密层。如果您确实有很多加密经验,那么如果可以避免的话,应该比设计自己的加密层更好地了解。

相反,尝试找到一个可以满足您需求的,经过标准化和测试的加密货币库。在您的情况下,我建议使用GnuTLS根据Wikipedia所述,它既提供TLS-SRP认证(RFC 5054),又提供与DTLS的安全UDP通信(RFC 6347)。前者负责登录,而后者则保护由此形成的安全通道免受窃听和主动攻击,甚至可以保护您免受重放攻击


我正在使用TCP。对于特定客户来说,这是一种截然不同的游戏。类似于赌博/博彩,所有可用于劫持过程的信息都会增加房屋不必要损失的机会。我们需要确保数据非常安全,因为在这种情况下信息就是金钱。
Robinicks 2012年

好的,如果您使用的是TCP,那么它甚至更容易:您可以使用普通的TLS 1.2代替DTLS,这为您提供了更多选择。不过,我仍然建议使用GnuTLS库。
Ilmari Karonen 2012年

我将做一些研究,看看是否可以在客户端和服务器端都引用TLS源代码,并将协议基于其功能。这足够强大吗?本质上,它只是使用某种密码/模式对数据包进行加密,对吗?
Robinicks 2012年

不,TLS协议还有很多其他功能。这就是为什么您要使用实现它的标准库,而不是滚动自己的库。
Ilmari Karonen 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.