簡體   English   中英

node.js代碼保護

[英]node.js code protection

我正在檢查是否可以分發node.js應用程序的閉源。 不是客戶端Javascript文件,而是服務器端文件作為商業產品。 我認為代碼混淆/ uglification不會提供真正的隱私。 也許將包裝/編譯源代碼編譯成二進制文件可能有所幫助。 這可能嗎?

我做了一些搜索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源代碼,Compile函數返回:

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類仍然需要原始源代碼加載腳本。 (可能在打印錯誤時,它知道錯誤的來源。)

總之,如果沒有太多工作,我認為這是不可能的。

您可以嘗試一種很好的方法 - 重新編譯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。

眾所周知,V8在內部編譯JavaScript並執行它。 EncloseJS使用此功能從node.js項目中生成已編譯的可執行文件。 EncloseJS是node / io.js的編譯器 - 它提供與經典編譯器相同的隱私。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM