【问题标题】:C++ Steam ID authentication via Game Client通过游戏客户端进行 C++ Steam ID 身份验证
【发布时间】:2016-02-14 03:10:39
【问题描述】:

所以基本上,我有一个游戏客户端和一个游戏服务器。

游戏客户端连接到服务器,将其 Steam ID 发送到服务器。

游戏服务器看到这是一个新的 Steam ID,因此它创建一行并将玩家信息(ip、名称、steam id)添加到玩家表中。

游戏服务器可以通过 Steam ID 禁止玩家。所以下次玩家连接时,服务器会检查他们的 Steam ID 并在表中显示一个。如果它找到一个并且该 Steam ID 被禁止,请断开播放器。

游戏服务器知道玩家 Steam ID 的唯一方法是让玩家使用 Steam API 并通过与 Steam 建立的会话检索他的 Steam ID,然后将其作为字符串发送到游戏服务器。

但是,我有一个问题。仅仅发送 Steam ID 并不安全,因为被封禁的玩家可以简单地将发送到服务器的数据包修改为另一个 Steam ID,从而“解封”他们。

有什么安全的方法可以向我的游戏服务器发送 Steam ID 字符串之类的内容,并让服务器判断它是否已被修改或是否按照游戏客户端的预期发送?

我的游戏客户端使用 Game Maker: Studio,而我的游戏服务器使用 C++

PS:我之前提过一个问题,但我的描述性不够,所以我提出了一个新问题。

【问题讨论】:

  • (我记得你的最后一个问题。)真的,你需要发布一些代码,否则这属于其他堆栈网络之一。
  • 什么代码?我现在所做的只是向服务器发送一个字符串(Steam ID),服务器接收到该字符串并假设它没有被修改。
  • stackoverflow 用于编程问题/答案。我相信你应该在服务器故障上问这个。

标签: c++ encryption server


【解决方案1】:

在不知道你所问的确切内容的情况下,这里有一点假想......

我会让客户端首先与服务器进行“握手”,服务器会在该服务器接收“每日盐”(每天生成的 32 字节散列)。然后,客户端将获取该盐,加密客户端上的 steam_id,并将该数据传输到服务器,然后服务器将对其进行解密并根据您的明文数据库对其进行验证。

但是请记住,尽管您实际进行了尽可能多的加密,但最终会有人在某个地方破解您的代码并能够挫败您最好的安全防御。

编辑

这是一个LINK W/ SOURCE CODE,它描述了一个简单的字符串加密。现在代码是用 C# 编写的,但我确信可以研究它以将其转换为 C++ 一样容易。

【讨论】:

  • 谢谢!你有推荐的盐法吗?
  • 不谈细节,因为你可以找到自己的真正方法——尝试创建一个包含当前日期的盐,一些随机生成的十六进制数(最好是 32 字节),然后你可以做一个 md5/sha1/combo-there-of 哈希存储在您的数据库中。很高兴我能提供帮助,但正如上面评论的那样,如果没有特定的代码,stackoverflow 可能不是最好的地方。 ;)
  • 我在上面编辑了我的答案,以反映您可以在服务器和客户端之间使用基本加密的一种方式。
【解决方案2】:

检查数据完整性的方法通常是使用单向哈希函数。这些是给定一些输入(数据,在本例中为蒸汽 ID)产生哈希值的函数。鉴于此输出,几乎不可能将其解密回原始消息。这就是密码的编码方式。密码使用单向哈希函数加密。之后,例如,如果攻击者获得此加密密码,他就无法将其解密为真实密码。但是,如果用户想要连接,您可以使用哈希函数并检查结果是否与存储在数据库中的结果相同。

因此,您可以实现数据的完整性,给定数据,您可以将其通过单向哈希函数并将数据与哈希值一起发送。另一方面,当接收到数据时,您可以使用相同的散列函数计算散列值。如果它与消息中收到的散列值相同,则可以确定没有人在此过程中更改消息。这就是在分布式系统中实现数据完整性的方式。

请注意,几乎不可能得出一个散列到相同值的值(因为单向散列函数必须对其输入非常敏感,只更改一位就应该完全改变输出)。

我无法从您的问题中弄清楚,但如果在您的情况下是用户本人向您发送他的 Steam ID,您无法确定它没有被更改。因为他会自己计算哈希值……

你可以找到一个很好的解释here

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 2019-06-21
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多