将不受干扰的数据从Flash应用传递到服务器?
我正在寻找在运行Flash的客户端和服务器之间传递数据的安全方法。有问题的数据将由Flash应用程序生成,在这种情况下,这是我们完成游戏后的得分。我想验证服务器上的数据是否未被篡改。有什么好的方法可以做到这一点?
一种简单的方法是对数据执行某些操作(例如哈希),然后将哈希值与数据一起传递回服务器。但是,这很容易被有权访问客户端源代码的人打破。
编辑:我知道没有什么是无法破解的,但是我想使其尽可能地困难。我认为@jcnnghm的解决方案是使用公钥加密数据,还可以选择对游戏日志进行完整性检查和/或者重新计算。 SSL加密也是一个好主意,因为这会使解密发送回服务器的内容变得更加困难。
解决方案
回答
只要人们可以获取可执行文件,除非我们希望在锁定的信息亭中运行游戏,否则始终没有完全安全的方法。
音乐和电影行业在DRM上花费了数千万美元,这在几天/几周内就被家庭业余爱好者破解了。如果他们不能保护自己的东西...
回答
在不受信任的平台上运行的代码能否保持其完整性?不,几十年来破坏性的复制保护方案使我断言这是不可能的。在受信任的沙箱中运行的反向恶意代码是可行的,但是我们可以做的最好的事情是使人们作弊变得不便。
回答
使用存储在二进制文件中的公共密钥加密数据。这将增加攻击的进入壁垒。除此之外,当数据到达服务器时,还要进行完整性检查。这可能很简单,例如计算每个游戏时间单位可以实际赚取的最大积分数,或者将游戏日志发送回服务器以确保计分正确。
不管我们做什么,都不会完全证明其不受黑客攻击,但这将停止一切,除非是最坚决的。
更新:@mark:Flash本身支持SSL。
回答
在http://code.google.com/p/as3crypto/上查看AS3Crypto软件包。我没有尝试过,但是此软件包声称(部分)支持TLS 1.0协议。
TLS将在Flash应用程序和服务器之间提供安全的隧道。
http://en.wikipedia.org/wiki/Secure_Sockets_Layer
@jcnnghm
我们通常不希望将公钥加密(RSA,DSA)用于大容量数据加密,因为它的计算时间很长。公钥加密应在安全协议的握手和密钥协商阶段中使用,但批量数据加密应由对称密码(例如AES和TDES)处理。 TLS和SSL协议以这种方式工作。
回答
我同意给出的答案是黑客证明。因为一旦我们可以阅读它,就可以对其进行操作/复制并对其进行反编译。
我一直在计划的另一种方法是生成唯一的密钥pr。播放器会话(包括一些时间/日期作为盐值)。
然后遍历整个应用程序,可能会定期提交/传输状态分数并获得新的有效密钥。如果此同步失败,则中断整个会话。
不利的一面可能是太多同时进行的玩家降低了服务器的回复速度,从而导致"假超时" +使游戏服务器无法进行DoS攻击。
但是在用户进行会话时更新"会话密钥"的操作会要求额外的会话管理,但是如果这样做会使作弊者更加努力,我一定会尝试:o)
另一方面,NOTHING可以防止黑客攻击,因此,无论我们想到的解决方案多么聪明,都不要100%相信它。
最后要注意的是将应用程序划分为模块/级别等,这样,仅通过启动它就不会访问所有代码。
目前,我的计划是建立一个大型的多层次世界,并且客户端/播放器将仅将文件添加到播放器所驻留的部分。
希望这对想法有用。