Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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
在Flash/PHP游戏中(半)确保高分的建议_Php_Flash_Actionscript 3_Actionscript - Fatal编程技术网

在Flash/PHP游戏中(半)确保高分的建议

在Flash/PHP游戏中(半)确保高分的建议,php,flash,actionscript-3,actionscript,Php,Flash,Actionscript 3,Actionscript,…我在这里读了一些讨论各种方法的帖子,只是想就我们提出的解决方案寻求一些反馈。在其中一条帖子中,有人发表了一条评论,建议使用一个听起来很棒的公钥/私钥,这就是我们所想的 客户端- 1.密钥存储在使用第三方工具加密的Flash swf内。 2.高分与高分值一起散列,例如:md5“ourSecretKey”+200 3.该值通过AMF发送到服务器上的PHP脚本,并带有高分200 服务器端- 1.服务器接收数据并对存储在服务器上以及闪存中的已通过的高分200+密钥“ourSecretKey”进行散列,

…我在这里读了一些讨论各种方法的帖子,只是想就我们提出的解决方案寻求一些反馈。在其中一条帖子中,有人发表了一条评论,建议使用一个听起来很棒的公钥/私钥,这就是我们所想的

客户端- 1.密钥存储在使用第三方工具加密的Flash swf内。 2.高分与高分值一起散列,例如:md5“ourSecretKey”+200 3.该值通过AMF发送到服务器上的PHP脚本,并带有高分200

服务器端- 1.服务器接收数据并对存储在服务器上以及闪存中的已通过的高分200+密钥“ourSecretKey”进行散列,并根据已通过的散列检查值是否匹配。如果允许输入高分,则失败

我知道这不是一个万无一失的解决方案,但这是可以接受的吗?我的意思是,对于一个简单的在线Flash游戏来说,这在高分表单上是否足够安全?想法


提前谢谢你

对于一个短得离谱的值,即:值<64个字符,由于彩虹表攻击,作为散列的MD5变得无效,并且由于您发送的值将通过网络共享,他们所要做的就是强制执行共享秘密,并且他们有一个已知的产品可以使用

因此,这不是公钥-私钥。这是一个令人愉快的共同秘密

另外,请记住,这个共享的秘密将在您发送给用户的flash文件中,这些文件现在可以被简单地分解,然后您的秘密就不再是秘密了

您需要一种更具挑战性的响应机制,该机制具有适当的加密签名,其中服务器为每个游戏分配一个新的签名密钥,并且不能使用同一签名密钥提交多个分数。额外保护

用户开始游戏。请求签名密钥。签名密钥是由他们无法访问的另一个密钥生成的。 分数用签名键签名,然后发送 您可以使用发送的密钥验证符号的值。 您将丢弃发送给他们的签名密钥。
然而,你仍然有一个问题,你没有办法防止实际的评分系统被篡改。一些足够聪明的人可以对你的SWF对象进行反向工程,并注入新代码,将分数设置为他们选择的值

对于一个短得离谱的值,即:值<64个字符,由于彩虹表攻击,作为散列的MD5变得无效,并且由于您发送的值将通过网络共享,他们所要做的就是强制执行共享秘密,并且他们有一个已知的产品可以使用

因此,这不是公钥-私钥。这是一个令人愉快的共同秘密

另外,请记住,这个共享的秘密将在您发送给用户的flash文件中,这些文件现在可以被简单地分解,然后您的秘密就不再是秘密了

您需要一种更具挑战性的响应机制,该机制具有适当的加密签名,其中服务器为每个游戏分配一个新的签名密钥,并且不能使用同一签名密钥提交多个分数。额外保护

用户开始游戏。请求签名密钥。签名密钥是由他们无法访问的另一个密钥生成的。 分数用签名键签名,然后发送 您可以使用发送的密钥验证符号的值。 您将丢弃发送给他们的签名密钥。
然而,你仍然有一个问题,你没有办法防止实际的评分系统被篡改。一些足够聪明的人可以对你的SWF对象进行反向工程,并注入新代码,将分数设置为他们选择的值

你的问题的答案是,视情况而定。这主要取决于你的游戏的受欢迎程度

从安全性的角度来看,您的解决方案与以明文发送高分一样安全。你在这里所做的被称为默默无闻的安全,根据你所听的人的说法,在某些情况下可能会有好处。在这种情况下,普通用户Joe可能无法自己破解它。对于任何具有l33t H4XOR技能的人,您最好将其全部以明文形式发送。如果你只想阻止Joe,那么这可能就足够了,至少在有人为Joe创建一个假客户端供其下载之前,这取决于你的游戏的流行程度,可能需要几天的时间,如果是WoW的话,可能需要几天的时间,甚至更快

