【问题标题】:How can I encrypt JavaScript code so that it's not decryptable?如何加密 JavaScript 代码使其不可解密?
【发布时间】:2011-01-04 21:10:26
【问题描述】:

我有一些 JavaScript 代码需要加密,但我想确保没有人可以解密它。

我可以使用哪些工具来做到这一点?

-- 编辑--

我仍然想在我的网站上运行代码,我只是想确保没有其他人可以解密代码。

【问题讨论】:

  • 碰巧,你还想运行代码吗?我的意思是,您希望浏览器能够解密它吗?
  • 如果你还没有写过你的javascript,我认为GWT是相当难以辨认的。
  • 是的,基本上我将在我的网站上运行代码,但我想确保没有其他人可以使用它并在他们的网站上运行它。为此,我将包含在运行脚本之前仔细检查域的代码,但显然我需要对其进行加密,否则他们只能更改域名。
  • 您要查找的术语是混淆,而不是加密。
  • 这不仅愚蠢而且不可能,您甚至可能不想或不需要这样做。您希望通过使您的源代码不可读来实现什么?你想保护什么,你想保护谁?很有可能,这是一种想象的威胁,而不是真正的威胁。

标签: javascript encryption


【解决方案1】:

Javascript 代码在浏览器中执行,即在客户端,这意味着它必须在客户端未加密时可用。

你能做的“最好的”可能是缩小它,这会使它更难理解——还有一点 obfuscation 也可能这样做——即使有人真正有动力仍然能够阅读它.

例如YUI Compressor,它可以缩小和混淆 JS 代码。

【讨论】:

  • 缩小的部分价值在于,即使真正敬业的人可以看到代码流,他们仍然无法弄清楚变量“a”或“b”是什么意思.
  • 但受虐狂将能够分析代码并理解它。
  • 有在线代码格式化程序可以“取消缩小”代码,因此缩小不会以任何方式保护代码...
  • @Šime Vidas - 他们所能做的就是改进格式。他们无法弄清楚一个名为 a 的变量代表什么并有用地命名它 - 除非计算机在我打盹时获得了感知。
  • @Dominic - 我指的是“缩小它,这将使它更难理解”。缩小不会使代码更难理解。
【解决方案2】:

如果您真的想加密它以便其他人无法解密它,您可以使用任意数量的加密之一。例如,要手动执行,您可以使用TrueCrypt;或以编程方式执行此操作,请使用most languages 中提供的加密库。

但是,如果您真正要问的是如何混淆代码以使任何人都无法对其进行逆向工程,那么答案是:您不能,不是在 Javascript 或任何其他语言中语言。你能做的最好的事情就是让逆向工程师更难阅读;为此,有许多工具:

