【问题标题】:node.js code protectionnode.js 代码保护
【发布时间】:2011-11-07 17:46:24
【问题描述】:

我正在检查是否可以分发 node.js 应用程序封闭源代码。不是客户端 Javascript 文件,而是作为商业产品的服务器端文件。我想代码混淆/丑化不会提供真正的隐私。也许将源代码打包/编译成二进制可能会有所帮助。这可能吗?

【问题讨论】:

标签: node.js


【解决方案1】:

我对 NodeJS 和 v8 代码进行了一些搜索。

首先在 NodeJS 存储库中,我找到了在 src/node.cc 上执行的第一次加载源代码的位置,第 1128 行:

Local<Value> ExecuteString(Handle<String> source, Handle<Value> filename)

首先编译字符串(然后执行),使用:

Local<v8::Script> script = v8::Script::Compile(source, filename);

查看deps/v8/include/v8.h第639行的v8源代码,编译函数返回:

Compiled script object, bound to the context that was active
  when this function was called.  When run it will always use this
  context.

我不确定绑定到上下文的脚本意味着什么,但我认为它不仅仅是一个二进制对象,您可以保存并转移到另一台机器而无需转移整个上下文。

编辑:深入了解 v8.h,还有一个 ScriptData 类,它预编译脚本以使编译更快,并且可以与 Script 类一起使用,但 Script 类仍然需要加载脚本时的原始源。 (也许打印错误的时候,它知道错误的来源。)

总之,我认为不做太多工作是不可能的。

【讨论】:

    【解决方案2】:

    众所周知,V8 会在内部编译 JavaScript 并执行它。 EncloseJS 使用此功能从 node.js 项目中生成已编译的可执行文件。 EncloseJS 是 node/io.js 的编译器 - 它为您提供与经典编译器相同的隐私。

    【讨论】:

    • 您可能需要在回答中添加免责声明,因为您是 EncloseJS 的作者。然而,有趣的解决方案。
    【解决方案3】:

    有一个好方法可以试试——重新编译NodeJS源代码。

    打开nodejs src文件夹(nodejs-v0.xxx/lib/module.js),你会发现:

    // Native extension for .js
    Module._extensions['.js'] = function(module, filename) {
      var content = NativeModule.require('fs').readFileSync(filename, 'utf8');
      module._compile(stripBOM(content), filename);
    };
    

    添加新的扩展以满足您的需求。例如:

    // Native extension for .jse (encrypted js)
    Module._extensions['.jse'] = function (module, filename) {
        var content = stripBOM(NativeModule.require('fs').readFileSync(filename, 'utf8')).split('').reverse().join('');
        module._compile(content, filename);
    };
    

    然后重新编译nodejs,加密你的代码,把你的代码文件扩展名从xxx.js重命名为xxx.jse。

    【讨论】:

      猜你喜欢
      • 2019-01-27
      • 2014-06-22
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多