一个更好的解决方案是@Kent Fredric给出的。然而,正如它所说,这并不能解决有人创造一个假客户的问题。解决方案可能是这样的:

给玩家可以执行的每个动作一个id。 将玩家执行的每个动作存储在ID列表中。 游戏结束后,散列分数、操作列表,并使用从服务器接收的公钥对其进行加密。详见肯特·弗雷德里克的帖子 发送更常见的加密散列 向服务器发送数字签名以及分数和执行的操作列表。 让服务器根据列表中的操作玩游戏。 验证是否获得了相同的分数。 验证数字签名是否正确。 更新服务器高分列表。 这将保证两件事:

分数来自正确的客户。 就比赛而言,分数是正确的。 但是这个计划仍然有一个严重的缺陷。没有办法知道这个游戏实际上是在玩。如果客户端遭到破坏,列表可能只是发送到服务器的完美游戏的预制。直接篡改计分系统是不可能的,但只要付出足够的努力,很可能有人就能创建一个包含完美游戏的动作列表

然而,它提供了比在肯特·弗雷德里克的帖子中使用解决方案更有力的保证。要解决整个问题,您必须以某种方式验证客户端。这是非常困难的,因为大多数这样做的方法很容易规避


最后,我不得不对您选择的散列算法进行评论:对于那些仍然生活在90年代的人来说,MD5是一个很棒的散列算法。对于我们其余的人,我推荐SHA-2或至少SHA-1。

你的问题的答案是,这取决于你。这主要取决于你的游戏的受欢迎程度

从安全性的角度来看,您的解决方案与以明文发送高分一样安全。你在这里所做的被称为默默无闻的安全,根据你所听的人的说法,在某些情况下可能会有好处。在这种情况下,普通用户Joe可能无法自己破解它。对于任何具有l33t H4XOR技能的人,您最好将其全部以明文形式发送。如果你只想阻止Joe,那么这可能就足够了,至少在有人为Joe创建一个假客户端供其下载之前,这取决于你的游戏的流行程度,可能需要几天的时间,如果是WoW的话,可能需要几天的时间,甚至更快

一个更好的解决方案是@Kent Fredric给出的。然而,正如它所说,这并不能解决有人创造一个假客户的问题。解决方案可能是这样的:

给玩家可以执行的每个动作一个id。 将玩家执行的每个动作存储在ID列表中。 游戏结束后,散列分数、操作列表,并使用从服务器接收的公钥对其进行加密。详见肯特·弗雷德里克的帖子 将加密的散列(通常称为数字签名)连同分数和执行的操作列表一起发送到服务器。 让服务器根据列表中的操作玩游戏。 验证是否获得了相同的分数。 验证数字签名是否正确。 更新服务器高分列表。 这将保证两件事:

分数来自正确的客户。 就比赛而言,分数是正确的。 但是这个计划仍然有一个严重的缺陷。没有办法知道这个游戏实际上是在玩。如果客户端遭到破坏,列表可能只是发送到服务器的完美游戏的预制。直接篡改计分系统是不可能的,但只要付出足够的努力,很可能有人就能创建一个包含完美游戏的动作列表

然而,它提供了比在肯特·弗雷德里克的帖子中使用解决方案更有力的保证。要解决整个问题,您必须以某种方式验证客户端。这是非常困难的,因为大多数这样做的方法很容易规避

最后,我不得不对您选择的散列算法进行评论:对于那些仍然生活在90年代的人来说,MD5是一个很棒的散列算法。对于我们其他人,我推荐SHA-2或至少SHA-1

大宗报价 最后,我不得不对您选择的散列算法进行评论:对于那些仍然生活在90年代的人来说,MD5是一个很棒的散列算法。对于我们其他人,我推荐SHA-2或至少SHA-1

呸,我知道我应该提到沙:

如果我真的使用swf加密程序之类的应用程序来加密swf代码,这至少会使获取存储在Flash中的密钥变得更加困难吗?我认为,如果没有这个密钥,或者至少不容易获得它,那么要弄清楚是什么用于生成发送到服务器的散列将是一个巨大的痛苦

这就是我当时的想法:

再次感谢大家的回答,这非常有帮助。哦,这将只是一个简单的Flash游戏,由客户发送给客户,这是一件有趣的事情,可以在假期的工作中打发时间

大宗报价 最后,我不得不对您选择的散列算法进行评论:对于那些仍然生活在90年代的人来说,MD5是一个很棒的散列算法。对于我们其他人,我推荐SHA-2或至少SHA-1

呸,我知道我应该提到沙 相反:

如果我真的使用swf加密程序之类的应用程序来加密swf代码,这至少会使获取存储在Flash中的密钥变得更加困难吗?我认为,如果没有这个密钥,或者至少不容易获得它,那么要弄清楚是什么用于生成发送到服务器的散列将是一个巨大的痛苦

