Node.js защита кода

Я проверял, можно ли распространять закрытое приложение приложения node.js. Не клиентские Javascript файлы, а серверные файлы как коммерческий продукт. Я предполагаю, что обфускация/уклонение кода не обеспечит реальной конфиденциальности. Возможно, что-то вроде упаковки/компиляции исходного кода в двоичный файл может помочь. Возможно ли это?

Ответ 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);

Взглянув на исходный код v8 на странице deps/v8/include/v8.h, строка 639, функция компиляции возвращает:

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

Я не уверен, что подразумевается script, связанный с контекстом, но я бы сказал, что это не просто двоичный объект, который вы можете сохранить и перенести на другой компьютер, не передавая весь контекст.

EDIT: более глубокий взгляд на v8.h, также есть класс ScriptData, который предварительно компилирует script, чтобы сделать компиляцию быстрее и которая может использоваться с классом script, но script класс по-прежнему требует исходного источника при загрузке script. (Возможно, при печати ошибок он знает, где произошла ошибка.)

Таким образом, я не думаю, что это возможно без большой работы.

Ответ 2

Существует хороший метод, который вы можете попробовать - перекомпилируйте исходный код 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.

Ответ 3

Известно, что V8 полностью компилирует JavaScript и выполняет его. EncloseJS использует эту функцию, чтобы скомпилировать исполняемый файл из проекта node.js. EncloseJS является компилятором для node/io.js - он дает вам такую ​​же конфиденциальность, как классический компилятор.