如何混淆(保护)JavaScript?

时间:2008-10-11 18:17:19

标签: javascript obfuscation source-code-protection

我想创建一个非开源的JavaScript应用程序,因此我希望学习如何模糊我的JS代码?这可能吗?

24 个答案:

答案 0 :(得分:398)

<强>模糊处理:

试试YUI Compressor。它是一个非常受欢迎的工具,由Yahoo UI团队构建,增强和维护。

您也可以使用:

私人字符串数据:

将字符串值保密是一个不同的问题,混淆不会带来太大的好处。当然,通过将您的源代码打包成乱码,缩小混乱,您可以通过默默无闻轻松地使用安全性。大多数情况下,您的用户正在查看源,并且客户端上的字符串值是供其使用的,因此通常不需要这种私有字符串值。

如果你真的有一个你从未想让用户看到的价值,你会有几个选择。首先,您可以进行某种加密,在页面加载时解密。这可能是最安全的选择之一,但也可能是许多不必要的工作。你可以对base64编码一些字符串值,这会更容易..但真正想要这些字符串值的人可以轻松解码它们。加密是真正阻止任何人访问您的数据的唯一方法,大多数人发现它比他们需要的更安全。

<强>旁注:

众所周知,Javascript中的混淆会导致一些错误。混淆器正在变得更好一点,但许多服装决定他们从缩小 gzipping 中看到足够的好处,并且增加了模糊处理的节省永远值得的麻烦。如果您正在尝试保护自己的源代码,也许您会认为这是值得的,只是为了让您的代码更难阅读。 JSMin是一个不错的选择。

答案 1 :(得分:132)

我很惊讶没有人提到Google的Closure Compiler。它不只是缩小/压缩,它分析以查找和删除未使用的代码,并重写以实现最大限度的缩小。它也可以进行类型检查,并会警告语法错误。

JQuery最近从YUI Compresser切换到Closure Compiler,看到了“solid improvement

答案 2 :(得分:114)

混淆永远不会真正起作用。对于任何真正想要获取代码的人来说,这只是一个减速带。更糟糕的是,它可以防止用户修复错误(并将修复程序发回给您),并使您更难以诊断现场问题。浪费你的时间和金钱。

与律师讨论知识产权法以及您的法律选择。 "Open Source"并不意味着“人们可以阅读来源”。相反,Open Source是一种特定的许可模式,允许自由使用和修改代码。如果你没有授予这样的许可证,那么复制你的代码的人是违反的,并且(在世界上大多数地方)你有合法的选择来阻止它们。

您真正保护代码的唯一方法是不发货。移动重要的代码服务器端并让您的公共Javascript代码对它进行Ajax调用。

See my full answer about obfuscators here.

答案 3 :(得分:49)

您可以随心所欲地混淆javascript源代码,但只需要所有源代码实际运行在客户机上就可以反向工作......我能想到的最佳选择是拥有所有使用服务器端代码完成处理,javascript所做的所有客户端代码都是将处理请求发送到服务器本身。否则,任何人都将始终能够跟踪代码正在执行的所有操作。

有人提到base64来保持字符串安全。这是一个糟糕的主意。 Base64可以立即被想要对代码进行反向工程的人员识别。他们要做的第一件事就是取消编码,看看它是什么。

答案 4 :(得分:44)

有许多免费提供的JavaScript混淆工具;但是,我认为重要的是要注意,很难将JavaScript混淆到无法进行逆向工程的程度。

为此,我在某种程度上加速了以下几种选择:

  • YUI Compressor。 Yahoo!的JavaScript压缩器可以很好地缩短代码,从而缩短其加载时间。有一小部分混淆效果相对较好。实质上,Compressor将更改函数名称,删除空格并修改局部变量。这是我经常使用的。这是一个基于Java的开源工具。

  • JSMin是Douglas Crockford编写的一款工具,旨在缩小您的JavaScript源代码。用克罗克福德自己的话来说,“JSMin并没有混淆,但它确实是丑化的。”它的主要目标是缩小源代码的大小,以便在浏览器中加快加载速度。

  • Free JavaScript Obfuscator。这是一个基于Web的工具,它试图通过对代码进行实际编码来模糊代码。我认为其编码(或混淆)形式的权衡可能以文件大小为代价;但是,这是个人偏好的问题。

