Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保mySQL数据库只从我的游戏中获取值?_Mysql_Database_Security_Encryption_Hash - Fatal编程技术网

如何确保mySQL数据库只从我的游戏中获取值?

如何确保mySQL数据库只从我的游戏中获取值?,mysql,database,security,encryption,hash,Mysql,Database,Security,Encryption,Hash,我用Java编写了一个简单的蛇形游戏。我想在数据库中存储用户的高分,因此我创建了一个mySQL数据库。我面临的问题是让程序连接到mySQL数据库而不泄漏登录信息,这将允许用户破坏数据库。我已经研究过了,每个人都在游戏和SQL数据库中间提出了一个Web服务。然而,问题仍然存在,任何人都可以提供数据,这会再次扰乱数据库 我想到的一个选择是将jar文件与数据一起上传到web服务。然后,web服务获取散列值(查看SAH 512),并将其与假定获取的散列值进行比较,如果匹配,则继续。但是,有人可以对我的游

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

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

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

基本上,不管怎样,我为程序提供了一个数据库密钥,有人可以对其进行反向工程和编辑,以便他们能够访问我的数据库。这就是我的想法。无论如何,我为程序提供了一种访问数据库的方法,如果有人愿意,他们也可以使用这种方法来破坏数据库


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

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

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

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


这将为您提供一个相当可靠的系统,该系统需要对应用程序进行反编译。

这是一个由来已久的问题,没有简单的解决方案。对于某些场景,它可以解决,但对于其他场景,它无法解决

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

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

对于单人技能游戏,这没有帮助,用户仍然可以构建整个流程,就像他玩得非常好一样。但一方面,这比伪造分数要困难得多,另一方面,可能会有游戏,提出解决方案才是关键。特别是对于NP难的游戏,找到解决方案确实是一个技巧,验证它很容易

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

如果你掌握了整个游戏流程,你还可以实施其他反作弊技术,例如,如果这是一个技能游戏,你可以尝试找到看起来超级人性化的动作。它永远不会完美,那么困难就不是把合法玩家标记为骗子。

这取决于一点

一个至少会让想要破坏你游戏的人变得更难的例子是:

如果您的游戏正在按程序生成内容,请存储并传输初始种子。。。然后,不要只发送分数和名称

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

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

所以。。。要伪造分数,您需要解决游戏(或自动解决此问题的方法)

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

要补充一点,您可以进一步改变:

在线分数需要在线游戏

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

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

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

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

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