基本上,我有一个游戏客户端和一个游戏服务器。
游戏客户端连接到服务器,将其Steam ID发送到服务器。
游戏服务器发现这是一个新的Steam ID,所以它会排成一行并将玩家信息(ip,name,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:之前我提出了一个问题,但我的描述性不够,所以我做了一个新问题。
答案 0 :(得分:1)
如果不知道你问的确切内容,这里有一点思考......
我希望客户先进行一次“握手”#39;与服务器接收“每日盐”的服务器。 (每天生成的32字节哈希)。然后,客户端将获取该盐,加密客户端上的steam_id,并将该数据传输到服务器,然后服务器将其解密并根据您的纯文本数据库进行验证。
但请记住,对于您实际执行的加密,某个地方的人最终会破解您的代码并且能够阻止您的最佳安全防御。
修改强>
这里是LINK W/ SOURCE CODE,它描述了字符串的简单加密。现在代码是在C#中,但是我确信可以将它转换为C ++就好了。
答案 1 :(得分:0)
检查数据完整性的方式通常是使用单向散列函数。这些是给出一些输入(数据,在这种情况下是蒸汽ID)产生哈希值的函数。鉴于此输出,几乎不可能将其解密回原始消息。这是密码编码的方式。密码使用单向散列函数加密。之后,如果攻击者获得此加密密码,则无法将其解密为真实密码。但是,如果用户想要连接,您可以使用哈希函数并检查结果是否与数据库中存储的结果相同。
因此,您可以实现数据的完整性,因为您可以通过单向散列函数传递数据,并将数据与散列值一起发送。另一方面,当收到数据时,您可以使用相同的哈希函数计算哈希值。如果它与消息收到的哈希值相同,则可以确定没有人在其上更改消息。这就是在例如分布式系统中实现数据完整性的方式。
请注意,几乎不可能得到一个散列到相同值的值(因为单向散列函数必须对它的输入非常敏感,只改变一位应该完全改变输出)。
我无法从你的问题中找出答案,但如果在你的情况下是用户自己向你发送他的蒸汽ID,你不能确定它没有改变。因为他会自己计算哈希值......
您可以找到一个很好的解释here。