C++ 通过游戏客户端进行 Steam ID 身份验证

C++ Steam ID authentication via Game Client

本文关键字:Steam ID 身份验证 客户端 游戏 C++      更新时间:2023-10-16

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

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

游戏服务器看到这是一个新的 Steam ID,因此它会做一行并将玩家信息(ip、姓名、蒸汽 ID)添加到玩家表中。

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

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

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

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

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

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

不知道你在问什么的确切程度,这里有一个伪思维......

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

但请记住,对于您实际进行的加密,某个地方的某个人最终会破解您的代码并能够挫败您最好的安全防御。

编辑

这是一个带有源代码的链接,描述了字符串的简单加密。 现在代码是 C# 的,但我相信可以研究它以同样轻松地将其转换为C++。

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

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

请注意,几乎不可能提出一个哈希为相同值的值(因为单向哈希函数必须对其输入非常敏感,仅更改一位应该完全更改输出)。

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

你可以在这里找到一个很好的解释。