63

我想在我的下一个项目中使用 node.js,但是我的老板不喜欢我们的竞争对手可以阅读源代码。

有没有办法保护 JavaScript 代码?

4

14 回答 14

71

您可以使用节点的 NativeExtension 来完成此操作

您将拥有一个boostrap.js为 .jse 文件添加扩展处理程序的文件

// register extension
require.extensions[".jse"] = function (m) {
 m.exports = MyNativeExtension.decrypt(fs.readFileSync(m.filename));
};

require("YourCode.jse");

YourCode.jse将是您的源代码的加密版本(解密的密钥不会是纯文本的任何地方,因为解密过程发生在本机扩展中)。

现在,您的 NativeExtensionsdecrypt函数将源代码转换回 javascript。只需让您的构建过程创建.jse所有文件的加密版本并将其发布给您的客户。他们还需要本机扩展,但现在您已经使修改代码变得更加困难,而无需太多努力。您甚至可以让本地扩展呼叫回家并检查许可证信息以帮助防止盗版(请记住,这不会阻止盗版,没有解决方案)。

于 2012-02-06T16:33:50.150 回答
18

只需包含许可协议并向他们提供源代码即可。无论如何,他们可能想要自定义它。

于 2011-05-10T15:07:55.083 回答
11

由于我刚刚在 80 多个文件中完成了一个巨大的纯 Nodejs 项目,因此我遇到了与 OP 相同的问题。我至少需要为我的辛勤工作提供最低限度的保护,但 NPMjs 操作系统社区似乎没有涵盖这个非常基本的需求。加盐到伤害 JXCore 包加密系统上周在几个小时内被破解所以回到混淆......

所以我创建了完整的解决方案,处理文件合并、丑化。您也可以选择不合并指定的文件/文件夹。然后将这些文件复制到合并文件的新输出位置,并自动重写对它们的引用。

node-uglifier 的 NPMjs 链接

node-uglifier 的 Github repo

PS:如果人们能做出贡献,我会很高兴。这是小偷和像你这样努力工作的程序员之间的战争。让我们加入我们的力量,增加逆向工程的痛苦!

于 2014-07-07T08:33:55.503 回答
9

非常清楚,客户端Javascript(从远程服务器下载到标准Web浏览器中)无论您如何混淆它,都无法防止查看和/或修改,因为原始源的重建(“去混淆”)在技​​术上是微不足道的。(Javascript混淆只是广泛使用的安全误称“通过默默无闻的安全”的另一个例子。)

如果您希望使用 Javascript 和 Node.js 来提供受保护的“产品”(在这种情况下,它是需要安装在您公司无法控制的服务器上的应用程序或服务),您也不能将其作为唯一可用的选项来保护你(混淆)没有提供这样的保护。

应该注意的是,即使您的产品以二进制可执行文件的形式提供,也不能保证您可以保护其包含的知识产权,因为任何二进制文件都可以被反编译成可理解的格式。在这种情况下,基于将低级机器代码(由反编译提供)转换为现代编程语言使用的高级逻辑结构所需的过多资源(时间/专业知识),我们享有一定程度的安全性。(这来自曾经将 CP/M 反编译成对其内部设计的理解。;)

然而,一切都没有丢失:如果我们假设可以以编程方式保护知识产权(陪审团仍然没有解决这个问题),那么有一种方法可以以安全的方式提供基于 Node.js 的产品,但它不适用于技术上没有冒险,因为它需要对 Node.js 源代码进行大量重构(以添加对加密安全库的支持并删除 - 或以其他方式保护 - 您的专有库的对象反射。)

于 2011-05-10T18:42:23.617 回答
6

服务器端 javascript 代码是完全闭源的。没有人可以阅读它。

客户端 javascript 代码是完全开源的。每个人都可以阅读它。

对于后者,除了 RoR、ASP.NET、PHP 等,你什么也做不了。

除非您公开提供,否则实际的服务器代码是关闭的。

