【问题标题】:How to make sure mySQL database takes values only from my game?如何确保 mySQL 数据库仅从我的游戏中获取值?
【发布时间】:2018-04-17 11:12:05
【问题描述】:

我用 Java 编写了一个简单的类似蛇的游戏。我想将高分用户存储在数据库中,因此我创建了一个 mySQL 数据库。我面临的问题是让程序连接到 mySQL 数据库而不泄露登录信息,这将允许用户弄乱数据库。我已经研究过了,每个人都建议在游戏和 SQL 数据库之间建立一个 Web 服务。但是问题仍然存在,任何人都可以提供可能再次弄乱数据库的数据。

我想到的一个选项是将 jar 文件与数据一起上传到 Web 服务。然后,Web 服务获取散列值(正在查看 SAH 512)并将其与假设获取的散列值进行比较,如果匹配则继续。但是随后有人可以对我的游戏进行逆向工程并稍微更改代码并发送原始游戏文件,但将不同的 NAME+SCORE 发送到数据库。同样让人们不断将文件上传到网络服务对我的网络来说是一个巨大的痛苦,因为考虑到我使用的是家庭网络,它只能处理这么多。

我可以用密码加密一些文件,但由于程序能够解密它,那么用户肯定能够解密它并获得信息。

基本上无论如何,我为程序提供了我的数据库的密钥,某人将能够对其进行逆向工程并对其进行编辑,以便他们能够访问我的数据库。这就是我背后的想法。无论如何,我为程序提供了一种访问数据库的方法,如果有人愿意,他们也可以使用这种方式来弄乱数据库。

我必须有一种方法能够将我的游戏中的信息存储到 mySQL 数据库中,并确保没有人能够改变它周围的东西,而只有我制作的程序能够。以某种方式隐藏服务或某事背后的细节。其他人到底是怎么做到的?我能得到一些指导吗?欢迎任何想法。

【问题讨论】:

    标签: mysql database security encryption hash


    【解决方案1】:

    通常,应用程序不应直接连接到数据库,而是调用具有数据库访问权限的服务器。

    【讨论】:

    • 是的,但是服务器如何知道程序是否是它应该是的人?有人可以对我的游戏进行逆向工程并稍微更改代码,然后开始与服务器通信,就好像他们是游戏一样。然后他们可以开始弄乱数据库。您需要一种方法让服务器能够识别游戏并确保请求是可信的。
    【解决方案2】:

    事实上,你不能得到保证。始终可以反编译应用程序并更改其行为。

    如果您接受此限制,则可以通过使用中间层(Web 服务)来保证一定级别的安全性。在这里,您可以通过放置在应用程序中的用户证书来保证安全传输层 (SSL) 和可信赖的登录。您还可以为发送的数据添加数字签名。

    这将为您提供一个相当可靠的系统,其钻孔需要反编译应用程序。

    【讨论】:

      【解决方案3】:

      这是一个古老的问题,没有简单的解决方案。有些场景可以解决,有些则不能。

      基本规则是,您在客户端中执行的任何操作在安全性方面几乎毫无用处。正如您所说,任何人都可以反编译和分析您的客户端代码,获取任何秘密等等。用户可以完全控制客户端,因此您不能信任客户端发送的数据(分数)。

      因此,您需要一个服务器端解决方案,而这正是它开始变得有趣的地方。您实际上可以做的是您可以将整个游戏流程(所有事件)发送到服务器,以便能够完全(或至少部分)重建发生的事情 - 服务器端。分数甚至不需要发送,您可以根据游戏在客户端的运行情况计算它。

      对于单人技能游戏,这无济于事,用户仍然可以像玩得很好一样构建整个流程。但一方面,这比仅仅伪造分数要困难得多,另一方面,可能有比赛,提出解决方案才是重点。尤其是对于 NP 难的游戏,找到解决方案确实是诀窍,验证很容易。

      同样对于多人游戏,这会有所帮助,因为如果所有玩家都提交了流程,那么收到的流程必须匹配,否则就会出现作弊者(或者所有玩家都是作弊者,或者同一个作弊者正在与所有玩家一起玩,但你应该能够通过其他方式防止这种情况发生)。

      如果你掌握了整个游戏的流程,你还可以实施其他的反作弊技巧,比如如果它是一个技能游戏,你可以尝试寻找看起来超人的动作。它永远不会是完美的,那么困难就是不将合法玩家标记为作弊者。

      【讨论】:

        【解决方案4】:

        这取决于一点......

        一个至少会让想要弄乱你的游戏的人更难的例子可能是这样的:

        如果您的游戏在程序上生成内容,存储并传输初始种子...那么不要只传输分数和名称...

        存储和传输导致特定分数的所有玩家决定

        让您的服务器根据提供的种子和决策重播游戏,并获取在服务器上计算的分数

        所以...要获得分数,您需要解决游戏(或自动解决此问题)

        这种方法确实使伪造分数变得更加困难,但它不会将名称和分数绑定在一起(您可以稍后提交相同的分数但名称不同......)

        补充一点,你可以进一步改变一些事情:

        在线分数需要在线游戏...

        游戏开始时,询问玩家姓名...

        将该名称发布到服务器,以获取 HMAC(哈希消息身份验证代码)安全令牌,其中包含一个 ID(考虑一个 GUID)和服务器生成的起始种子

        服务器存储名称和 ID,并在每个时间跨度和 IP 分配有限数量的令牌

        令牌在时间跨度 x 内有效,之后如果在该时间跨度内没有“使用”,您可以将其删除

        当玩家完成游戏后,您可以将此令牌连同玩家的决定一起提供给服务器

        服务器知道玩家是谁,并且可以重新创建最终的游戏状态并找到分数

        这样的系统并不能防止所有形式的作弊,但它们通常并不难实现,并且至少需要攻击者多花一点力气,从而过滤掉脚本小子

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-15
          • 1970-01-01
          • 1970-01-01
          • 2019-11-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多