我说的是一个没有分数上限的动作游戏,也没有办法通过重放动作等来验证服务器上的分数。
我真正需要的是在Flash/PHP中尽可能最强的加密,以及一种防止人们调用PHP页面的方法,而不是通过我的Flash文件。我在过去尝试过一些简单的方法,比如对单个分数进行多次调用,完成校验和/斐波那契序列等,也使用Amayeta SWF加密来混淆SWF,但它们最终都被黑客入侵了。
多亏了StackOverflow的回复,我现在从Adobe找到了更多的信息-- http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html和https://github.com/mikechambers/as3corelib --我想我可以用它们来加密。不过,我不确定这会不会让我绕过CheatEngine。
我需要知道AS2和AS3的最佳解决方案,如果它们不同的话。
主要的问题似乎是像TamperData和LiveHTTP头这样的东西,但我知道还有更高级的黑客工具--比如CheatEngine (感谢Mark Webster)
发布于 2008-09-16 17:32:22
这是互联网游戏和竞赛的一个典型问题。您的Flash代码与用户一起决定游戏的分数。但是用户不受信任,Flash代码在用户的计算机上运行。你是索尔。你无法阻止攻击者伪造高分:
针对您的系统的最简单的攻击可能是通过代理运行游戏的HTTP流量,捕获高分保存,并使用更高的分数重放它。
您可以尝试通过将每个高分保存绑定到游戏的单个实例来阻止此攻击,例如,通过在游戏启动时向客户端发送加密令牌,这可能如下所示:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))(您也可以使用会话cookie来达到相同的效果)。
游戏代码使用高分保存将该令牌回送到服务器。但是攻击者仍然可以再次启动游戏,获取令牌,然后立即将该令牌粘贴到重放的高分保存中。
因此,接下来您不仅要提供一个令牌或会话cookie,还要提供一个高分加密会话密钥。这将是一个128位的AES密钥,本身使用硬编码到Flash游戏中的密钥进行加密:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))现在,在游戏发布高分之前,它会解密高分加密会话密钥,这是因为您将硬编码为Flash二进制文件。您可以使用此解密密钥以及高分的SHA1散列来加密高分:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))服务器上的PHP代码检查令牌以确保请求来自有效的游戏实例,然后解密加密的高分,检查以确保高分与高分的SHA1匹配(如果跳过这一步,解密将只产生随机的,可能非常高的高分)。
所以现在攻击者反编译你的Flash代码,并快速找到AES代码,它像一个疼痛的拇指一样突出,尽管即使它没有,它也会在15分钟内通过内存搜索和跟踪被追踪到(“我知道我在这个游戏中的分数是666,所以让我们在内存中找到666,然后捕获任何触及这个值的操作--哦,看,高分数的加密代码!”)。有了会话密钥,攻击者甚至不必运行Flash代码;她可以获取游戏启动令牌和会话密钥,并可以发回任意高分。
你现在已经到了大多数开发人员都放弃的地步-花几个月的时间和攻击者打交道:
使用operations
这主要是在浪费时间。不用说,SSL也不会对您有所帮助;当两个SSL端点中的一个是邪恶的时,SSL也不能保护您。
以下是一些可以实际减少高分欺诈的事情:
但请记住,在这里,您只是在阻止高分欺诈。你不能做什么来防止如果。如果你的游戏中有钱,就会有人击败你想出的任何系统。这样做的目的不是为了阻止这种攻击;而是要让攻击的代价比仅仅是真正擅长游戏并击败它更昂贵。
发布于 2008-09-16 16:09:55
你可能问错了问题。你似乎专注于人们用来获得高分的方法,但阻止特定的方法只能做到这一点。我没有使用TamperData的经验,所以我不能对此发表意见。
你应该问的问题是:“我如何验证提交的分数是有效的和真实的?”实现这一目标的具体方法取决于游戏。对于非常简单的益智游戏,您可能会将分数连同特定的开始状态和导致结束状态的移动序列一起发送,然后使用相同的移动在服务器端重新运行游戏。确认声明的分数与计算的分数相同,如果匹配,则仅接受分数。
发布于 2008-09-16 16:51:32
要做到这一点,一种简单的方法是提供高分值的加密散列以及它本身的分数。例如,当通过HTTP GET发布结果时:
当计算这个校验和时,应该使用一个共享的秘密;这个秘密永远不应该在网络上传输,而应该在PHP后端和flash前端中进行硬编码。上面的校验和是通过将字符串"secret“附加到分数"500",并通过md5sum运行它来创建的。
虽然该系统将防止用户发布任意分数,但它不能防止“重放攻击”,即用户重新发布先前计算的分数和散列组合。在上面的示例中,得分为500将始终生成相同的散列字符串。通过将更多信息(如用户名、时间戳或IP地址)合并到要进行散列的字符串中,可以降低某些风险。虽然这不会阻止数据的重放,但它将确保一组数据在单个时间内仅对单个用户有效。
为了防止发生重播攻击,必须创建某种类型的质询-响应系统,如下所示:
请记住,如果用户可以访问共享密钥,则上述任何技术的安全性都会受到损害
作为另一种选择,可以通过强制客户端通过HTTPS与服务器进行通信,并确保客户端预先配置为仅信任由您有权访问的特定证书颁发机构签署的证书,来避免这种反复。
https://stackoverflow.com/questions/73947
复制相似问题