答案 5 :(得分:22)

我会做什么:

A。欺骗黑客!

这将是我的假/混淆秘密javascript代码LAUNCHER的第二部分。 您在源代码中看到的那个。

这段代码是什么?

  1. 加载实际代码
  2. 设置自定义标题
  3. 发布自定义变量

  4. var ajax=function(a,b,d,c,e,f){
     e=new FormData();
     for(f in d){e.append(f,d[f]);};
     c=new XMLHttpRequest();
     c.open('POST',a);
     c.setRequestHeader("Troll1","lol");
     c.onload=b;
     c.send(e);
    };
    window.onload=function(){
     ajax('Troll.php',function(){
      (new Function(atob(this.response)))()
     },{'Troll2':'lol'});
    }
    

    B。稍微混淆代码

    那是什么?

    1. 与base64中的上述代码相同
    2. 这不是SECRET javascript代码

    3. (new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
      

      C 使用

      中的实际代码创建一个难以显示的php文件

      这个php代码是什么?

      1. 检查正确的引荐来源(您的启动器的域/目录/代码)
      2. 检查自定义HEADER
      3. 检查自定义POST变量
      4. 如果一切正常,它会向您显示正确的代码,或者是假代码或禁止ip,关闭页面......无论如何。

        <?php
        $t1=apache_request_headers();
        if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
         echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
        }else{
         echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
        };
        ?>
        

        base64 referrer = http://here.is/my/launcher.html

        SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

        FAKE = window.open('', '_self', '');window.close();

        现在..如果您在SECRET javascript中定义事件处理程序,它可能是可访问的......您需要使用启动代码在外部定义它们并指向嵌套的SECRET函数。

        所以...有一个简单的方法来获取代码吗? document.body.appendChild(document.createElement('div')).innerText='Awesome';

        我不确定这是否有效,但我正在使用chrome并检查了元素,资源,网络,来源,时间轴,个人资料,审核但我没有找到上面的行。 < / p>

        note1:如果你打开来自Inspect element-&gt;网络的Troll.php网址,你会得到假代码。

        note2:整个代码是为现代浏览器编写的。 polyfill需要更多代码。

        编辑

        launcher.html

        <!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
        

        Troll.php

        <?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
        

答案 6 :(得分:18)

试试JScrambler。我最近给了它一个旋转,并对它印象深刻。 它提供了一组用于混淆的模板,具有预定义的设置,适用于那些不关心细节并希望快速完成任务的人。您还可以通过选择所需的任何转换/技术来创建自定义混淆。

答案 7 :(得分:17)

解释语言的问题在于你发送源代码以使它们正常工作(除非你有一个编译器来进行字节码编码,但是再一次,反编译它是非常简单的。)

因此,如果您不想牺牲性能,您只能对变量和函数名称起作用,例如。用a,b ... aa,ab ...或a101,a102等替换它们。当然,尽可能多地移除空间/换行(这就是所谓的JS压缩机所做的)。
如果你必须对它们进行加密并实时解密,那么混淆字符串会受到性能影响。另外JS调试器可以显示最终值......

答案 8 :(得分:17)

与大多数其他答案相反,我建议不要使用YUI Compressor;你应该使用Google Closure

并不多,因为它压缩得更多,但主要是因为它会捕获诸如a = [1,2,3,];之类的javascript错误,这会使IE变得混乱。

答案 9 :(得分:13)

非开源的基于Javascript的应用程序非常愚蠢。 Javascript是一种客户端解释语言。混淆不是很多保护..

JS混淆通常是为了减少脚本的大小,而不是“保护”它。如果您处于不希望代码公开的情况,Javascript就不是正确的语言..

周围有很多工具,但大多数都在其名称中使用“压缩器”(或“缩小器”)这个词是有原因的。

答案 10 :(得分:11)

我可以推荐Patrick J. O'Neil的JavaScript Utility。它可以混淆/压缩和压缩,它们似乎相当不错。也就是说,我从未尝试将其集成到任何类型的构建脚本中。

至于混淆与缩小 - 我不是前者的忠实粉丝。它使调试变得不可能(第1行的错误......“等待,只有一行”)并且它们总是需要时间来解压缩。但如果你需要......好吧。

答案 11 :(得分:11)

