我怎样才能混淆(保护)JavaScript?

我想创build一个不是开源的JavaScript应用程序,因此我希望学习如何能够混淆我的JS代码? 这可能吗?

混淆:

尝试YUI压缩机 。 这是一个非常stream行的工具,由雅虎UI团队build立,增强和维护。

您也可以使用:

  • Google Closure编译器
  • UglifyJS

私人string数据:

将string值保持为私有是另一个问题,混淆并不会带来太多好处。 当然,通过将你的源代码打包成一个乱码,混乱的文件,你就可以通过默默无闻的方式获得一个安全的简单版本。 大多数情况下,您的用户正在查看源代码,并且客户端上的string值是供他们使用的,所以这种私有string值通常不是必需的。

如果你真的有一个价值,你从来不想让用户看到,你会有几个select。 首先,你可以做一些encryption,这是在页面加载解密。 这可能是最安全的select之一,但也可能是不必要的很多工作。 你可能base64编码一些string值,这将是更容易..但有人谁真正想这些string值可以轻松地解码它们 。 encryption是真正防止任何人访问您的数据的唯一途径,大多数人认为这是比他们所需要的更多的安全性。

边注:

Javascript中的模糊已知会导致一些错误。 混淆器已经越来越好了,但是许多服装公司认为他们从缩小压缩中看到了足够的好处,混淆的节省并不总是值得的 。 如果你想保护源代码,也许你会认为这是值得的,只是为了让你的代码更难阅读。 JSMin是一个很好的select。

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

JQuery最近从YUI Compresser切换到Closure编译器,并看到了“ 坚实的改进 ”

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

与律师谈论知识产权法,以及您的法律select。 “开源”并不意味着“人们可以阅读源代码”。 相反,开源是一个特殊的许可模式,授予自由使用和修改你的代码的权限。 如果你不授予这样的许可证,那么复制你的代码的人是违反的(在世界上大部分地区),你有合法的select来阻止他们。

你真的可以保护你的代码的唯一方法是不发货。 移动重要的代码服务器端,让你的公共Javascript代码做Ajax调用。

看到我在这里关于混淆器的完整答案。

您可以混淆javascript源代码,但是它只会依靠要求所有的源代码在客户端机器上运行才能反向工程…我能想到的最好的select是完成所有的处理与服务器端的代码,所有的JavaScript代码的客户端代码是发送请求处理到服务器本身。 否则,任何人都将始终能够跟踪代码正在执行的所有操作。

有人提到base64保持string安全。 这是一个可怕的想法。 Base64可以立即被那些想要逆向工程代码的人识别。 他们要做的第一件事就是取消编码,看看它是什么。

有一些免费的JavaScript混淆工具, 不过,我认为重要的是要注意,难以将JavaScript混淆到无法进行逆向工程的地步。

为此,有几个选项,我曾经在一定程度上加class:

  • YUI压缩机 。 雅虎的JavaScript压缩程序能够很好地压缩代码,从而缩短加载时间。 有一个小小的混淆程度相对较好。 本质上,Compressor将更改函数名称,删除空白,并修改局部variables。 这是我最经常使用的。 这是一个开源的基于Java的工具。

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

  • 免费的JavaScript混淆器 。 这是一个基于networking的工具,试图通过实际编码来模糊你的代码。 我认为,编码(或混淆)forms的权衡可能是以文件化为代价的; 不过,这是个人喜好的问题。

我会做什么:

A.黑客的巨魔!

这将是在第二部分我的假/模糊秘密JavaScript代码LAUNCHER。 你在源代码中看到的那个。

这个代码是什么?

  1. 加载真实的代码
  2. 设置自定义标题
  3. 张贴自定义variables

 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代码

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

C创build一个难以显示与真实的代码里面的PHP文件

这个php代码是什么?

  1. 检查正确的推荐人(你的发射器的域名/目录/代码)
  2. 检查自定义标题
  3. 检查自定义POSTvariables

如果一切正常,它会告诉你正确的代码,否则一个虚假的代码或禁止IP,closures页面..无论如何。

 <?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';

我不知道这是否工作,但我使用铬和检查元素,资源,networking,来源,时间轴,configuration文件,审计,但我没有find上面的行。

note1:如果你用chrome从Inspect元素 – >networking打开Troll.phpurl,你会得到伪造的代码。

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

编辑

