0

我正在开发一个在线国际象棋变体游戏。我想创建一个 javascript 函数,其目的是代表玩家与服务器通信花费在移动上的确切时间。

当然,这条消息会被加密,但为了信任这个函数,我想把它混淆到可以依赖混淆算法的程度。

我只知道一些混淆算法,象形文字是最有趣的。但它并非牢不可破。执行速度和大小并不重要,我可以在同一个函数中扣除发送消息的函数所花费的时间,大小甚至可以达到 2MB。

我很确定没有牢不可破的算法,因为只要它需要在浏览器中运行,任何有足够耐心的人都可以一块一块地看它的作用。

我是否有一个需要恶意用户付出更多努力和时间的替代方案?

编辑我已经在 WindowsXP 上的每个浏览器中进行了一些测试,似乎在 FF、IE、Opera 和 Chrome 中,该setTimeout函数将在作为第二个参数传递的延迟后触发,而不管延迟期间系统时间的任何变化。如果没有提供其他信息以表明其他情况,则合乎逻辑的结论是,无论系统时间如何变化,都可以在客户端测量时间,使用 setTimeout 函数而不是 Date() 对象,达到 setTimeout 延迟给出的精度时间。

Hamish 在下面的回答中提到修改浏览器日期/时间 API 是微不足道的。在这种情况下,javascript 代码很容易受到会增加 setTimeout 实际延迟时间的修改。应该设置一些代码,以便服务器应该开始怀疑欺骗具有不合理延迟时间的人。如果延迟时间不包括在思考时间中,这将始终是一个问题。

我不能使用服务器端计时是有原因的。延迟时间有时会超过合理的数量,这会让用户不满意。有时滞后可以使一切变得不同。

这让我回到了最初的问题。我正在寻找最好的混淆方法,其中最好的衡量标准是攻击者必须做出去混淆的努力。理想情况下,我希望更改混淆算法的速度快于攻击者可以反混淆的速度,然后在攻击者无法预料的情况下不再使用该算法或很少使用它。

4

2 回答 2

4

我可以将我的计算机时钟设置为三个小时前,您的脚本会很高兴地发送-10800 seconds. 永远不要依赖 JavaScript 以可信的方式处理信息。使用您的服务器端代码来计算玩家回合开始时间和他们移动时间之间的差异,并绝对在服务器上保留游戏的表示并确保移动有效。

于 2012-08-23T21:22:04.510 回答
1

混淆你的代码没有帮助,原因有两个:

  1. 用户仍然可以检查从浏览器发送到服务器的消息。您还必须以某种方式对消息进行签名,以防止它被拦截和修改。通常,解包消息比使用生成它的函数更容易。
  2. 您正在尝试测量移动所花费的时间,这意味着您的混淆函数仍然必须信任系统时钟浏览器日期/时间 API。两者都是微不足道的修改。

一个明智的解决方案是测量服务器上发送和接收消息的时间,并测量连接的延迟以校正传输速度(如果您需要非常准确)。

于 2012-08-23T21:31:40.473 回答