我想创建一个非开源的JavaScript应用程序,因此我希望学习如何模糊我的JS代码?这可能吗?
混淆:
试试YUI Compressor.它是一个非常受欢迎的工具,由Yahoo UI团队构建,增强和维护.
您也可以使用:
谷歌闭包编译器
UglifyJS
私人字符串数据:
将字符串值保密是一个不同的问题,混淆不会带来太大的好处.当然,通过将您的源代码打包成乱码,缩小的混乱,您可以通过默默无闻来获得轻松的安全性.大多数情况下,您的用户正在查看源,并且客户端上的字符串值是供其使用的,因此通常不需要这种私有字符串值.
如果您确实拥有一个您从未希望用户看到的值,那么您将拥有几个选项.首先,您可以进行某种加密,在页面加载时解密.这可能是最安全的选择之一,但也可能是许多不必要的工作.您可能可以对某些字符串值进行base64编码,这会更容易..但是真正想要这些字符串值的人可以轻松解码它们.加密是真正阻止任何人访问您的数据的唯一方法,并且大多数人发现它比他们需要的更安全.
边注:
众所周知,Javascript中的混淆会导致一些错误.混淆器正在变得更好一些,但许多服装决定他们从缩小和gzipping中看到足够的好处,并且混淆的额外节省并不总是值得的.如果您正在尝试保护自己的源代码,也许您会认为这是值得的,只是为了让您的代码更难阅读.JSMin是一个很好的选择.
我很惊讶没人提到Google的Closure Compiler.它不只是缩小/压缩,它分析以查找和删除未使用的代码,并重写以实现最大限度的缩小.它也可以进行类型检查,并会警告语法错误.
JQuery最近从YUI Compresser切换到Closure Compiler,看到了" 坚实的改进 "
混淆永远不会真正起作用.对于任何真正想要获取代码的人来说,这只是一个减速带.更糟糕的是,它可以防止用户修复错误(并将修复程序发回给您),并使您更难以诊断现场问题.浪费你的时间和金钱.
与律师讨论知识产权法以及您的法律选择."开源"并不意味着"人们可以阅读来源".相反,Open Source是一种特定的许可模式,允许自由使用和修改代码.如果您没有授予此类许可,那么复制您的代码的人将被违反,并且(在世界上大多数地方)您有合法的选择来阻止它们.
您可以真正保护代码的唯一方法是不发货.移动重要的代码服务器端并让您的公共Javascript代码对它进行Ajax调用.
请在此处查看关于混淆器的完整答案.
您可以随心所欲地混淆javascript源代码,但只需要将所有源代码实际运行在客户端计算机上就可以反向工作...我能想到的最佳选择是完成所有处理使用服务器端代码,javascript所做的所有客户端代码都是将处理请求发送到服务器本身.否则,任何人都将始终能够跟踪代码正在执行的所有操作.
有人提到base64来保持字符串安全.这是一个糟糕的主意.Base64可以立即被想要对代码进行反向工程的人员识别.他们要做的第一件事就是取消编码,看看它是什么.
有许多JavaScript混淆工具可以免费获得; 但是,我认为重要的是要注意,很难将JavaScript混淆到无法进行逆向工程的程度.
为此,我在某种程度上加速了以下几种选择:
YUI压缩机.雅虎的JavaScript压缩器可以很好地缩短代码,从而缩短加载时间.有一小部分混淆效果相对较好.实质上,Compressor将更改函数名称,删除空格并修改局部变量.这是我经常使用的.这是一个基于Java的开源工具.
JSMin是Douglas Crockford编写的一个工具,旨在缩小您的JavaScript源代码.用克罗克福德自己的话来说,"JSMin并没有混淆,但它确实是丑化的." 它的主要目标是缩小源的大小,以便在浏览器中加快加载速度.
免费JavaScript混淆器.这是一个基于Web的工具,它试图通过对代码进行实际编码来模糊代码.我认为其编码(或混淆)形式的权衡可能以文件大小为代价; 然而,这是个人偏好的问题.
我会做什么:
A. Troll黑客!
这将是我的假/混淆秘密javascript代码LAUNCHER的第二部分.您在源代码中看到的那个.
这段代码是什么?
加载真实代码
设置自定义标头
发布自定义变量
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.稍微混淆代码
那是什么?
这与base64中的代码相同
这不是SECRET的javascript代码
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C使用里面的真实代码创建一个难以显示的php文件
这个php代码是什么?
检查正确的引荐来源(您的启动器的域/目录/代码)
检查自定义HEADER
检查自定义POST变量
如果一切正常,它将显示正确的代码,否则为假代码或禁止ip,关闭页面..无论如何.
base64 referrer = http://here.is/my/launcher.html
SECRET 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并检查元素,资源,网络,来源,时间轴,配置文件,审核但我没有找到上面的行.
注意1:如果你打开来自Inspect element-> network in chrome的Troll.php网址你会得到假代码.
note2:整个代码是为现代浏览器编写的.polyfill需要更多代码.
编辑
launcher.html
Troll.php
试试JScrambler.我最近给了它一个旋转,并对它印象深刻.它提供了一组用于混淆的模板,具有预定义的设置,适用于那些不关心细节并希望快速完成任务的人.您还可以通过选择所需的任何转换/技术来创建自定义混淆.
解释语言的问题在于你发送源代码以使它们工作(除非你有一个编译器来进行字节码编码,但是再次,反编译是非常简单的).
因此,如果您不想牺牲性能,则只能对变量和函数名称进行操作,例如.用a,b ... aa,ab ...或a101,a102等替换它们.当然,尽可能多地移除空间/换行符(这就是所谓的JS压缩器所做的).
如果你必须对它们进行加密并实时解密,那么混淆字符串会受到性能影响.另外一个JS调试器可以显示最终值......
与大多数其他答案相反,我建议反对YUI Compressor; 你应该使用Google Closure.
并不多,因为它压缩更多,但主要是因为它会捕获javascript错误,如a = [1,2,3,];
使IE变得混乱.
一个非开源的基于Javascript的应用程序是相当愚蠢的.Javascript是一种客户端解释语言.混淆不是很多保护..
JS混淆通常是为了减少脚本的大小,而不是"保护"它.如果您处于不希望公开代码的情况,Javascript就不是正确的语言.
周围有很多工具,但大多数都在其名称中使用"压缩器"(或"缩小器")这个词是有原因的.
我可以推荐Patrick J. O'Neil的JavaScript Utility.它可以混淆/压缩和压缩,它们似乎相当不错.也就是说,我从未尝试将其集成到任何类型的构建脚本中.
至于混淆与缩小 - 我不是前者的忠实粉丝.它使调试变得不可能(第1行的错误......"等待,只有一行")并且它们总是需要时间来解压缩.但如果你需要......好吧.
您无法保护客户端代码:只需在Google Chrome上按F12,暂停执行javascript即可获得所有字符串,即使是加密的字符串.美化它并重命名变量,你几乎可以获得原始代码.
如果你正在编写服务器端javascript(即NodeJS)害怕有人入侵你的服务器并想让黑客工作更加困难,给你更多时间来获取你的访问权限,那么使用javacript编译器:
您需要在高级编译中使用Closure Compiler,因为它是重命名所有变量的唯一工具,即使这些变量在多个文件/模块中使用.但它只是有一个问题:它只有在你编写它的编码风格时才有效.
我建议先使用YUI Compressor之类的东西进行缩小,然后使用类似http://www.javascriptobfuscator.com/的内容将所有字符串和数字转换为HEX值.
有了这个,代码几乎无法理解,我认为在这个阶段,黑客需要更多的时间重新编写你的代码,而不是从头开始重新编写代码.重写和克隆是你实际上无法阻止的.毕竟我们是自由人!
Dean Edward的Packer是一个优秀的混淆器,虽然它主要模糊代码,而不是代码中可能包含的任何字符串元素.
请参阅:在线Javascript压缩工具, 然后从下拉列表中选择Packer(Dean Edwards)