launcher.html

 <!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG"></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=';}; ?> 

与大多数其他答案,我build议对YUI压缩机; 你应该使用Google Closure 。

没有太多,因为它压缩更多,但主要是因为它会抓住JavaScript错误,如a = [1,2,3,]; 这使IE浏览器无法使用。

解释语言的问题是,你发送源代码来使它们工作(除非你有一个编译器到字节码,但是再一次,反编译是很微不足道的)。

所以,如果你不想牺牲性能,你只能对variables名和函数名起作用,例如。 用a,b … aa,ab …或a101,a102等替代它们。当然,也可以删除尽可能多的空间/换行符(这就是所谓的JS压缩机所做的)。
混淆string将有一个性能打击,如果你必须encryption和实时解密他们。 另外一个JSdebugging器可以显示最终值…

试试JScrambler 。 我最近旋转了一下,对它印象深刻。 它提供了一套模板,用于对那些不关心细节并只想快速完成的人进行模糊处理。 您也可以通过select您想要的任何转换/技术来创build自定义混淆模式。

一个非开源的基于Javascript的应用程序相当愚蠢。 Javascript是一种客户端解释型语言。混淆是没有太多的保护..

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

有大量的工具,但大多数的名称中有“压缩器”(或“缩小器”)这个词。

我可以推荐Patrick J. O'Neil的JavaScript Utility 。 它可以混淆/压缩和压缩,这似乎是相当不错的。 也就是说,我从来没有尝试过将它整合到任何forms的构build脚本中。

至于混淆与缩小 – 我不是前者的忠实粉丝。 它使debugging不可能(第1行错误…“等待,只有一行”),他们总是需要时间来解压缩。 但是,如果你需要……好。

您无法确保客户端代码的安全:只需在Google Chrome上按F12键,即可暂停JavaScript执行 ,您将获得所有string,即使是已encryption的string。 美化它, 并重命名variables ,你会得到几乎原来的代码。

如果你正在编写服务器端JavaScript(即NodeJS)害怕有人侵入你的服务器,并希望使黑客工作更困难,给你更多的时间来访问您的访问,然后使用javacript编译器

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

Dean Edward的Packer是一个优秀的混淆器,尽pipe它主要是混淆了代码,而不是代码中的任何string元素。

请参阅: 在线JavaScript压缩工具,并从下拉列表中selectPacker(Dean Edwards)

我会build议先用YUI Compressor等东西来缩小,然后使用类似http://www.javascriptobfuscator.com/的方式将所有string和数字转换为HEX值;

有了这个,代码将变得几乎不可能理解,我认为在这个阶段,黑客需要更多的时间来重新执行你的代码,而不是从头开始重新编写代码。 重写和克隆是你不能实际停止。 毕竟我们是自由人!

我已经使用了Jasob多年,它是最好的混淆器。
它有一个先进的用户界面,但仍然直观,易于使用。
它也将处理HTML和CSS文件。

使用它的最好方法是将所有私有variables加上一个下划线,然后使用sortfunction将它们全部组合在一起,然后将它们作为混淆目标进行检查

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

引擎将自动计算出目标variables的数量并优先考虑它们以获得最大的压缩。

我不为Jasob工作,我没有得到任何推广,只是提供一些友好的build议。
缺点是它不是免费的,价格有点贵,但是与其他select相比还是值得的 – “免费”选项甚至不会接近。

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

我正在使用Closure-Compiler实用程序进行java脚本混淆。 它缩小了代码,并有更多的混淆选项。 该实用程序可在以下url的Google代码中find:
closures工具

但是现在我听到很多UglifyJS的消息。 您可以在Closure Compiler和UglifyJS之间findUglify似乎是赢家的各种比较。
UglifyJS:一个快速新的JavaScript压缩机的Node.js与封闭一致

很快我就会有机会去UglifyJS。

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

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

试试这个工具的Javascript混淆器

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

你绝对应该考虑看Obfuscriptor 。

我超越了从其他工具(例如YUI Compressor或Google Closure)中看到的典型的JavaScript缩小技巧。

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

这一个缩小,但不混淆。 如果您不想使用命令行Java,则可以将JavaScript粘贴到Web表单中。

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

Dojo – 与Closure Compiler兼容的唯一JavaScript库

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

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

我以前用过这个,它做得很好。 这不是免费的,但你一定要看看。
JavaScript混淆器和编码器