这就是我当时的想法:


再次感谢大家的回答,这非常有帮助。哦,这将只是一个简单的Flash游戏,由客户发送给客户,这是一件有趣的事情,可以在假期的工作时间里打发时间。

如果你的游戏发行量有限,而且没有真正的金钱/奖金让玩家赢,那么你最初的计划可能就足够了

使用SWF Encrypt可能会使提取密钥变得更加困难,甚至在更高级的系统中也可以使用它。但是,如果你有一个真正的公钥/私钥方案,例如RSA,这确实是一个没有意义的问题,因为公钥不是秘密,也不应该是秘密。尽管如此,为了防止大多数人编辑代码和篡改评分系统,SWF Encrypt可能是一个足够好的选择

为了让你更偏执一点,我还写了以下内容:

与大多数其他类似工具一样,SWF Encrypt的问题在于,它必须仍然能够在可能受损的机器上执行脚本。因此,所有信息必须在所述机器上可用。将其与加密的经典用法进行比较,即发送消息:

当您发送加密消息时,您通常信任源和目标,因此它们都具有解密消息的密钥。你不信任的是信使,或者至少你的敌人不会拦截信使。所以快递员没有钥匙,你的邮件是安全的

你的问题是,在你的情况下,你信任的是你的目的地,而不是客户的来源,反之亦然。你仍然需要消息源来加密消息,因为你更不信任信使。因此,源代码需要拥有加密和解密消息的所有信息才能正常工作。你的问题是,你看不到好消息来源和坏消息来源之间的区别

我的意思是,由于代码必须仍然可以在客户机上运行,所以这样做的信息必须是完全可用的,尽管可能以模糊的形式。例如,黑客可以创建自己的ActionScript编译器,将模糊的ActionScript代码转换为可读的代码,并进行适当的更改。困难但绝对可行


然而,如果你的游戏发行量有限,而且没有真正的奖金可供赢取,那么这种复杂的攻击水平对你来说很可能不是问题。

如果你的游戏发行量有限,并且没有真正的金钱/奖金可供玩家赢取,那么你最初的计划可能就足够了

使用SWF Encrypt可能会使提取密钥变得更加困难,甚至在更高级的系统中也可以使用它。但是,如果你有一个真正的公钥/私钥方案,例如RSA,这确实是一个没有意义的问题,因为公钥不是秘密,也不应该是秘密。尽管如此,为了防止大多数人编辑代码和篡改评分系统,SWF Encrypt可能是一个足够好的选择

为了让你更偏执一点,我还写了以下内容:

与大多数其他类似工具一样,SWF Encrypt的问题在于,它必须仍然能够在可能受损的机器上执行脚本。因此,所有信息必须在所述机器上可用。将其与加密的经典用法进行比较,即发送消息:

当您发送加密消息时,您通常信任源和目标,因此它们都具有解密消息的密钥。你不信任的是信使,或者至少你的敌人不会拦截信使。所以快递员没有钥匙,你的邮件是安全的

你的问题是,在你的情况下,你信任的是你的目的地,而不是客户的来源,反之亦然。你仍然需要消息源来加密消息,因为你更不信任信使。因此,源代码需要拥有加密和解密消息的所有信息才能正常工作。你的问题是,你看不到好消息来源和坏消息来源之间的区别

我的意思是,由于代码必须仍然可以在客户机上运行,所以这样做的信息必须是完全可用的,尽管可能以模糊的形式。例如,黑客可以创建自己的ActionScript编译器,将模糊的ActionScript代码转换为可读的代码,并进行适当的更改。困难但绝对可行

然而,这种复杂程度的攻击对您来说很可能不是问题
,如果你有一个有限的发行量并且没有真正的奖金可以赢得。

我不认为使用这个解决方案有任何好处,Kent提到。 作为客户机,我可以请求服务器端创建的密钥。好的,我不能用它超过一次,但我不必。。。每次我需要一个,我只是要求它

所以我要钥匙。 取得我自己的高分 用键散列高分。 将高分发送到服务器 服务器使用提交的密钥获取高分。
肯特提到,我不认为使用这种解决方案有什么好处。 作为客户机,我可以请求服务器端创建的密钥。好的,我不能用它超过一次,但我不必。。。每次我需要一个,我只是要求它

所以我要钥匙。 取得我自己的高分 用键散列高分。 将高分发送到服务器 服务器使用提交的密钥获取高分。 哇

相当难的解决办法8

我曾经实现过这样的系统。虽然它不适用于每一场比赛

你应该在服务器上重播游戏。当用户玩游戏时-您存储状态更改,然后以某种重播模式将其提供给您的游戏。

相当难的解决办法8

我曾经实现过这样的系统。虽然它不适用于每一场比赛


