如何混淆(保护)JavaScript?[关闭]

IT技术 javascript obfuscation source-code-protection
2020-12-29 15:59:24

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

6个回答

混淆:

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

你也可以使用:

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

私有字符串数据:

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

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

边注:

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

仅供参考,可以在这里找到在线 YUI 压缩器:refresh-sf.com/yui
2021-02-09 15:59:24
如果浏览器必须对字符串值进行解密才能使用它们,那么加密字符串值只会比对它们进行 base64 编码带来的好处略多。原因是您还必须向浏览器提供加密密钥,而浏览器可以做的任何事情用户也可以。
2021-02-09 15:59:24
服务器进行进一步处理。
2021-02-21 15:59:24
当我使用 YUI Compressor 进行缩小时,我确保它使用“安全”的缩小方法,即保留分号--preserve-semi将私有变量重写为 a、b、c 等通常是安全的。我做的另一件事是让压缩器在代码中的每个分号后换行--line-break 0然后在生产中,如果出现错误,我至少有一个有效的参考线可供使用,并且可以在我的开发副本中找到该代码。否则,您只会在大量代码行上出现错误,并且不知道错误在哪里。
2021-02-25 15:59:24
我想补充一点,进行 base64 编码对安全性没有好处,因为它是一个简单的可逆过程。如果在客户端解密,即使对其进行加密也无济于事。确保字符串安全的唯一方法是让客户端只看到加密的字符串,并将其传递给
2021-03-07 15:59:24

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

JQuery 最近从 YUI Compresser 切换到 Closure Compiler,并且看到了“稳固的改进

我想指出的是,如果您使用 angular. 由于依赖注入和参数的重命名,这个工具不会真正起作用,除非有一个我看不到的复选框。
2021-02-14 15:59:24
@Madbreaks with Advanced Optimizations ( developers.google.com/closure/compiler/docs/api-tutorial3 ) 它将把代码缩小到混淆的程度。例如,为了简洁起见,可以重命名变量。
2021-02-18 15:59:24
有用的工具,但它不会混淆,这可能是其他人没有提到它的原因。
2021-02-25 15:59:24
谷歌也不是安全的选择
2021-02-25 15:59:24
是的,但最近他们离开了 Closure 编译器,现在正在使用 UglifyJS。使用闭包编译器压缩后的 JQuery 代码有问题
2021-02-26 15:59:24

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

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

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

在此处查看我关于混淆器的完整答案。

+1 律师,但这可能不适用于其他国家/地区。
2021-02-14 15:59:24
@Alerty 不要迟钝。这是关于惩罚那些未经许可复制文件以在自己的网站上使用的人。你说的是合同,不是许可证。合同需要双方同意,并且是一种让步。许可证授予您使用知识产权的权利。许可证是一种方式(所有者授予您东西),您不需要签名,因为您没有放弃任何东西。许多“软件许可协议”实际上是合同,因为它们超出了许可财产的范围,有时还包括起诉权等荒谬的事情。
2021-02-21 15:59:24
-1:我相信找到一个懂 JavaScript 的律师会很困难......更不用说找到“违规者”所需的费用和时间了。如果某人从未签署任何内容,他真的会违反隐藏在 HTML/JavaScript 文件中的许可证吗?+1 用于 AJAX 调用。
2021-03-01 15:59:24
律师可能比丢失的代码产生更多的成本/问题,仔细考虑并安排大量资金聘请律师!!
2021-03-04 15:59:24
@Alerty 1) 许可证基本上是关于授予使用受版权保护的材料。未经许可,您几乎无权使用它。您无需签署即可获得权利。许可证不同于合同。2a) 由于问题是关于人们在未经许可的情况下复制和使用 HTML/Javascript,许可证不是“埋葬”的,它就在被拿走的东西上。2b) 未经许可,您几乎无权使用他人受版权保护的材料。3)律师不需要懂Javascript,只要懂知识产权法。
2021-03-06 15:59:24

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

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

@Vivek:有点晚了,但我真正的意思是“服务器端代码”。可以不在浏览器中运行 javascript,而只在服务器上运行,但我不知道这有多普遍。
2021-02-17 15:59:24
无论我走到哪里,最常见的答案是“我怎样才能混淆我的 Javascript?” 是“你不应该担心,因为有人可以取消混淆它。” 这不是一个真正的答案。
2021-02-19 15:59:24
@Madbreaks:问题在于他的代码不开源。直接的技术答案是公认的,但更好的上下文答案(例如,您真正想要做什么?)是,IMO,您不能拥有非开源的客户端 javascript,因为每个人都有源,不管你如何混淆它。无论哪种方式,两个答案都在这里,人们可以阅读并从中受益。
2021-02-24 15:59:24
对。这绝不是回答“我如何混淆我的 JavaScript”。混淆不是一个抽象的概念,它是一个技术概念。操作员简单地问“如何?”
2021-02-28 15:59:24
@Travis:我没有说“你不应该担心”。我只是说如果你想要一个闭源程序,你不会想用客户端 javascript 编写它,因为你所做的任何混淆都不会阻止它被(很容易)逆向工程。
2021-03-03 15:59:24

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

为此,我在某种程度上使用了几种加班方式:

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

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

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

@SED 我不知道有一个程序员[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]至少[var1, var2,..]在一分钟内无法找到/替换一堆变量我可以在两分钟内去除丑陋、重新缩进和搜索/替换 var 名称。不,我比普通的 Jr. Dev 更聪明。简单的事实是,没有办法掩盖客户端 JS。你可以给自己买 5 分钟,MAX,但这没有用。这个东西真的只是为了卖给不知道添加“安全”代码的人。没有写过一行 JS 代码的人会买那种废话。
2021-02-10 15:59:24
它是关于统计的。有人在混淆和不混淆的情况下访问您的代码的门槛是多少?他们仍然可以访问,但门槛越高,人就越少。知道某事的人越少,那某事就越安全。标准的安全分类实践。
2021-02-14 15:59:24
@PeterR 在文本编辑器中搜索/替换将使您的生活变得更加难以阅读或逆向工程。它并不完美,但确实通过删除上下文线索增加了额外的烦恼/困难。大多数程序员都没有你那么聪明,这就是为什么它具有如此大的威慑力。
2021-02-16 15:59:24
@PeterR “我可以在两分钟内去除丑陋、重新缩进和搜索/替换 var 名称” ——当然,继续尝试在多遍缩小、混淆的 20MB 代码库包上进行即使使用原始的注释源代码也需要数周时间才能理解。更难的是,存在混淆工具,如果缩进、行等发生变化,它们会故意破坏您的代码。
2021-03-06 15:59:24
由于 Javascript 代码必须在客户端的机器上运行,因此不仅难以混淆到代码无法逆向工程而且不可能的程度
2021-03-08 15:59:24