有没有比象形文字更难破解的方法来混淆javascript函数

Is there a harder to break way to obfuscate a javascript function than hieroglyphy?

本文关键字:javascript 函数 方法 象形文字 破解 有没有      更新时间:2023-09-26

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

当然,这个消息将被加密,但为了信任这个函数,我想将其模糊到可以依赖模糊算法的程度。

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

我敢肯定,没有牢不可破的算法,因为只要它需要在浏览器中运行,任何有足够耐心的人都可以把它一块一块地拿出来,看看它能做什么。

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

编辑我在WindowsXP上的每个浏览器中都做了一些测试,在FF、IE、Opera和Chrome中,setTimeout函数似乎会在作为第二个参数传递的延迟后触发,无论延迟期间系统时间有何变化。如果没有其他信息表明情况并非如此,那么逻辑结论是,无论系统时间如何变化,都可以使用setTimeout函数而不是Date()对象在客户端测量时间,精确到setTimeout延迟时间给定的精度。

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

我不能使用服务器端计时是有原因的。滞后时间有时会超过合理的数量,这会让用户感到不满。有时,滞后会造成一切不同。

这让我回到了最初的问题。我正在寻找最好的模糊处理方法,在这种方法中,最好的方法是衡量攻击者为消除模糊所做的努力。理想情况下,我希望以比攻击者更快的速度更改模糊处理算法,然后再也不要使用该算法,或者很少使用它,这是攻击者所没有想到的。

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

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

  1. 用户仍然可以检查从浏览器发送到服务器的消息。您还必须以某种方式对消息进行签名,以防止其被拦截和修改。一般来说,解包消息比生成消息所用的函数更容易
  2. 您试图测量移动所花费的时间,这意味着您的模糊函数仍然必须信任系统时钟和浏览器日期/时间API。两者都很难修改

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