你应该在服务器上重播游戏。当用户播放时-您存储状态更改,然后以某种重播模式将其发送给您的游戏。

有一种而且只有一种100%加密分数的工作方式:记录重播。 但不仅仅是任何重播,理想情况下,您应该只记录用户按键和按键之间的间隔。这样,即使有人篡改了源代码或动态修改了RAM,在服务器上播放的重播也会发现问题。 不幸的是,这个解决方案需要大量的工作才能实现。为简单起见,您可以手动验证所有分数或最佳分数,您会感到高兴。尽管如此,您仍然必须避免一些事情:

默认随机生成器,您需要种子生成器,该生成器始终为给定种子提供相同的随机数; 没有三角洲时间,对不起; 自定义三角函数我不是100%确定,我曾经听说它们可以在不同的计算机上给出稍微不同的结果; 还有可能更多。
然而,这种防御是牢不可破的。并且需要时间来编码:D.

有一种而且只有一种100%加密分数的工作方式:记录重播。 但不仅仅是任何重播,理想情况下,您应该只记录用户按键和按键之间的间隔。这样,即使有人篡改了源代码或动态修改了RAM,在服务器上播放的重播也会发现问题。 不幸的是,这个解决方案需要大量的工作才能实现。为简单起见,您可以手动验证所有分数或最佳分数,您会感到高兴。尽管如此,您仍然必须避免一些事情:

默认随机生成器,您需要种子生成器,该生成器始终为给定种子提供相同的随机数; 没有三角洲时间,对不起; 自定义三角函数我不是100%确定,我曾经听说它们可以在不同的计算机上给出稍微不同的结果; 还有可能更多。
然而,这种防御是牢不可破的。并花时间编写代码:D.

对源代码不受信任的基本原则有很好的评论。对源代码不受信任的基本原则有很好的评论。请注意,这篇文章已经发表了几年,事情一直在发生。MD5现在被认为已经完全崩溃了。请注意,这篇文章已经有几年的历史了,事情一直在发生。MD5现在被认为是完全失败的。这个方案可以通过让服务器决定并发送每个游戏的随机种子来进一步改进。例如,客户端告诉服务器它想玩。服务器说,好的,玩由seed nn启动的游戏。然后,当客户端想要上传高分时,服务器会检查高分是否确实是针对游戏nn的。即使这个方案也可以被黑客攻击,但整个游戏需要重新设计。工程和重建。这是可以做到的,并且适用于一些使用此方案的流行游戏。是的,当然,客户端可能仍然可以对操作列表进行暴力置换,以找到产生理想分数的序列,但这样至少可以将生成假分数所需的计算复杂度从O1提高到^3上的某个级别,为了找到合适的分数,必须使用暴力置换,这至少会让真正的业余玩家远离游戏,他们会转而使用botting。这个方案可以通过让服务器决定并为每一场游戏发送随机种子来进一步改进。例如,客户端告诉服务器它想玩。服务器说,好的,玩由seed nn启动的游戏。然后,当客户端想要上传高分时,服务器会检查高分是否确实是针对游戏nn的。即使这个方案也可以被黑客攻击,但整个游戏需要重新设计。工程和重建。哪个可以是唐
是的,当然,客户端可能仍然可以对动作列表进行暴力置换,以找到产生理想分数的序列,但这样至少可以将生成假分数所需的计算复杂度从O1提高到^3上的某个值,为了找到合适的分数,必须使用暴力置换,这至少会让真正的业余玩家远离游戏,他们会转而使用僵尸。制作一个他们无法下载和修改的客户端会更容易,而且他们必须通过一个远程桌面式的显示会话来玩整个游戏。游戏会玩得非常慢,但你甚至不会让他们将易受攻击的代码访问他们的网络:D你仍然可以/bot/这样的游戏,这将是一场噩梦。制作一个他们无法下载和修改的客户端会更容易,他们必须通过远程桌面式的显示会话来玩整个游戏。这个游戏玩起来会非常慢,但你甚至不会让他们的网络上有易受攻击的代码:D但是你仍然可以/bot/这样的游戏,这将是一场噩梦。当然,这只会增加复杂性。但共享秘密是一种一次发现、数百万次反馈的方法,而每分数1个密钥至少会让您依赖于分发密钥的服务器,而且它可能会对分发这些密钥设置速率限制。但是Andreas基于序列复杂性的安全性可能会使复杂性变得太难,不值得逆转。当然,这只会增加复杂性。但共享秘密是一种一次发现、数百万次反馈的方法,而每分数1个密钥至少会让您依赖于分发密钥的服务器,而且它可能会对分发这些密钥设置速率限制。但是Andreas基于序列复杂性的安全性可能使复杂性变得太难,不值得逆转。