我正在开发一个在线国际象棋变体游戏。我想创建一个 javascript 函数,其目的是代表玩家与服务器通信花费在移动上的确切时间。
当然,这条消息会被加密,但为了信任这个函数,我想把它混淆到可以依赖混淆算法的程度。
我只知道一些混淆算法,象形文字是最有趣的。但它并非牢不可破。执行速度和大小并不重要,我可以在同一个函数中扣除发送消息的函数所花费的时间,大小甚至可以达到 2MB。
我很确定没有牢不可破的算法,因为只要它需要在浏览器中运行,任何有足够耐心的人都可以一块一块地看它的作用。
我是否有一个需要恶意用户付出更多努力和时间的替代方案?
编辑我已经在 WindowsXP 上的每个浏览器中进行了一些测试,似乎在 FF、IE、Opera 和 Chrome 中,该setTimeout
函数将在作为第二个参数传递的延迟后触发,而不管延迟期间系统时间的任何变化。如果没有提供其他信息以表明其他情况,则合乎逻辑的结论是,无论系统时间如何变化,都可以在客户端测量时间,使用 setTimeout 函数而不是 Date() 对象,达到 setTimeout 延迟给出的精度时间。
Hamish 在下面的回答中提到修改浏览器日期/时间 API 是微不足道的。在这种情况下,javascript 代码很容易受到会增加 setTimeout 实际延迟时间的修改。应该设置一些代码,以便服务器应该开始怀疑欺骗具有不合理延迟时间的人。如果延迟时间不包括在思考时间中,这将始终是一个问题。
我不能使用服务器端计时是有原因的。延迟时间有时会超过合理的数量,这会让用户不满意。有时滞后可以使一切变得不同。
这让我回到了最初的问题。我正在寻找最好的混淆方法,其中最好的衡量标准是攻击者必须做出去混淆的努力。理想情况下,我希望更改混淆算法的速度快于攻击者可以反混淆的速度,然后在攻击者无法预料的情况下不再使用该算法或很少使用它。