Javascript 代码混淆的目的
Javascript 是一种解释执行的脚本语言,主要应用于 Web 领域的客户端的浏览器中;由于 Javascript 解释执行的特性,代码必须明文下载到客户端,并且可以很容易的进行调试,使得 Javascript 代码的保护非常困难;
不同的人对 Javascript 代码的保护有不同的看法;有的人辛苦努力的代码,却可以被竞争对手轻易获得,他们就非常希望能有保护 Javascript 代码的方案,但现有的方案可能无法满足他们的要求;很多人认为 Javascript 语言很简单,Javascript 代码没有保护的价值,可能是他们的代码确实简单,或者他们并不了解 Javascript 语言强大的功能;还有的人认为现在都开源了,还保护代码干什么,当然开源的人是值得敬佩的,但对别人的代码的开源要求,却不是合理的。
为了提高用户的体验,出现了 Web 2.0 技术,并随着 AJAX 和富界面技术的发展,Javascript 在 Web 应用上的重要性越来越高,Javascript 代码的复杂性、功能和技术含量也越来越高,对Javascript 代码保护的需要也越来越迫切。
Javascript 在线混淆器的目的是为 Javascript 代码保护的需求,提供一种全新的综合解决方案,包括编码规则和免费的在线混淆器。
混淆和加密的区别
很多人将这两者混在一起讨论,实际上两者的目的有一定的区别,采取的手段也有很大的不同。加密主要是为了防止未经授权的使用,对这种情况即使破解了加密,也只能非法使用,并不一定能获得软件的代码逻辑;但对于脚本来说,防止对代码进行访问的措施,也属于加密,对这种情况,破解了加密,就获得了代码;而混淆是在无法阻止他人获取代码的情况下,采取的保护代码的逻辑不被他人理解的措施;对于混淆的代码,他人很难理解,无法进行修改和重新应用;
对于生成机器码的语言,比如 C 语言,只需要考虑未经授权的访问,几乎不需考虑代码的保护;因为对编译后的软件,只能反汇编为汇编语言代码,几乎无法分析出代码的逻辑。
对于生成中间代码的语言,比如 Java 和 C#,即需要考虑未经授权的访问,又需考虑代码的保护;;因为对编译后的软件,可以很容易的反编译为较高级的语言,从而了解到代码中的逻辑,并较容易的破解加密。而混淆后,即难于理解代码的逻辑,也不易找到加密点所在。
对于脚本语言,比如 Javascript,只能混淆,难以加密;因为脚本都是明文存在的,很容易调试的,通过跟踪可以较容易的破解上面两种目的的加密。但是混淆后的代码是难于理解代码的逻辑的。
我们只涉及到对 Javascript 脚本进行混淆,而不涉及加密;对于涉及到 Javascript 的系统的加密,我们建议不要将加密点放在 Javascript 脚本内,而是放在服务端的编译程序内,因为编译程序的加密可以采用更多的保护方式,加密的强度也更高。
我们首先要分析 Javascript 语言和混淆相关的特点,和现有的混淆产品的不足,然后再提出我们对 Javascript 代码混淆的解决方案,最后是我们的 Javascript 在线混淆器。
Javascript 语言和混淆相关的特性
Javascript 是一种解释执行的脚本语言,相对编译类型的语言有很多自身的特性,而其中一些特性会对代码混淆带来很大的困难。
无法定义类的属性和方法的名称是否需要被混淆
Javascript 是一种基于原型的语言,没有严格的类型定义。在自定义的类中,对于需要外部访问的属性和方法,不能进行混淆;对于内部访问的属性和方法,需要进行混淆;但Javascript 语言本身,无法对属性和方法进行这样的区分。为此我们要寻找一种变通的机制来识别属性和方法的名称是否需要混淆。
存在大量的系统定义的核心的和客户端的方法和属性不能被混淆
Javascript 语言本身定义了大量的核心的类、方法和属性;浏览器中也定义了大量的客户端的类、方法和属性;这些类、方法和属性都不能够被混淆,然而这些类、方法和属性的数量太大,无法通过枚举来避免混淆;为此我们需要寻找一种方法来标识这些类、属性和方法。
无法定义全局变量是否需要被混淆
全局变量是 window 对象的属性,局部变量是函数对象的属性;所有的局部变量都是可以和应该被混淆的,而全局变量有的需要混淆,有的不能混淆;但全局变量和局部变量的表现形式是一样的,难以区分;而且全局变量本身更无法定义是否需要被混淆。为此我们要找到一种方法来区分不能混淆的全局变量,和需要混淆的全局变量及局部变量。
Javascript 语言的这些特点,都对代码的混淆带来了很大的困难,如果不解决这几个问题,Javascript 代码的混淆就缺少实用的价值。
现有 Javascript 混淆产品的问题
当我们需要混淆 Javascipt 代码的时候,首先考察了市面上现有的产品,和一些论坛里对混淆的思路,但这些产品和思路都不能满足我们的要求。