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

我正在为我正在开发的新的多人游戏实现一个自定义的二进制协议。 它是一个基于回合的战略游戏,所以计时并不重要。 我目前已经完成了系统的基本数据同步部分,我想知道如何通常为MMORPG游戏或类似的用户login/注销和encryption

  • 你可以推荐一个安全/秘密密码传输的scheme在login? (Diffie-Hellman密钥交换?)
  • 我如何实现数据包的强encryption? (AES 128位?或者这个post中提到的“encryption比你更可能破解的任何scheme”)
  • 是否有数据报格式的scheme,有助于加强游戏服务器重播攻击,无效数据包等?

答案

  • SRP – 安全远程密码 – 这是基于Diffie-Hellman。 这个想法是,你可以做一个相互的密码检查,而不需要传输密码或任何可以用来派生的信息。 即使通过电线安全,您仍然应该散列和密码, 因为您的服务器绝不能以纯文本格式存储它们 。
  • SRP的优点是一旦完成,它也给了你一个相互协商的encryption密钥,攻击者在你传送的数据中是无法推断出来的。 这意味着一旦用户通过validation,您就可以自由使用对称encryptionalgorithm(如AES)。
  • 假设你正在使用你自己的可靠/有序的(面向连接)实现的UDP:encryption整个UDP播放 – 包括你的'数据包序列号'。 如果你的系统devise正确,它会自动拒绝重播的消息,入侵者将无法改变数据包序列号,因为它是encryption的(因此重播是可能的 – 但它会被自动忽略)。

思考

您的身份validation应该安全吗? 绝对。 在密码有问题的情况下,不要在安全方面妥协。 因此,你应该肯定会考虑我答案中的第一个项目符号。

你的数据应该安全吗? 只有在游戏内购买/微型交易时 – 那么为什么不只是使用像HTTPS这样的尝试和真实的东西。 由于以下原因,encryption游戏stream量不太可行:

  • 这是完全的偏执狂。
  • 除非您可以购买(昂贵的)硬件encryption模块,否则会在您的服务器上增加CPU时间开销。
  • 无论您通过networking为您的数据提供多less安全性 – 在encryption和发送数据之前,有人可以劫持客户端进程并截获消息。 这不仅是一种可能性,而且是无限可能的,因为与截取数据包相比,它更容易注入代码。 如果你这样做是为了防止欺骗,你完全和彻底浪费你的时间。
    • 在密码安全方面,不幸的是,对于被劫持的系统,没有任何合理的做法,客户端已经变得敌对。 暴雪魔兽encryption狗的devise就是为了解决这个问题 – 但是我不确定它是多么的安全(尤其是如果你把它插入的话)。

请,如果你正在encryption作弊预防放弃它。 你会短暂的 – 如果你不是,我给你提供了相关信息。 请记住,您可以select性地对数据包中的第一个字节进行encryption,并指示其余部分是否encryption:尽管如此,如果您需要执行信用卡交易等操作,我仍然坚持使用HTTPS:它们极less出现, HTTPS是由专家devise的 – 不像你或我devise的东西。

所有这一切,暴雪确实encryption了他们的WOWstream量。 这个打破的主要原因是因为某个可能是一个完整的业余爱好者的人决定尝试使用自制的encryptionalgorithm; 这真的很好 。 即使您使用行业标准algorithm,也有人很有可能会对您的代码进行逆向工程并进行模拟 – 一旦客户端input了密码,就不会说出不支持的系统连接。

我认为,我最后对乔纳森的另一个非常好的答案的评论是值得扩展到自己的答案:

如果你没有很多encryption经验,那么你不应该设法devise自己的encryption层。 如果你有很多encryption经验,你应该知道,如果你能避免它,devise你自己的encryption层。

相反,尝试find一个现有的,标准化的,经过充分testing的encryption库,可以满足您的需求。 在你的情况下,我会推荐GnuTLS , 根据维基百科 ,它提供了TLS-SRPauthentication( RFC 5054 )和DTLS ( RFC 6347 )的安全UDP通信。 前者负责login,而后者则保护由此形成的安全通道不受窃听和主动攻击,甚至可以保护您免受重播攻击 。