如果您制作图书馆并试图将其作为 3rd 方来源出售,那么它是开放的并且可能被盗。当然,您可以起诉他们侵犯版权。

有很多像extjs这样的大公司出售可能被盗的库,这就是为什么他们实际上卖给你的是代码和支持服务。

大多数建立在节点上的商业项目都是服务。

于 2011-05-10T14:07:36.330 回答
5

JXcore(node.js 0.11.X 发行版)有自己的 JX 打包功能,可以保护源代码和资产。您甚至可以选择是否可以从其他应用程序中使用该特定包。(独立 OR 库)

假设您有许多 JS 等文件,并且模块的入口点类似于;

exports.doThis = function() { ...... };

如果直接调用下面的方法,编译成JX包,源代码是安全的。

jxcore.utils.hideMethod(exports.doThis);

这是(方法隐藏)只需要入口文件,因为调用应用程序无法访问所有其他子 JS 文件。

您需要 JXcore 来运行 JX 包。

更多信息可从JXcore 获得

于 2014-01-29T11:52:24.887 回答
4

您可以使用EncloseJS - node.js 项目的编译器。它确实将 JavaScript 编译为本机代码,并且您的源代码不包含在二进制文件中。

于 2015-02-16T17:30:50.513 回答
4

将你的核心逻辑打包成模块。这些模块可以构建然后通过谷歌的closures运行。作为构建过程的一部分,您甚至可以将其作为Grunt 任务来执行。

这是一个老问题,但值得指出。注意:您所做的任何事情都不会真正隐藏您的代码,但也不会通过 .Net (C#) 或 Java 发布任何内容。一般来说,简单地使用像 uglify 或闭包这样的工具就足够了。通过模块化和使用闭包,您实际上可以进行很多否则会很困难的优化。

于 2012-12-31T20:23:14.857 回答
3

你可以使用nodejs 的packer来混淆你的脚本......

于 2011-05-10T15:02:28.983 回答
1

您无法绝对确定没有人能够阅读您的代码。但是,您可以使用混淆或缩小,这会使解码代码变得更加困难。混淆器/压缩器的一个示例是 Google 的JavaScript闭包编译器。

于 2011-05-10T14:11:57.413 回答
1

有人试过nexepkg吗?

这些似乎是一个不错的选择。将 Node.js 应用程序编译为单个可执行文件的命令行实用程序。

于 2018-03-17T04:53:08.297 回答
1

检查这篇文章

我将向您展示如何“真正”将 Node.js (JavaScript) 代码编译为 V8 字节码。这允许您以比混淆或其他不太有效的技巧更好的方式隐藏或保护您的源代码(例如使用密钥加密您的代码,该密钥将嵌入您的应用程序二进制文件中,这就是我说“真正”的原因以上)。

因此,使用 bytenode 工具,您可以分发 JavaScript 文件的二进制版本 .jsc。您还可以使用 Browserify 捆绑所有 .js 文件,然后将该单个文件编译为 .jsc。

检查Github 上的bytenode 存储库

于 2019-12-06T21:35:37.480 回答
0

Pkg comes in handy.

To be sure sources aren't included in the generated output file, verify that package.json doesn't specify a license (such as "license": "ISC") that would force inclusion of sources. See https://github.com/vercel/pkg/issues/190 for details.

于 2021-02-13T16:23:53.660 回答
-4

我有个主意。保护一个cppjava应用程序而不是js。

  1. 以加密格式包装您的代码,并将其编译为utf-8 文件资源。
  2. 使用您的cpporjava应用程序将整个文件上传到linux pcor arm computer,确保您有一个强密码或关闭ssh port或禁用视频端口并仅通过 web 浏览 linux pc。
  3. linux pc中有一个cpp程序可以解密文件。
  4. 开发一个网络服务器来控制你的 linux 电脑。

所以这很像一个黑匣子,客户端不能对你的代码做任何事情。

于 2016-05-26T02:13:11.890 回答