编写服务器时如何拆分登录和游戏逻辑?


9

我正在构建一个像游戏服务器这样的扑克,我打算将所有登录名和游戏逻辑都在一个服务器上进行处理,但是从我在网络上的研究中,我了解到这无法扩展,因此拆分是有意义的工作进入登录和游戏服务器。但是,我在登录服务器中处理了身份验证并让客户端与游戏服务器建立了新的连接后,却没得到什么,我怎么知道哪个客户端是哪个?我是否不必再次重新登录并因此而放弃使用服务器进行登录的目的?有没有办法在我不知道的进程和机器之间传递连接?对不起,我对网络的了解很少。


4
YAGNI:您将不需要它。不要实施过早的优化。登录听起来像是游戏中一个非常琐碎的部分,将它拆分不可能带来任何好处。一旦您的游戏拥有了足够多的用户(您应该能够在单个服务器上支持数千名用户,而其他用户仅出于冗余目的),您将能够雇用一些了解这种情况的软件工程师。
MarkR

您接受了一个误导性的答案,您应该仔细考虑一下,否则最终将产生错误的想法,并在代码中产生错误的安全感。
o0'。

我喜欢Kylotan的答案,因为我不需要在游戏服务器和登录服务器之间建立额外的连接,我也可以看到Philip的观点,即秘密密钥的泄露是所有正在运输的帐户的泄露。我将同时实现两种登录版本,并在对代码进行审核时询问安全专家。我的问题似乎很基本,我希望它们将是每个人都同意的标准解决方案。去搞清楚。如果只有安全专家可以参加讨论并做出决定。
user342580 2013年

严格来说,在您的服务器之间传递登录令牌会更安全,只要您有一个安全的渠道即可执行此操作。实施起来也比较困难,这会增加您出错的风险。除非有人可以掌握您的秘密密钥,否则基于哈希的消息身份验证系统应该是绝对安全的-如果他们可以通过访问您的内部系统来掌握您的密钥,那么您将无法通过发送登录名来解决问题手动标记。
Kylotan

Answers:


3

尽管Philipp的回答非常好,但是在登录服务器和游戏服务器之间不需要连接的方式略有不同,如果这种连接很困难,则很有用。

  1. 当用户在登录服务器上成功进行身份验证时,将如上所述向他们发送游戏服务器地址和登录令牌。但是,此令牌由两部分组成:登录服务器上的时间,该数字的哈希值加上其用户名,其IP地址,游戏服务器的IP地址或ID,以及只有您自己知道的密钥。
  2. 客户端尝试通过发送此令牌登录到提供的游戏服务器。服务器根据登录令牌中的信息加上其自己的IP地址/ ID和密钥,形成与以前相同的哈希。如果此哈希值与令牌中的哈希值匹配,则说明播放器已正确验证。然后检查日期是否太旧(例如超过1分钟)。

之所以有效,是因为:

  • 该日期将过期,因此无法复制和重复使用。
  • 如果不知道秘密密钥,就不能在没有全新登录的情况下构造它。
  • 因为原始IP地址是用来构造它的,所以它很难被其他人截获(例如,使用数据包嗅探器)并被使用。
  • 不能将其用于其他帐户,因为用户名构成哈希的一部分。
  • 它不能用于在不同游戏服务器上的并发登录,因为服务器的ID / IP地址构成哈希的一部分。

或者更简单地说,哈希确保发送者几乎不可能伪造其登录令牌,因此令牌中的信息可以被信任。

与任何面向安全的哈希一样,使用可能获得的最佳哈希函数(目前人们似乎喜欢bcrypt,PBKDF2和scrypt),并确保您的秘密密钥很长,从而使暴力破解变得不切实际。


非常聪明,我更喜欢这种解决方案。那么我的问题就是密钥。应该像密码短语还是其他东西?对于每个用户,它应该有所不同吗?
user342580 2013年

这是行不通的,或者实际上是@Philipp答案的隐藏重新实现。它失败,因为它假定登录服务器和游戏服务器都知道相同的密钥。如果他们俩都知道密钥,则其中之一必须联系另一方以提供密钥。或者您需要第三方将其发送给双方。无论哪种方式,它都像以前一样可闻。
o0'。

@Lohoris,想法是您同时拥有登录名和游戏服务器,并可以向他们提供密钥。如果您没有同时拥有这两个服务器,那么游戏服务器又如何才能信任登录服务器的身份验证?
Kylotan

@ user342580:我会使用某种长短语。每个用户不必有区别,但是如果确实如此,那不会有什么坏处。只要加密散列功能足够强大并且您定期更改它就没关系。
Kylotan

正是@Kylotan,您如何为他们提供密钥?为什么您认为从您到服务器的连接比从服务器到服务器的连接更安全?
o0'。

8
  1. 用户对登录服务器进行身份验证之后,给它一个令牌(一个唯一的,随机生成的字符串,时间太长,无法猜测)。

  2. 登录服务器选择一个游戏服务器。从登录服务器向其选择的服务器发送令牌,用户名和有关用户的所有其他相关数据。

  3. 将令牌和游戏服务器的主机名发送到客户端。然后从登录服务器断开连接。

  4. 然后,客户端使用其用户名和令牌连接到游戏服务器。

  5. 当来自客户端的令牌与登录服务器刚刚报告的令牌匹配时,您接受它。

请注意,为确保此安全,需要从加密安全的随机数生成器创建令牌,每个令牌只能被游戏服务器接受一次,并且未使用的令牌应在几分钟后丢弃。


那么使用bcrypt就足够了吗?我正在考虑使用bcrypt从时间+用户名+密码的哈希创建令牌。
user342580 2013年

我想会的。知道密码时,您可能会猜出一个令牌,但是当您知道密码时,就可以以正常方式登录。
Philipp

1
只要输入适当地是随机且不可输入的,bcrypt就可以工作。如果仅使用时间,则攻击者可以尝试预测时间,然后运行bcrypt并获取令牌。确保在时间上使用秘密盐或安全的随机化器(例如UNIX / Linux系统上的/ dev / random)。
肖恩·米德迪奇

该密码可能已在另一个站点上被盗用,所以我避免假定它是一个适当的秘密。
肖恩·米德迪奇

1
@SeanMiddleditch密码泄露时,无论如何安全性都会丢失。获得密码的攻击者没有理由猜测令牌,因为他可以通过以常规方式登录来获取令牌。
Philipp
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.