我正在开发一款在线国际象棋游戏。我想创建一个javascript函数,其目的是代表播放器向服务器传达移动所花费的确切时间。
当然,此消息将被加密,但为了信任此功能,我想将其混淆到我可以依赖混淆算法的程度。
我只知道一些混淆算法,hieroglyphy是最有趣的。但它并非牢不可破。执行速度和大小并不重要,我可以减去在同一个函数中发送消息的函数所花费的时间,并且大小甚至可以达到2MB。
我很确定没有不可破解的算法,因为只要需要在浏览器中运行,任何有足够耐心的人都可以一点一点地看待它,看看它的作用。
我是否有一个替代方案需要更多精力和时间来自意图不好的用户?
编辑我已经在WindowsXP上的每个浏览器中完成了一些测试,看起来在FF,IE,Opera和Chrome中,setTimeout
函数将在传递的延迟后触发第二个参数,无论延迟期间系统时间是否有任何变化。如果没有其他信息提出建议,那么逻辑结论是,无论系统时间如何变化,客户端都可以使用setTimeout函数而不是Date()对象来测量时间,最高可达setTimeout延迟给定的精度时间。
Hamish在下面的回答中提到修改浏览器日期/时间API是微不足道的。在这种情况下,javascript代码容易受到修改的影响,这会增加setTimeout实际延迟时间。应该设置一些代码,以便服务器开始怀疑欺骗有不合理滞后时间的人。如果思考时间不包括延迟时间,这将始终是一个问题。
我无法使用服务器端计时。滞后时间有时会超过合理的数量,这将使用户不满意。有时,滞后可能会产生重大影响。
这让我回到原来的问题。我正在寻找最好的混淆方法,其中最好的方法是攻击者必须努力进行反混淆。理想情况下,我希望更快地更改混淆算法,而不是攻击者可以进行反混淆,然后再次使用该算法,或者在攻击者不会期望的情况下很少使用该算法。
答案 0 :(得分:4)
我可以将计算机的时钟设置为三小时前,您的脚本会愉快地发送-10800 seconds
。永远不要依赖JavaScript以可信的方式处理信息。使用服务器端代码计算玩家回合开始和移动时的差异,并在服务器上绝对保留游戏的表示,并确保移动有效。
答案 1 :(得分:1)
模糊代码无济于事,原因有两个:
一个明智的解决方案是测量服务器上发送和接收消息的时间,并测量连接的延迟以纠正传输速度(如果您需要非常准确)。