node.js - 代码保护?

Van*_*ing 53 javascript source-code-protection node.js

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

有没有办法保护JavaScript代码?

Chr*_*ini 63

您可以使用NativeExtension for node完成此操作

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

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

require("YourCode.jse");
Run Code Online (Sandbox Code Playgroud)

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

现在,您的NativeExtensions decrypt函数将源转换回javascript.只需让您的构建过程创建.jse所有文件的加密版本,然后将其发布给您的客户.他们还需要原生扩展,但现在你已经更难以修改代码了.您甚至可以将原生分机呼叫置于家中并检查许可证信息以帮助防止盗版(请记住,这不会阻止盗版,没有解决方案).

  • 这不安全.密钥隐藏在二进制模块中并不重要.一旦客户端解密并加载了您的模块,他们就可以简单地调用console.log(yourmodule.yourmethod.toString())并打印出您的源代码. (44认同)
  • @ChrisT并不总是关于实用性..一般来说,在分发之前运行uglify就足够了,即使使用JS美化器,你也不会得到注释或原始变量名,这真的使得反向工程变得更难.---即便如此,任何能够做到这一点的人都可能已经自己写完了. (10认同)
  • 如果有人感兴趣的话,我已经将 @Chris T 的想法封装到了一个可用的 [github 存储库](https://github.com/pawelsledzikowski/jse-decryptor) 中。然而,请注意,这仍然是锁上前门并将钥匙留在户外地毯下 - 看起来像是锁着的,但实际上并非如此。 (2认同)

Mik*_*ord 17

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

  • 对我来说,这是一个好主意,但对我的老板来说,这太危险了.如果世界变得那么复杂...... (6认同)
  • 这是正确的答案,IMO.没有万无一失的方法来阻止客户做你害怕的事情.如果您对使其变得更加困难感兴趣,可以尝试本线程中提出的一些混淆解决方案,或者查看v8的堆快照功能.但是,许可协议至关重要. - 刚刚意识到这是'11不是'12,哦,好吧!希望它成功:) (6认同)

use*_*976 10

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

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

节点uglifier的NPMjs链接

节点uglifier的Github repo

PS:如果人们愿意做出更好的贡献,我会很高兴的.这是小偷和像你一样的辛勤工作者之间的战争.让我们加入我们的力量,增加逆向工程的痛苦!


Rob*_*sch 9

要非常清楚,无论您如何对原始源的重建("去混淆")进行模糊处理,都无法保护客户端Javascript(从远程服务器下载到标准Web浏览器中)不被查看和/或修改在技​​术上是微不足道的.(Javascript混淆只是广泛使用的安全误称"通过默默无闻的安全性"的另一个例子.)

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

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

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

  • 虽然这是真的,但应该说,如果你可以使用requirejs对使用say coffeescript编写的产品进行逆向工程,然后编译成单个js,然后运行封闭...从加密到自定义扩展,使用暴露模块通过存根加载...您可能没有*需要*对其进行反向工程以复制任何给定的功能. (2认同)

Ray*_*nos 5

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

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

对于后者,你什么都不做,但同样适用于RoR,ASP.NET,PHP等.

除非您公开使其可用,否则将关闭实际的服务器代码.

如果您制作图书馆并尝试将其作为第三方来源出售,那么它就会被打开并且可能被盗.当然,您可以起诉他们侵犯版权.

有各种大公司,如extjs,它们可以销售可能被盗的图书馆,这就是为什么他们实际上卖给你的是代码和支持服务.

大多数基于节点的商业项目都是服务.

  • 我们想在产品中使用它.当竞争对手安装此产品时,他将看到源代码. (6认同)
  • @FlashFan如果他们违反你的_copyright_或者他们使用你的代码没有_permission_那么你可以_sue_他们.欢迎来到盗版. (2认同)

Nur*_*tin 5

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

假设您有许多JS等文件,并且您的模块的入口点是这样的;

exports.doThis = function() { ...... };
Run Code Online (Sandbox Code Playgroud)

如果你只是调用下面的方法并将其编译为JX包,源代码将是安全的.

jxcore.utils.hideMethod(exports.doThis);
Run Code Online (Sandbox Code Playgroud)

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

您需要JXcore来运行JX包.

有关更多信息,请访问JXcore

  • 请注意:jxcore不保护源(至少,不再):https://github.com/jxcore/jxcore/issues/857#event-579583412 (2认同)

小智 5

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

  • EncloseJS 的许可证不允许商业用途。 (4认同)
  • PKG 似乎没有隐藏任何内容,您可以在 VIM 中打开二进制文件并查看所有源代码。只是我的经验。 (3认同)
  • 该网站的第一个功能是:“制作没有来源的应用程序的商业版本”。而且,它是付费/订阅产品,所以看起来他的意图是商业用途。 (2认同)