您无法保护客户端代码:只需在Google Chrome上按F12,暂停执行javascript 即可获得所有字符串,甚至是加密的字符串。 Beautify它和rename variables,您将获得几乎原始代码。

如果你正在写服务器端javascript(即NodeJS)害怕有人入侵你的服务器并想让黑客工作更加困难,给你更多时间来获取你的访问权限,那么使用 javacript编译器

您需要在高级编译中使用Closure Compiler,因为它是重命名所有变量的唯一工具,即使这些变量用于多个文件/模块。但它只是有一个问题:它只有在你写coding style时才有效。

答案 12 :(得分:5)

我建议先使用YUI Compressor缩小,然后使用类似http://www.javascriptobfuscator.com/

之类的内容将所有字符串和数字转换为HEX值

有了这个,代码将几乎无法理解,我认为在这个阶段,黑客重新制作你的代码需要更多的时间,而不是从头开始重写。重写和克隆是你实际上无法阻止的。毕竟我们是自由人!

答案 13 :(得分:5)

Dean Edward的Packer是一个优秀的混淆器,虽然它主要模糊代码,而不是代码中的任何字符串元素。

请参阅:Online Javascript Compression Tool并从下拉列表中选择Packer(Dean Edwards)

答案 14 :(得分:4)

我正在使用Closure-Compiler实用程序进行java脚本混淆。它缩小了代码并具有更多混淆选项。 此实用程序位于以下网址的Google代码中: Closure Tools

但是现在有一天我听到很多UglifyJS。您可以在Closure Compiler和UglifyJS之间找到各种比较,其中Uglify似乎是赢家 UglifyJS: A Fast New JavaScript Compressor For Node.js That’s On Par With Closure

很快我就有机会获得UglifyJS。

答案 15 :(得分:4)

我多年来一直在使用Jasob,它是那里最好的混淆器。 它具有高级用户界面,但仍然直观且易于使用 它还将处理HTML和CSS文件。

使用它的最佳方法是在所有私有变量前加上下划线之类的内容,然后使用sort功能将它们组合在一起并 check < / em>将它们作为混淆的目标。

用户仍然可以查看您的来源,但是当您的私有变量从_sUserPreferredNickName转换为a时,解密起来要困难得多。

引擎会自动计算目标变量的数量并确定它们的优先级以获得最大压缩。

我不为Jasob工作,我没有得到任何促进他们的建议,只是提供一些友好的建议 缺点是它不是免费的,而且价格有点贵,但是当它与替代品堆叠时仍然值得 - “免费”选项甚至都不会接近。

答案 16 :(得分:4)

你试过Bananascript吗?它产生高度压缩且完全不可读的代码。

答案 17 :(得分:3)

作为JavaScript / HTML / CSS混淆器/压缩器,您还可以尝试Patu Digua

答案 18 :(得分:3)

我的印象是,有些企业(例如:JackBe)将加密的JavaScript代码放在* .gif文件而不是JS文件中,作为混淆的额外措施。

答案 19 :(得分:3)

This one minifies但不会混淆。如果您不想使用命令行Java,可以将javascript粘贴到webform中。

答案 20 :(得分:3)

试试此工具Javascript Obfuscator

我在我的HTML5游戏中使用它不仅将它的大小从950KB缩小到150而且还使得源代码不可读的闭包编译器和缩放器是可逆的我个人不知道如何扭转这种混淆。

答案 21 :(得分:3)

你绝对应该考虑看看Obfuscriptor

我超越了我们从其他工具(例如YUI CompressorGoogle Closure)看到的典型Javascript缩小技巧。

混淆的代码看起来更像加密。不像我以前见过的任何东西。

答案 22 :(得分:2)

如果您使用JavaScript库,请考虑使用Closure Compiler的高级模式编译兼容(经过微小修改)的Dojo Toolkit。

Dojo – The Only JavaScript Library Compatible with The Closure Compiler

使用Closure Advanced模式编译的代码几乎不可能进行逆向工程,甚至不能通过美化器,因为整个代码库(包括库)被混淆了。它平均也小25%。

仅仅缩小的JavaScript代码(YUI Compressor,Uglify等)在通过美化器后很容易进行逆向工程。

答案 23 :(得分:2)

我过去曾经使用过它,它做得很好。这不是免费的,但你一定要看看 JavaScript Obfuscator & Encoder