【讨论】:

    【解决方案3】:

    没有办法做到这一点。您可以隐藏它并在其中包含一些域检查代码。或者,您可以使用检查引用域的服务器端脚本来提供它。

    【讨论】:

    • 谢谢丹尼尔。如果我隐藏它并拥有域检查代码,人们是否能够解密它并更改它检查的域?
    • 是的,他们会......模糊基本上意味着使用奇怪的变量/函数/类名,并删除所有换行符,以便整个 javascript 都在一行上。
    • 由于它是在客户端运行的,如果他们能够对其进行解码,他们可以轻松地删除域检查。下面的一些混淆代码的想法会有所帮助,但这主要是徒劳的,因为代码是在浏览器中解释/运行的。
    • 他们甚至不需要删除域检查;好的旧“查看源代码”和复制/粘贴就可以了。
    【解决方案4】:

    我认为您将 加密编译的二进制文件 混淆了。

    甚至诸如 Microsoft Office 或 Adob​​e Photoshop 之类的商业闭源软件都没有经过加密来分发。但是它们被编译成本机机器码,这使得它们很难进行逆向工程。

    JavaScript 没有编译后的二进制文件。但是,随着越来越多的浏览器转向字节码编译以实现更快的性能,我们可能有一天会拥有编译好的 JavaScript 源格式。也许,类似于 Python 的 .py.pyc 文件,也许我们会有一个 .jsc 或 JavaScript 编译文件,它可以二进制形式传递给浏览器,在其 JavaScript 虚拟机中运行。

    但目前还没有这样的东西。即使确实如此,这也只是一种更强烈的混淆。混淆可以防止随意复制和共享,但如果您需要真正保护您的知识产权,移动逻辑服务器端

    【讨论】:

      【解决方案5】:

      没有办法这样做,因为在一天结束时,代码仍然必须在客户端计算机上运行,​​未加密,这意味着解密代码的例程必须与加密代码一起发送。你把锁和钥匙都交给了他们,他们所要做的就是转动。

      最好的办法是通过混淆器运行它,但即便如此,也不是有人无法自己重写它而无需尝试阅读您的代码。

      【讨论】:

        【解决方案6】:

        你想要的在理论上和实际上是不可能的。人们会在这里告诉你这是不可能的,你可能会想“嗯,那是因为没有人足够努力”。不,这是不可能的,就像在线性或恒定时间内计算第 n 个素数是不可能的一样。就像停止问题无法解决一样,这是不可能的。 “2+2不等于5是什么意思?你还不够努力!”

        这不仅是不可能的,而且想要这种东西的动机通常是被误导的。试图使用技术来解决根本上属于法律问题的问题总是一个根本性的错误。也许您想保护您的代码免受“盗版”或竞争对手的侵害?你不太可能写过特别值得偷的东西,但如果你写过,并且你不想让别人偷,那么你唯一真正的办法就是法治。

        但是,在更大的层面上,您的问题不太可能是竞争对手或盗版者窃取您的代码。您的问题将是面向业务的:通过生产优质产品、合适的价格和充分的营销来获得受众。你这样做是对的,有人窃取你的代码并不重要。你做对了,拥有“正宗原创”似乎有真正的价值。事实上,如果你将你的东西开源,它只会真正帮助你,因为你有一大群感兴趣的业余爱好者可能会为你免费工作。盗版和逆向工程实际上是天赐之物,因为这意味着人们对您的产品有足够的兴趣想要改进它。最好的办法是尽你所能让这种情况发生。

        如果您的业务确实依赖于对 javascript 保密,那么您在第一阶段的业务计划中基本上犯了一个错误。

        如果您的企业正在销售 javascript 库(存在这样的东西!),那么您的情况并不比任何其他软件销售商差。最好的办法是将其推销给诚实的企业,这些企业可以毫无问题地给你钱。盗版您的东西的人无论如何都无意付钱给您,而且他们的根本劣势是他们没有得到您的技术支持或定期维护更新。

        如果这不是商业努力,那么我真的不知道你为什么要打扰。适当的信用?

        【讨论】:

          【解决方案7】:

          虽然没有实际加密,但 Yahoo 的 YUI Compressor 会压缩和混淆您的 JavaScript 以供正常使用,并提供比 JSMin 更好的压缩。

          【讨论】:

          • 唯一的问题是之后代码经常无法工作。我试过了:(
          • 那是因为您需要先通过 JSLINT 运行您的代码,并使其通过 JSLINT 测试。由于标准(宽容)JS 解释器不会抱怨的代码中的错误,代码会因缩小而失败。主要是分号不足。
          【解决方案8】:

          Microsoft 曾经提供 Script Encoder 来对您的 JavaScript(以及 ASP 和 VBScript 等)进行编码,但编码后的脚本只能在 Internet Explorer 中使用,所以这是一个很大的禁忌 (link)

          现在只有混淆是一种选择。但是你可以使用Online JavaScript Beautifier 之类的工具来打破任何混淆,所以你运气不好。你可以最小化,你可以混淆,但你真的不能隐藏你在做什么。

          最好的最小化器/混淆器可能是Google Closure Compiler - 它非常先进,可能会使您的代码变得难以理解。

          【讨论】:

            【解决方案9】:

            您正在寻找的是混淆,而不是加密。有诸如JSMinYUI Compressor 之类的工具会使您的代码非常不可读,以至于没有人想尝试理解它。但是,没有任何方法,这样别人就无法将其复制并粘贴到他们自己的网站上并在那里运行。老实说,我不会担心它,因为你会浪费时间试图保护一些无法保护的东西。如果可能,请尝试将所有“重要”逻辑放在服务器端,因为这是唯一万无一失的方法。如果浏览器可以访问它,那么其他任何人都可以访问它。

            【讨论】:

              【解决方案10】:

              使用这个工具:Javascript Obfuscator https://javascriptobfuscator.com/Javascript-Obfuscator.aspx

              【讨论】:

                【解决方案11】:

                我认为您不需要加密,除非您要编写可以解密 javascript 的浏览器扩展。

                我认为 GWT,甚至 jsmin 可以充分压缩/混淆您的 javascript 以供正常使用。

                如果您想将一些客户端代码绑定到您的网站,您可能需要考虑某种随机握手,该握手依赖于服务器端方法来“验证”javascript。我什至不知道这是否可行。

                【讨论】:

                  【解决方案12】:

                  这正是 DRM:您为用户提供了一把锁,同时也是它的钥匙,并期望能够说出他们可以用它做什么。

                  这在理论上是不可能的:如果他们的计算机可以执行代码,那么它必须在那里未加密。

                  这实际上也是不可能的:看看每个在 Linux 机器上观看 DVD 的人,看看你能取得多大的成功。

                  【讨论】:

                    【解决方案13】:

                    截至 2021 年最成熟的 Javascript 混淆器 here,可通过 npm 获得。

                    对于许多声称不需要/不应该做或者不是一个好的做法的人来说,他们还没有真正了解这个 repo 上的明星数量所反映的主题的市场动态。

                    obfuscator.io 是一个很好的用户界面,可以轻松使用它

                    对于许多声称不需要/不应该做或者不是一个好的做法的人来说,他们还没有真正了解这个 repo 上的明星数量所反映的主题的市场动态。

                    【讨论】:

                      【解决方案14】:

                      唯一的选择是运行逻辑服务器端。 如果您使用的是 django,则可以使用中间件,甚至可以使用 views.py 文件来运行逻辑。客户端只会收到 HTML。 正如人们所指出的,混淆对代码的可读性影响很小,因为有决心的人会读出来。

                      【讨论】:

                        【解决方案15】:

                        您应该寻找一种 JavaScript 保护技术,该技术提供混淆以及允许您将代码锁定到某些域的环境检查。然后,您还可以添加额外的运行时保护,使某人更难对代码进行逆向工程并尝试解除这些保护。

                        查看guidelines from OWASP 关于逆向工程和混淆的信息。最好依靠这些经过同行评审的指南来避免对混淆和加密的任何误解。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2010-12-13
                          • 2023-04-05
                          • 2011-01-03
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多