740

我想制作一个非开源的 JavaScript 应用程序,因此我想学习如何混淆我的 JS 代码?这可能吗?

4

22 回答 22

427

混淆:

试试YUI 压缩机。它是一个非常流行的工具,由 Yahoo UI 团队构建、增强和维护。

您还可以使用:

UPDATE: This question was originally asked on 2008, and The mentioned technologies are deprecated. you can use:

私有字符串数据:

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

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

边注:

众所周知,Javascript 中的混淆会导致一些错误。混淆器对此有所改善,但许多机构认为他们从压缩gzip 压缩中看到了足够的好处,而且混淆的额外节省并不总是值得麻烦的。如果你试图保护你的源代码,也许你会认为值得你花时间,只是为了让你的代码更难阅读。JSMin是一个不错的选择。

于 2008-10-11T18:21:22.910 回答
143

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

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

于 2010-04-17T15:14:49.847 回答
130

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

与律师讨论知识产权法以及您的法律选择是什么。“开源”并不意味着“人们可以阅读源代码”。相反,开源是一种特殊的许可模式,允许自由使用和修改您的代码。如果您不授予这样的许可,那么复制您的代码的人就属于违规行为,并且(在世界上的大多数地方)您可以选择法律来阻止他们。

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

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

于 2008-10-25T23:24:56.637 回答
50

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

有人提到 base64 来保证字符串的安全。这是一个可怕的想法。想要对您的代码进行逆向工程的人可以立即识别 Base64。他们要做的第一件事就是取消编码,看看它是什么。

于 2008-10-11T19:21:26.687 回答
45

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

为此,我在某种程度上加班时使用了几个选项:

  • YUI 压缩机。Yahoo! 的 JavaScript 压缩器在压缩代码方面做得很好,可以缩短加载时间。有一个小级别的混淆,效果相对较好。本质上,Compressor 将更改函数名称、删除空格并修改局部变量。这是我最常使用的。这是一个基于 Java 的开源工具。

  • JSMin是一个由 Douglas Crockford 编写的工具,旨在缩小您的 JavaScript 源代码。用 Crockford 自己的话来说,“JSMin 不会混淆,但会丑化”。它的主要目标是缩小源代码的大小,以便在浏览器中更快地加载。

  • 免费的 JavaScript 混淆器。这是一个基于 Web 的工具,它试图通过实际编码来混淆您的代码。我认为其编码(或混淆)形式的权衡可能会以文件大小为代价;但是,这是个人喜好问题。

于 2008-10-11T18:26:52.633 回答
27

我会做什么:

A.巨魔黑客!

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

这段代码是做什么的?

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

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. 这不是秘密的 javascript 代码

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

C创建一个很难显示的php文件,里面有真实的代码

这个php代码是什么?

  1. 检查正确的引荐来源网址(您的启动器的域/目录/代码)
  2. 检查自定义 HEADER
  3. 检查自定义 POST 变量

如果一切正常,它会向您显示正确的代码,否则会显示假代码或禁止 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 推荐人 =http://here.is/my/launcher.html

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

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

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

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

我不确定这是否有效,但我正在使用 chrome 并检查了 Elements、Resources、Network、Sources、Timeline、Profiles、Audits 但我没有找到上面的行。

注意 1:如果你在 chrome 中从 Inspect element->network 打开 Troll.php url,你会得到假代码。

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

编辑

启动器.html

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

巨魔.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=';}; ?>
于 2013-07-04T11:12:40.907 回答
20

解释语言的问题在于,您发送源代码以使它们正常工作(除非您有字节码的编译器,但话又说回来,反编译非常简单)。

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

于 2008-10-11T18:23:36.213 回答
19

试试JScambler。我最近试了一下,对它印象深刻。它为那些不太关心细节而只想快速完成它的人提供了一组带有预定义设置的混淆模板。您还可以通过选择所需的任何转换/技术来创建自定义混淆。

于 2010-06-08T20:35:32.097 回答
18

与我建议反对 YUI Compressor 的大多数其他答案相反;你应该使用谷歌关闭

不是因为它压缩得更多,但主要是因为它会捕获 javascript 错误,例如a = [1,2,3,];使 IE 失控。

于 2010-08-22T12:44:20.103 回答
12

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

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

于 2008-10-11T19:15:01.507 回答
11

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

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

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

于 2008-10-12T05:44:51.407 回答
10

您无法保护客户端代码:只需在 Google Chrome 上按 F12,暂停 javascript 执行,您将获得所有字符串,即使是加密的。美化并重命名变量,您将获得几乎原始代码。

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

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

于 2014-01-02T23:56:01.117 回答
5

我建议首先使用 YUI Compressor 之类的东西进行缩小,然后使用http://www.javascriptobfuscator.com/之类的东西将所有字符串和数字转换为 HEX 值

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

于 2011-04-15T23:27:39.727 回答
5

Dean Edward 的 Packer 是一个出色的混淆器,尽管它主要混淆代码,而不是代码中可能包含的任何字符串元素。

请参阅:在线 Javascript 压缩工具 并从下拉列表中选择 Packer (Dean Edwards)

于 2011-04-20T03:30:38.400 回答
4

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

于 2009-01-24T01:12:38.317 回答
4

我正在使用 Closure-Compiler 实用程序进行 java 脚本混淆。它缩小了代码并有更多的混淆选项。此实用程序可在以下 URL 的 Google 代码中获得:
关闭工具

但是现在我听到很多关于 UglifyJS 的消息。您可以找到 Closure Compiler 和 UglifyJS 之间的各种比较,其中 Uglify 似乎是赢家。
UglifyJS:一个快速的 Node.js 新 JavaScript 压缩器,与 Closure 相当

很快我就会给 UglifyJS 机会。

于 2011-07-22T19:26:44.197 回答
4

试试这个工具Javascript Obfuscator

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

于 2011-08-19T09:54:53.063 回答
4

我已经使用Jasob多年了,它无疑是最好的混淆器。
它具有高级 UI,但仍然直观且易于使用。
它还将处理 HTML 和 CSS 文件。

使用它的最佳方法是在所有私有变量前加上下划线之类的前缀,然后使用该sort功能将它们全部组合在一起并将它们作为混淆目标 检查。

用户仍然可以查看您的源代码,但是当您的私有变量_sUserPreferredNickNamea.

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

我不为 Jasob 工作,我从宣传他们中得不到任何好处,只是提供一些友好的建议。
缺点是它不是免费的,而且有点贵,但在与替代品叠加时仍然值得 - “免费”选项甚至没有接近。

于 2012-01-01T07:31:51.403 回答
4

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

于 2012-10-05T13:19:25.960 回答
3

作为一个 JavaScript/HTML/CSS 混淆器/压缩器,你也可以试试Patu Digua

于 2010-04-17T15:07:00.570 回答
2

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

于 2011-05-06T08:26:09.627 回答
2

您绝对应该考虑看看Obfuscriptor

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

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

于 2012-03-25T21:06:11.280 回答